文章目的:使您熟悉用戶界面和Webots的基本概念。您將創建第一個包含簡單環境的模擬:一個有地板和牆壁的競技場,幾個盒子,一個Epuck機器人以及一個使機器人運動的控制器程序。
前提:已經安裝Webots
1.打開軟件
通過雙擊Webot的圖標(或在終端的命令行中調用它)來啓動Webots。
2.創建新World
一個World(世界)是包含像對象是一個信息的文件,他們的樣子,它們如何相互影響,天空是什麼,如何定義重力,摩擦力,物體的質量,等它定義的顏色模擬的初始狀態。不同的對象稱爲“Nodes(節點)”,並在“Scene Tree(場景樹)”中進行分層組織。因此,一個節點可能包含子節點。World(世界)存儲在具有.wbt擴展名的文件中。文件格式源自VRML97語言,並且易於閱讀。World(世界)文件必須直接存儲在名爲worlds的目錄中
單擊Pause3D視圖的按鈕暫停當前模擬。
如果主工具欄上的虛擬時間計數器已停止,則模擬將暫停。
Wizards通過選擇New Project Directory… 菜單項從菜單創建一個新項目,並按照說明進行操作:
選擇New Project Directory… 後
- 命名項目目錄:my_project改爲my_first_simulation
命名世界文件empty.wbt改爲my_first_simulation.wbt
單擊所有複選框,包括默認情況下未選中的“Add a rectangle area”。
點擊“Next”
Webots顯示它剛剛創建的目錄和文件的列表。這對應於Webots項目的標準文件層次結構。單擊Finish(Windows,Linux)或Done(macOS)按鈕以關閉此窗口。
恭喜,您剛剛創建了第一個Webots世界!3D視圖應顯示帶有方格地板的正方形競技場。您可以使用鼠標的左鍵,右鍵和滾輪在3D視圖中移動視點。
雙擊RectangleArena場景樹中的節點。這應該打開節點並顯示其字段。
選擇該floorTileSize字段並將其值0.5 0.5設置爲0.25 0.25。您應該立即在3D視圖中看到效果。網格更多了!
選擇該wallHeight字段並將其值0.1更改爲0.05。競技場的牆現在應該更低。
雙擊RectangleArena場景樹中的將其收起並選擇它。單擊Add場景樹頂部的按鈕(加號)。在打開的對話框中,選擇PROTO nodes (Webots Projects) / objects / factory / containers / WoodenBox (Solid)。一個大盒子應該出現在舞臺中央。在場景樹中雙擊它以打開其字段。
- 1.將其size值0.6 0.6 0.6替換爲0.1 0.1 0.1。
- 2.將其translation值0 0.3 0替換爲0 0.05 0。
- 3.現在,在3D視圖中按住Shift鍵並單擊並拖動該框,然後將其移動到競技場的某個角落。
- 4.選擇該框,然後按Ctrl-C,Ctrl-V(Windows,Linux)或Cmd-C,Cmd-V(macOS)進行復制和粘貼。按住Shift並單擊並拖動新框,將其移到其他位置。用這種方法創建第三個框。
- 5.移動這些框,以使任何框都不會位於競技場的中心。您也可以使用綠色的旋轉箭頭沿垂直軸旋轉框。也可以通過按住Shift並用鼠標右鍵拖動來完成。或者,您可以更改場景樹中節點的rotation視場角度WoodenBox。
- 6.對結果滿意後,請使用保存按鈕保存世界。
效果如下:
選擇場景樹視圖的最後一個節點WoodenBox。單擊場景樹視圖頂部的按鈕Add(加號)。在對話框中,選擇PROTO nodes (Webots Projects) / robots / gctronic / e-puck / E-puck (Robot)。Epuck1機器人應該出現在舞臺中央。移動和旋轉此機器人,就像處理盒子一樣。保存模擬並按下Run real-time按鈕。效果如下:
按下Alt +左鍵單擊+拖動,可以向機器人施加外力。
(在Linux上,除了Alt +左鍵單擊+拖動外,還應按Ctrl鍵。)
不可以對節點WoodenBox施加力,因爲默認情況下,它們沒有質量並且被視爲粘在地板上。要在節點WoodenBox上啓用外力,您應該將其質量場mass設置爲某個值(例如0.2 kg)。完成此操作後,也應該能夠對它們施加力。
暫停仿真並還原它。在“Scene Tree(場景樹)”視圖中,展開WorldInfo節點(第一個節點)。將其basicTimeStep字段設置爲16。然後保存模擬。這將提高模擬的準確性和穩定性(但會降低最大模擬速度)。
使用菜單Wizards / New Robot Controller…
創建一個新的C(或其他語言)控制器e-puck_go_forward
(對於C ++和Java則稱爲EPuckGoForward)。
這將在目錄my_first_simulation/controllers中創建一個新e-puck_go_forward(或EPuckGoForward)。
勾選提供您在文本編輯器中打開源文件的選項。 Open source file in Text Editor.
在場景樹視圖中,選擇E-puck節點的controller字段,然後使用“場景樹”視圖底部的字段編輯器:按Select…按鈕,
然後在列表中選擇e-puck_go_forward。
一旦控制器與機器人關聯,就可以保存World。
修改程序:
通過插入include語句(#include <webots/motor.h>),獲取電機設備(WbDeviceTag motor = wb_robot_get_device(“motor_name”);)和應用電機命令(wb_motor_set_position(motor, 10);)
#include <webots/robot.h>
// Added a new include file
#include <webots/motor.h>
#define TIME_STEP 64
int main(int argc, char **argv) {
wb_robot_init();
// get the motor devices
WbDeviceTag left_motor = wb_robot_get_device("left wheel motor");
WbDeviceTag right_motor = wb_robot_get_device("right wheel motor");
// set the target position of the motors
wb_motor_set_position(left_motor, 10.0);
wb_motor_set_position(right_motor, 10.0);
while (wb_robot_step(TIME_STEP) != -1);
wb_robot_cleanup();
return 0;
}
保存修改後的源代碼(File/Save Text File),然後進行編譯(Build/Build)。
如有必要,請修復所有編譯錯誤。
當Webots建議重置或重新加載世界時,請選擇Reset並運行模擬。
如下所示修改控制器程序,重新編譯並運行它:
#include <webots/robot.h>
// Added a new include file
#include <webots/motor.h>
#define TIME_STEP 64
#define MAX_SPEED 6.28
int main(int argc, char **argv) {
wb_robot_init();
// get a handler to the motors and set target position to infinity (speed control)
WbDeviceTag left_motor = wb_robot_get_device("left wheel motor");
WbDeviceTag right_motor = wb_robot_get_device("right wheel motor");
wb_motor_set_position(left_motor, INFINITY);
wb_motor_set_position(right_motor, INFINITY);
// set up the motor speeds at 10% of the MAX_SPEED.
wb_motor_set_velocity(left_motor, 0.1 * MAX_SPEED);
wb_motor_set_velocity(right_motor, 0.1 * MAX_SPEED);
while (wb_robot_step(TIME_STEP) != -1) {
}
wb_robot_cleanup();
return 0;
}
現在,機器人將移動(輪子將以每秒1弧度的速度旋轉)並且永不停止。
如果沒有任何反應,請不要忘記選擇Build / Build菜單項
或單擊代碼區域上方的齒輪圖標來編譯代碼。
編譯錯誤在控制檯中以紅色顯示。如果有,修復它們,然後重試編譯。然後,重新加載世界。