webots(一):創建一個簡單的仿真環境

webots(一):創建一個簡單的仿真環境

目的:

熟悉用戶界面和Webots的基本概念。創建一個簡單的仿真環境:一個有地板和牆壁的場地,幾個盒子,一個電子冰球機器人以及一個使機器人運動的控制器程序。

 

目錄:

1.安裝啓動webots

2.創建一個new world

3.添加一個電子冰球機器人

4.創建一個新的控制器

5.設置速度控制

 

實踐:(代碼塊裏爲具體操作)

1.安裝不做贅述

2.創建一個new world

world是一個包含對象信息的文件,其中包含了他們的外形,它們之間如何相互影響,天空是什麼,如何定義重力,摩擦力,物體的質量,顏色模擬等等。不同的對象稱爲“ Nodes”,並在“ Scene Tree”中進行分層組織。因此,一個節點可能包含子節點。world存儲在具有.wbt擴展名的文件中。文件格式源自VRML97語言,並且易於閱讀。世界文件必須直接存儲在名爲worlds的目錄中。

(1) 單擊“嚮導(Wizards)”--“新建項目目錄”,選擇你喜歡的項目目錄,這裏是“my_first_simulation”;
​
(2) 命名world文件爲“my_first_simulation.wbt”;
​
(3) 選擇所有的複選框,包括默認情況下未選中的“Add a rectangle arena”。--“finish”

                                    

 現在創建了第一個Webots world!3D視圖應顯示帶有方格地板的正方形場地。可以使用鼠標在3D視圖中移動視點:左按鈕,右按鈕和滾輪。“ Scene Tree”列出的節點包括:

  • WorldInfo:包含模擬的全局參數。

  • 視點:定義主要視點相機參數。

  • TexturedBackground:定義場景的背景(如果稍微旋轉視點,您應該看到山很遠)

  • TexturedBackroundLight:定義與上述背景關聯的光。

  • RectangleArena:定義到目前爲止您在該場景中看到的唯一對象。

    每個節點都有一些稱爲Fields的可自定義屬性。可以通過修改這些字段以更改矩形區域:

雙擊`RectangleArena`場景樹中的節點。這應該打開節點並顯示其字段。
​
(1)選擇該`floorTileSize`字段並將其值設置`0.25 0.25`爲`0.5 0.5`。可以立即在3D視圖中看到效果。
​
(2)選擇該`wallHeight`字段並將其值更改`0.05`爲`0.1`。場地的牆現在應該更低。

                                                 

        在場景樹視圖中,如果字段與默認值不同,則字段將以不同的顏色顯示(取決於主題)。

在場景中添加一些對象,雙擊`RectangleArena`場景樹中的將其關閉並選擇它。單擊場景樹頂部的`Add`按鈕。在打開的對話框中,選擇`PROTO nodes (Webots Projects) / objects / factory / containers / WoodenBox (Solid)`。一個大盒子應該出現在舞臺中央。在場景樹中雙擊它以打開其字段。
​
(1)將其更改`size`爲`0.1 0.1 0.1`而不是`0.6 0.6 0.6`。
​
(2)將其更改`translation`爲`0 0.05 0`而不是`0 0.3 0`。或者,您可以使用3D視圖中顯示的綠色箭頭來調整其`translation.y`字段。
​
(3)現在,在3D視圖中按住Shift鍵並單擊並拖動該框,然後將其移動到競技場的某個角落。
​
(4)選擇該框,然後按Ctrl-C,Ctrl-V(Windows,Linux)或Cmd-C,Cmd-V(macOS)進行復制和粘貼。按住Shift並單擊並拖動新框,將其移到其他位置。用這種方法創建第三個框。
​
(5)移動這些框,以使任何框都不會位於競技場的中心。您也可以使用綠色的旋轉箭頭沿垂直軸旋轉框。也可以通過按住Shift並用鼠標右鍵拖動來完成。或者,您可以更改場景樹中節點的`rotation`視場角度`WoodenBox`。**
​
(6)對結果滿意後,請使用保存按鈕保存世界。

3.添加一個電子冰球機器人

e-puck是一款小型機器人,帶有差速輪,10個LED和幾個傳感器,其中包括8個DistanceSensors和一個Camera。目前,我們僅對使用其輪子感興趣。在接下來的教程中,將學習如何使用其他功能。現在,將向世界添加一個電子冰球模型。確保仿真已暫停並且虛擬時間已過,爲0。如果不是這種情況,請使用Reset按鈕重置模擬

