首頁>科技>

前言:

上一次說了webots如何新增物理屬性和碰撞屬性,到這裡其實Webots的基礎知識就說完了。下面讓我們結合一個案例,把所有模組都串聯起來。

這裡我們建立一個四輪差速機器人,該機器人包括四個輪子,2個距離感測器。最後再告訴大家如何使用Python和C++編寫控制器,讓我們的四輪小車真正動起來。

開始建立:

第一步:建立Robot節點(注意:這裡雖然有一個節點叫做差速輪,但這個節點即將被放棄,建議使用Robot節點)

新建body節點

第二步:給新建的Body新增一個box shape 物件

建立尺寸如圖所示

第三步:建立四個hingejoint節點(可以理解成連線汽車底盤的連線件,可以設定電機或者不設定)

HingeJoint

四個hingejoint節點

其實四個都一樣,只是位置不一樣而已,從輪子1到輪子4,位置分別為:

translation: 0.06 0 -0.05translation: 0.06 0 -0.05translation: -0.06 0 0.05translation: -0.06 0 0.05wheel size:radius:0.04height:0.02

注意anchor 需要和wheel的位置一樣

這裡說一下hingejoint,hingejoint新建完後,會出現三個選項欄:

三個物件列表

第一個引數,主要配置和這個joint相關的引數,我們這裡只用了anchor和axis,anchor這個引數理解為我們連線輪子的關節在車的那個位置,axis表示我們的轉動關節繞那個軸轉動。其他引數具體介紹可以參考Hingejoint連結。

第二個引數,主要是配置位置感測器,剎車和電機。注意這裡的motor名字,後面會用到。

第三個引數,主要用於設定joint連線的solid(固體物件),在這裡就是輪子。可以看到我們設定的translation就是上面給出的,anchor也需要設定一樣的。

第四步:新增兩個距離感測器,用於障礙物檢測。注意距離感測器方向為x軸,所以我們新增完畢後的座標軸要如下圖:

紅色箭頭為X軸

下圖為新建距離感測器,可以看到就是一個簡單shape和位置變換。圖中已經標註出具體的shape尺寸和位置。

第五步:給我們的四輪車新增物理屬性,主要是防碰撞和質量。

新增碰撞邊界和質量屬性引數

控制器,用於控制我們的機器人動起來,後面實現的各種複雜的運動都依靠這個。

剛剛忘記說如何新建控制器了,現在補上。很簡單,只需要找到嚮導選單,第二項就是新建控制器,然後選擇對應的語言即可,這裡以python 為例。

Webots支援多種語言,這裡我主要使用C/C++和python,Matlab也行,有興趣的可以試試。

C++版本程式碼如下:

#include <webots/DistanceSensor.hpp>#include <webots/Motor.hpp>#include <webots/Robot.hpp>#define TIME_STEP 64using namespace webots;int main(int argc, char **argv) {  //新建robot  Robot *robot = new Robot();  //設定距離感測器變數  DistanceSensor *ds[2];  char dsNames[2][10] = {"ds_right", "ds_left"};  for (int i = 0; i < 2; i++) {    ds[i] = robot->getDistanceSensor(dsNames[i]);    ds[i]->enable(TIME_STEP);  }  //讀取四個輪子狀態,這裡主要是速度環控制,沒有位置環。  Motor *wheels[4];  char wheels_names[4][11] = {"lf_wheel_1", "rf_wheel_2", "lr_wheel_3", "rr_wheel_4"};  for (int i = 0; i < 4; i++) {    wheels[i] = robot->getMotor(wheels_names[i]);    wheels[i]->setPosition(INFINITY);    wheels[i]->setVelocity(0.0);  }  int avoidObstacleCounter = 0;  while (robot->step(TIME_STEP) != -1) {    double leftSpeed = 1.0;    double rightSpeed = 1.0;    if (avoidObstacleCounter > 0) {      avoidObstacleCounter--;      leftSpeed = 1.0;      rightSpeed = -1.0;    } else { // read sensors      for (int i = 0; i < 2; i++) {        if (ds[i]->getValue() < 950.0)          avoidObstacleCounter = 100;      }    }    wheels[0]->setVelocity(leftSpeed);    wheels[1]->setVelocity(rightSpeed);    wheels[2]->setVelocity(leftSpeed);    wheels[3]->setVelocity(rightSpeed);  }  delete robot;  return 0;  // EXIT_SUCCESS}

python 程式碼如下:這裡Python版本,有的時候平臺安裝有問題或者沒有配置好Python環境會報錯,具體遇到的時候,可以google一下。

from controller import RobotTIME_STEP = 64robot = Robot()ds = []dsNames = ["ds_right", "ds_left"]for i in range(2):    ds.append(robot.getDevice(dsNames[i]))    ds[i].enable(TIME_STEP)wheels = []wheelsNames = ["lf_wheel_1", "rf_wheel_2", "lr_wheel_3", "rr_wheel_4"]for i in range(4):    wheels.append(robot.getDevice(wheelsNames[i]))    wheels[i].setPosition(float('inf'))    wheels[i].setVelocity(0.0)avoidObstacleCounter = 0while robot.step(TIME_STEP) != -1:    leftSpeed = 1.0    rightSpeed = 1.0    if avoidObstacleCounter > 0:        avoidObstacleCounter -= 1        leftSpeed = 1.0        rightSpeed = -1.0    else:  # read sensors        for i in range(2):            if ds[i].getValue() < 950.0:                avoidObstacleCounter = 100    wheels[0].setVelocity(leftSpeed)    wheels[1].setVelocity(rightSpeed)    wheels[2].setVelocity(leftSpeed)    wheels[3].setVelocity(rightSpeed)
編譯和聯合執行

C++版本編譯:

執行模擬機器人,對於這個四輪車來說,只需要選擇剛剛所寫的控制器即可,如下圖所示:

最後總結:

這一節主要給大家簡單介紹一下,如何使用webots進行四輪模擬,下一次,我們一起來設計一個單腿跳躍機器人,會比輪式機器人更復雜,請大家期待哈,後面也會更新四足和雙足。

對了,有的人問我,是否可以把工程目錄共享,當然可以的。

程式碼地址如下:

https://github.com/Musyue/webots_sim_lecs_codes

10
最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 那個從手機行業消失多年的黑莓,今年突然滿血復活了