技術分享 | 帶你從webots中搭建第一個仿真環境

前言 前面的文章介紹了webots的安裝和簡單使用,今天我們來創建一個簡單的webots世界和一個簡單的控制器,該控制器會讓機器人在世界中進行避障。廢話不多說,現在就開始吧

1. 準備

webots世界其實是一個文件。文件中包含諸如物體在哪裏、它們看起來像什麼、它們如何相互作用、天空的顏色是什麼、如何定義重力、摩擦力、物體質量等信息。它定義了模擬的初始狀態。不同的對象稱爲節點,並在場景樹中分層組織。

webots世界以.wbt 擴展名存儲在計算機中。並且世界文件必須存在名爲 worlds 的目錄中。因此,我們要先新建一個工作空間。

2. 新建工作空間 打開webots,在頂部工具欄中找到

Wizards -> New Project Directory 然後一路next,選擇你要保存的路徑,並且重命名世界名稱,然後在世界的設置中,勾選所有項。此時一個世界就創建好了,如下圖所示: file

3. 添加一個機器人 這裏選擇 e-puck 機器人。e-puck 是一個小型機器人,具有差速輪、10 個 LED 和多個傳感器,包括 8 個距離傳感器和一個攝像頭。如下圖所示。 file

注意:添加機器人前,確保仿真環境已經暫停,且虛擬時間爲0。如下圖所示。 file 當一個世界被保存,但是存在被修改的時候,暫停時間和模擬並且重新加載到其初始狀態是很重要的。否則在每次保存時,每個3D對象的位置會累計誤差。因此,對任何世界的修改都應該按照如下順序執行:暫停、重置、修改、保存、模擬。

選擇左邊窗口的添加按鈕 file

然後依次選擇

PROTO nodes (Webots Projects) / robots / gctronic / e-puck / E-puck (Robot) 添加一個 e-punk機器人。此時,機器人會出現在地板的中央位置。

4. 創建一個控制器

控制器是控制機器人行爲的程序。在webots中可以用以下程序編寫:C、C++、Java、Python、MATLAB、ROS。這裏我們用C++。 需要注意的是,機器人節點的控制器名字指定當前與之關聯的機器人。同一個控制器可以被重複使用。

這個部分就是仿真的核心內容了,你可以將你的算法部署在這個地方,進行算法驗證。

e-punk機器的反饋迴路如下圖 file 在工具欄找到

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; }

代碼編輯完畢以後,點擊文本編輯欄的保存,然後編譯該文件。 file 編譯完成後,該控制器就會被加載到e-punk的控制器屬性中。按照下圖所示進行操作,選擇我們剛剛編譯好的控制器,點擊ok進行更換。 file

結語 webots仿真器十分強大,其控制的仿真,支持多種語言編程,也支持各種各樣的機器人。我們可以利用該軟件進行各種仿真的驗證(通過添加控制器的方式)。即使沒有ROS,也能進行驗證。

  • End -

技術發展的日新月異,阿木實驗室將緊跟技術的腳步,不斷把機器人行業最新的技術和硬件推薦給大家。看到經過我們培訓的學員在技術上突飛猛進,是我們培訓最大的價值。如果你在機器人行業,就請關注我們的公衆號,我們將持續發佈機器人行業最有價值的信息和技術。 阿木實驗室致力於前沿IT科技的教育和智能裝備,讓機器人研發更高效!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章