當修改Webots世界以進行保存時,首先要暫停模擬並將其重新加載到其初始狀態,這是基本的要求,即主工具欄上的虛擬計時器應顯示0:00:00:000。否則,每次保存時,每個3D對象的位置都會累積錯誤。因此,對世界的任何修改都應按以下順序執行:暫停,重置,修改和保存仿真

這個e-puck節點實際上是一個PROTO節點,就像我們之前介紹的RectangleArenaWoodenBox一樣。原型製作允許您創建自定義對象並重用它們。

(1)選擇`WoodenBox`場景樹視圖的最後一個節點。單擊場景樹視圖頂部的`Add`按鈕!。
​
(2)在對話框中,選擇`PROTO nodes (Webots Projects) / robots / gctronic / e-puck / E-puck (Robot)`。
​
(3)電子冰球機器人應該出現在舞臺中央。移動和旋轉此機器人,就像處理盒子一樣。保存模擬並按下`運行`按鈕!。

 機器人應移動,LED閃爍,並避免障礙物。這是因爲它具有具有該行爲的默認控制器。

 在仿真運行時,可以通過添加力看一下物體的物理屬性。

(1)因爲默認情況下,它們沒有質量並且被視爲粘在地板上,不可能對節點施加力,。要在節點上啓用物理,您應該將其場設置爲某個值(例如0.2 kg)。完成此操作後,也應該能夠對它們施加力。
​
(2)按下*Alt +左鍵單擊+拖動*,向機器人[施加力]。在Linux上,除了*Alt +左鍵單擊+拖動*外,還應按*Ctrl*鍵。

                                                          

4.創建一個新的控制器

現在,將編寫一個簡單的控制器,使機器人向前移動。Webots控制器可以用以下編程語言編寫:C,C ++,Java,Python,MATLAB,ROS等。C,C ++和Java控制器必須先進行編譯,然後才能作爲機器人控制器運行。Python和MATLAB控制器是解釋性語言,因此它們無需編譯即可運行。此內容將使用C++作爲參考語言。

使用菜單創建一個新的C++控制器`EPuckGoForward`:
(1)單機`(嚮導)Wizards /(新機器人控制器) New Robot Controlle`。
(2)目錄選擇`my_first_simulation/controllers`。選擇在文本編輯器中打開源文件的選項。

直接上代碼

#include <webots/Robot.hpp>
// Added a new include file
#include <webots/Motor.hpp>
#define TIME_STEP 64
​
// All the webots classes are defined in the "webots" namespace
using namespace webots;
​
int main(int argc, char **argv) {
 Robot *robot = new Robot();
​
 // get the motor devices
 Motor *leftMotor = robot->getMotor("left wheel motor");
 Motor *rightMotor = robot->getMotor("right wheel motor");
    
 // set the target position of the motors
 leftMotor->setPosition(10.0);
 rightMotor->setPosition(10.0);
​
 while (robot->step(TIME_STEP) != -1);
​
 delete robot;
​
 return 0;
}

保存修改後的源代碼(File / Save Text File),然後進行編譯。當Webots建議重置或重新加載世界時,請選擇Reset,並將控制器選擇爲新的控制器,運行仿真。

5.速度控制

機器人的輪子通常是通過速度控制的,而不是像前面的示例那樣通過位置控制的。爲了控制車輪的電動機的速度,您需要將目標位置設置爲無窮大並設置所需的速度:

上代碼

#include <webots/Robot.hpp>
// Added a new include file
#include <webots/Motor.hpp>
#include <math.h>
#define TIME_STEP 64
#define MAX_SPEED 6.28
​
// All the webots classes are defined in the "webots" namespace
using namespace webots;
​
int main(int argc, char **argv) {
 Robot *robot = new Robot();
​
 // get a handler to the motors and set target position to infinity (speed control)
 Motor *leftMotor = robot->getMotor("left wheel motor");
 Motor *rightMotor = robot->getMotor("right wheel motor");
 leftMotor->setPosition(INFINITY);
 rightMotor->setPosition(INFINITY);
​
 // set up the motor speeds at 10% of the MAX_SPEED.
 leftMotor->setVelocity(0.1 * MAX_SPEED);
 rightMotor->setVelocity(0.1 * MAX_SPEED);
​
 while (robot->step(TIME_STEP) != -1);
​
 delete robot;
​
 return 0;
}

現在,機器人將移動(輪子將以每秒1弧度的速度旋轉)並且永不停止。(不要忘了編譯,選擇對應的控制器)。

官方給的代碼中沒有#include <math.h>,導致編譯時INFINITY未定義。不知大家的是什麼情況,看過相關文檔之後本人添加了#include <math.h>,解決了問題。

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