onshape <<
Previous Next >> VirtualBox
CoppeliaSim
coppelia sim (V-rep)導入模型並模擬
模型由40723147繪製
1.開啟coppelia sim 點選 File >> Import >> Mesh... ,導入模型檔案(小組繪製模型為STL檔)
2.將導入的模型依照旗子母關係擺放

3.新增節點,右鍵點選車輪 >> Add >> Joint >> Revolute

4.將Joint移動至輪胎與輪軸銜接處(四顆輪胎都要做)

5.調整車子設定,在零件的圖示上 用左鍵快速點及兩下 >> 點選 show dynamic properties dialog >> 勾選 Body is respondable 和 Body is dynamic (車身和車輪)

6.調整Joint設定,在零件的圖示上 用左鍵快速點及兩下 >> 點選 show dynamic properties dialog >> 勾選 Motor enabled 並給定速度

7.調整後按下star simulation 進行模擬

❈皮膚概念
對CoppeliaSim來說,外部導入的模型(STL檔),僅是皮膚,故無法對其動作做控制,需要先建立實體模型(在CoppeliaSim建立基本形狀),再把皮膚(STL檔)貼上
對模型加入腳本並編寫程式進行控制
1.對車身零件點右鍵 點選Add >> Associated scrip >> Non threated

2.用左鍵快速點及兩下圖示

於開啟的視窗即可開始編寫程式

Remote API
用Remote API取得遠端模擬影像
練習: ( CoppeliaSim_4_Self_Driving_Car_Simulation.7z )
小組模型:(尚無法控制方向)
參考老師網頁進行設置:
http://mde.tw/cd2020pj1/content/RemoteAPI.html
http://mde.tw/cd2020pj1/content/Self-driving%20car%20ex.html
於車子上建立sensor ,命名為cam_f

對其參數進行設定:


在camera加入腳本

腳本中加入:
simRemoteApi.start(19999)
car_model.py(car_model.py無模型,ttt)
# -*- coding: utf-8 -*-
"""
Created on Tue Jan 06 22:00:39 2015
@author: Karan Vivek Bhargava
"""
#Import Libraries:
import vrep #V-rep library
import sys
import time #used to keep track of time
import numpy as np #array library
import cv2
import imutils
# Model for the car with two variables throttle and steering
class CarControl():
def __init__(self, clientID, printFlag = False):
self.clientID = clientID;
# retrieve motor handles
errorCode, self.steer_handle = vrep.simxGetObjectHandle(self.clientID, 'steer_joint', vrep.simx_opmode_oneshot_wait);
errorCode, self.motor_handle = vrep.simxGetObjectHandle(self.clientID, 'motor_joint', vrep.simx_opmode_oneshot_wait);
errorCode, self.fl_brake_handle = vrep.simxGetObjectHandle(self.clientID, 'fl_brake_joint', vrep.simx_opmode_oneshot_wait);
errorCode, self.fr_brake_handle = vrep.simxGetObjectHandle(self.clientID, 'fr_brake_joint', vrep.simx_opmode_oneshot_wait);
errorCode, self.bl_brake_handle = vrep.simxGetObjectHandle(self.clientID, 'bl_brake_joint', vrep.simx_opmode_oneshot_wait);
errorCode, self.br_brake_handle = vrep.simxGetObjectHandle(self.clientID, 'br_brake_joint', vrep.simx_opmode_oneshot_wait);
errorCode, self.camera_f_handle = vrep.simxGetObjectHandle(self.clientID, 'cam_f', vrep.simx_opmode_oneshot_wait);
vrep.simxGetVisionSensorImage(self.clientID, self.camera_f_handle, 0, vrep.simx_opmode_streaming)
print('Received Handles...');
self.factor = 30/(2.68*3.6);
self.max_throttle = 19; # Kmph
self.max_reverse_throttle = -19; #Kmph
self.max_steer = 30; # Degrees
self.printFlag = printFlag;
# Self test the camera
print('Setting up the camera system...');
self.lastFrame = None;
err = 0;
while(err != 1):
err, self.lastFrame = self.get_image();
print('Camera setup successful.')
def set_throttle(self, target_speed):
if(target_speed > self.max_throttle):
target_speed = self.max_throttle;
elif(target_speed < self.max_reverse_throttle):
target_speed = self.max_reverse_throttle;
if(self.printFlag):
print('Setting throttle to', target_speed);
speed = target_speed * self.factor;
errorCode = vrep.simxSetJointTargetVelocity(self.clientID, self.motor_handle, speed, vrep.simx_opmode_streaming);
def set_steering(self, steer_pos):
if(abs(steer_pos) > self.max_steer):
if(steer_pos > 0):
steer_pos = self.max_steer;
else:
steer_pos = -self.max_steer;
if(self.printFlag):
print('Setting steering to', steer_pos);
# Convert to radians
steer_pos = np.deg2rad(steer_pos);
errorCode = vrep.simxSetJointTargetPosition(self.clientID, self.steer_handle, steer_pos, vrep.simx_opmode_streaming);
def get_info(self):
# Check velocity
err, bl_wheel_vel = vrep.simxGetObjectFloatParameter(self.clientID, self.bl_brake_handle, vrep.sim_jointfloatparam_velocity, vrep.simx_opmode_streaming);
err, br_wheel_vel = vrep.simxGetObjectFloatParameter(self.clientID, self.br_brake_handle, vrep.sim_jointfloatparam_velocity, vrep.simx_opmode_streaming);
rear_wheel_velocity = ((bl_wheel_vel) + (br_wheel_vel))/2.0;
linear_velocity = rear_wheel_velocity * 0.09 * 3.6; # Kmph
throttle = linear_velocity;
steer_errorCode, steer_pos = vrep.simxGetJointPosition(self.clientID, self.steer_handle, vrep.simx_opmode_streaming);
if(self.printFlag):
print('Throttle:', throttle, 'Steering:', steer_pos);
def get_image(self):
err, resolution, image = vrep.simxGetVisionSensorImage(self.clientID, self.camera_f_handle, 0, vrep.simx_opmode_buffer);
if err == vrep.simx_return_ok:
img = np.array(image,dtype=np.uint8);
img.resize([resolution[1],resolution[0],3]);
self.lastFrame = imutils.rotate_bound(img, 90);
return 1, self.lastFrame;
elif err == vrep.simx_return_novalue_flag:
return 0, None;
else:
return err, None;
vrep.simxFinish(-1) # just in case, close all opened connections
clientID = vrep.simxStart('127.0.0.1',19999,True,True,5000,5) # Get the client ID
res=vrep.simxLoadScene(clientID,"Y:\CoppeliaSim_4_Self_Driving_Car_Simulation\sdc.ttt",0,vrep.simx_opmode_blocking)
x =vrep.simxStartSimulation(clientID,vrep.simx_opmode_oneshot_wait)
if clientID!=-1: #check if client connection successful
print('Connected to remote API server')
else:
print('Connection not successful')
sys.exit('Could not connect')
# Initialize car control object
car = CarControl(clientID, printFlag = False);
car.set_steering(20); # Degrees
car.set_throttle(1); # Kmph
for i in range(150): #可用while True: 取代
# Start time for image process
start = time.time();
err, img = car.get_image();
# End time for image process
end = time.time();
dt = end - start;
print('Frame took:', dt*1000.0, 'ms');
cv2.imshow('image',img);
cv2.waitKey(1); # in milliseconds
onshape <<
Previous Next >> VirtualBox