CD2020 CMSiMDE

  • Home
    • Site Map
    • reveal
    • blog
  • About
  • Assignment
    • CoppeliaSim資料分析
      • 場景&模型&環境
      • Calculation modules
      • 編寫代碼
      • 模擬
      • Tutorials
    • Webots
    • Collaboration翻譯
  • 四輪機器人模擬
    • 問題
  • VirtualBox
    • IPv4設定
    • IPv6設定
  • 每周進度
  • 期末報告
Collaboration翻譯 << Previous Next >> 問題

四輪機器人模擬

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


Collaboration翻譯 << Previous Next >> 問題

Copyright © All rights reserved | This template is made with by Colorlib