前言 前面的文章介紹了webots的安裝和簡單使用,今天我們來建立一個簡單的webots世界和一個簡單的控制器,該控制器會讓機器人在世界中進行避障。廢話不多說,現在就開始吧
1. 準備
webots世界其實是一個檔案。檔案中包含諸如物體在哪裡、它們看起來像什麼、它們如何互相作用、天空的顔色是什麼、如何定義重力、摩擦力、物體品質等資訊。它定義了模拟的初始狀态。不同的對象稱為節點,并在場景樹中分層組織。
webots世界以.wbt 擴充名存儲在計算機中。并且世界檔案必須存在名為 worlds 的目錄中。是以,我們要先建立一個工作空間。
2. 建立工作空間 打開webots,在頂部工具欄中找到
Wizards -> New Project Directory 然後一路next,選擇你要儲存的路徑,并且重命名世界名稱,然後在世界的設定中,勾選所有項。此時一個世界就建立好了,如下圖所示:
3. 添加一個機器人 這裡選擇 e-puck 機器人。e-puck 是一個小型機器人,具有差速輪、10 個 LED 和多個傳感器,包括 8 個距離傳感器和一個攝像頭。如下圖所示。
注意:添加機器人前,確定仿真環境已經暫停,且虛拟時間為0。如下圖所示。
當一個世界被儲存,但是存在被修改的時候,暫停時間和模拟并且重新加載到其初始狀态是很重要的。否則在每次儲存時,每個3D對象的位置會累計誤差。是以,對任何世界的修改都應該按照如下順序執行:暫停、重置、修改、儲存、模拟。
選擇左邊視窗的添加按鈕
然後依次選擇
PROTO nodes (Webots Projects) / robots / gctronic / e-puck / E-puck (Robot) 添加一個 e-punk機器人。此時,機器人會出現在地闆的中央位置。
4. 建立一個控制器
控制器是控制機器人行為的程式。在webots中可以用以下程式編寫:C、C++、Java、Python、MATLAB、ROS。這裡我們用C++。 需要注意的是,機器人節點的控制器名字指定目前與之關聯的機器人。同一個控制器可以被重複使用。
這個部分就是仿真的核心内容了,你可以将你的算法部署在這個地方,進行算法驗證。
e-punk機器的回報回路如下圖
在工具欄找到
Wizard -> New Robot Controller 語言選擇C++,然後重命名這個控制器,接着一路next。我們就會看到一個文本編輯視窗出現在左側。将以下代碼複制進去:
// File: my_controller.cpp // Date: 2021.12.1 // Description: 用于在webots中,控制e-puck機器人避障 // Author: Loren // Modifications: //webos必要頭檔案 #include <webots/Robot.hpp> #include <webots/DistanceSensor.hpp> #include <webots/Motor.hpp> //定義常量 #define TIME_STEP 64 #define MAX_SPEED 6.28 //所有 webots 類都定義在“webots”命名空間中 using namespace webots; int main(int argc, char** argv) { //建立機器人對象 Robot *robot = new Robot(); //初始化傳感器 // e-puck機器人有8個紅外傳感器 DistanceSensor *ps[8]; char psNames[8][4] = { "ps0", "ps1", "ps2", "ps3", "ps4", "ps5", "ps6", "ps7" }; //依次讀取每個傳感器的編号 for (int i = 0; i < 8; i++) { ps[i] = robot->getDistanceSensor(psNames[i]); ps[i]->enable(TIME_STEP); } //初始化電機 Motor *LeftMotor = robot->getMotor("left wheel motor"); Motor *RightMotor = robot->getMotor("right wheel motor"); LeftMotor->setPosition(INFINITY); RightMotor->setPosition(INFINITY); LeftMotor->setVelocity(0.0); RightMotor->setVelocity(0.0); //開始回報循環(參照回報圖) while (robot->step(TIME_STEP) != -1) { //讀取傳感器輸出值 double psValues[8]; for (int i = 0; i < 8; i++) { psValues[i] = ps[i]->getValue(); } //檢測障礙物(參考e-puck傳感器範圍圖) bool right_obstacle = psValues[0] > 80.0 || psValues[1] > 80.0 || psValues[2] > 80.0; bool left_obstacle = psValues[5] > 80.0 || psValues[6] > 80.0 || psValues[7] > 80.0; // 初始化電機速度為50% double LeftSpeed = 0.5 * MAX_SPEED; double RightSpeed = 0.5 * MAX_SPEED; //根據障礙物情況,調整實際的速度 if (left_obstacle) { //檢測到左邊有障礙物,就向右轉 LeftSpeed = 0.5 * MAX_SPEED; RightSpeed = -0.5 *MAX_SPEED; } else if (right_obstacle) { //檢測到右邊有障礙物,就向左轉 LeftSpeed = -0.5 * MAX_SPEED; RightSpeed = 0.5 * MAX_SPEED; } //将速度給到電機 LeftMotor->setVelocity(LeftSpeed); RightMotor->setVelocity(RightSpeed); } delete robot; //程式結束後釋放記憶體 return 0; }
代碼編輯完畢以後,點選文本編輯欄的儲存,然後編譯該檔案。
編譯完成後,該控制器就會被加載到e-punk的控制器屬性中。按照下圖所示進行操作,選擇我們剛剛編譯好的控制器,點選ok進行更換。
結語 webots仿真器十分強大,其控制的仿真,支援多種語言程式設計,也支援各種各樣的機器人。我們可以利用該軟體進行各種仿真的驗證(通過添加控制器的方式)。即使沒有ROS,也能進行驗證。
- End -
技術發展的日新月異,阿木實驗室将緊跟技術的腳步,不斷把機器人行業最新的技術和硬體推薦給大家。看到經過我們教育訓練的學員在技術上突飛猛進,是我們教育訓練最大的價值。如果你在機器人行業,就請關注我們的公衆号,我們将持續釋出機器人行業最有價值的資訊和技術。 阿木實驗室緻力于前沿IT科技的教育和智能裝備,讓機器人研發更高效!