30分鐘上手你的第一個Webots模擬程序

文章目的:使您熟悉用戶界面和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菜單項
在這裏插入圖片描述
或單擊代碼區域上方的齒輪圖標來編譯代碼。
在這裏插入圖片描述
編譯錯誤在控制檯中以紅色顯示。如果有,修復它們,然後重試編譯。然後,重新加載世界。

發佈了33 篇原創文章 · 獲贊 14 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章