1.初識簡單的二維移動機器人群模擬器STDR
轉自連結:http://www.corvin.cn/561.html,有興趣請移步學習。
0x00 What's STDR Simulator?
STDR是Simple Two Dimentional Robot Simulator的縮寫,它可以非常容易的對在二維平面移動的機器人進行模擬,STDR的設計目的不是為了像Gazebo那樣的大型逼真的機器人模擬或者一個功能最全面、功能強大的模擬器,這款軟體的目的是為了儘可能的簡單的去模擬單個移動機器人的運動或者多個機器人的協同模擬。而且STDR不僅可以執行在一個有圖形介面的環境中,還可以執行在一個無桌面環境的系統中,這樣我們就可以在終端中使用ssh連線後就可以進行模擬任務了。
STDR可以完美的與ROS相容配套,機器人上的感測器資料都是通過ros話題的形式釋出。跟ROS執行一樣,STDR的執行也可以將圖形使用者介面和伺服器分開在不同的電腦上執行,而且STDR也可以和Rviz一起工作,在Rviz中將STDR中的機器人資料視覺化顯示。關於該模擬器的更多詳細介紹可以觀看其在ROS Wiki上的主頁,網址如下:
http://wiki.ros.org/stdr_simulator
0x01 安裝STDR模擬器
下面介紹兩種安裝方式,一種是最簡單的使用apt來安裝,另外一種下載原始碼後自己編譯來安裝,下面先介紹第一種apt安裝,直接在終端中輸入如下命令:
sudo apt-get install ros-$ROS_DISTRO-stdr-simulator
其中$ROS_DISTRO會根據當前安裝的ROS版本來自動區分,如果安裝的是indigo,那麼就會被替換成indigo,如果安裝的是kinetic就會被替換成kinetic,這樣我就不用為了兩個不同的ROS版本來寫兩遍安裝命令了。
下面來介紹使用原始碼來編譯安裝,此方式不建議一般使用者來嘗試,只有當現在釋出的功能已經無法滿足自己的模擬需要才需要在原始碼基礎上修改,不過要想增加自己需要的功能前提是自己對STDR原始碼結構需要非常瞭解才行,下面來介紹原始碼編譯過程,首先從github下面原始碼,下載命令如下:
git clone https://github.com/stdr-simulator-ros-pkg/stdr_simulator.git
當最後編譯到達100%時整個編譯過程就結束了,然後需要source devel/setup.bash這樣就能保證在命令列中直接找到該模擬軟體包了,通過使用下圖中命令來操作來驗證,只有出現下圖所示的輸出stdr的各項操作才能正常進行:
0x02 STDR程式碼架構介紹
在真正執行該模擬以前我們需要對該軟體的實現需要有個簡單的認識,這樣在後面的實際執行中會了解的更加通透,首先檢視一下原始碼目錄組成:
在認識了各個程式碼目錄後,需要弄清楚各程式碼直接是如何互相呼叫、協同工作來完成整個模擬任務的,瞭解這個簡單的模擬軟體實現方式非常有助於我們後對該程式碼的修改。
0x03 啟動STDR進行模擬
對STDR有了初步的認識後,我們現在開始真正的啟動來檢視STDR的效果,直接在終端中輸入以下命令即可啟動,會自動彈出如下的視窗:
roslaunch stdr_launchers server_with_map_and_gui_plus_robot.launch
啟動後在地圖的左下角會自動的生成一個機器人,其中紅色的線是雷達的掃描輸出,綠色的部分是超聲波的輸出。我們同樣可以在rviz中顯示該模擬環境,使用如下命令:
roslaunch stdr_launchers rviz.launch
當將從上往下的檢視方式修改為orbit檢視方式後我們就可以來轉換不同的觀察視角了,那個像喇叭一樣的東西就是超聲波的輸出。
接下來我們檢視下當前的話題輸出和服務列表,分別使用rostopic list命令和rosservice list命令即可:
話題和節點之間的關係圖通過rqt_graph命令來檢視,如下圖所示:
0x04 控制機器人移動
(1)在控制機器人移動我們可以直接往控制其移動的/robot0/cmd_vel話題中傳送訊息即可,或者也可以使用teleop_twist_keyboard軟體包來鍵盤遙控模擬機器人四處移動,這種控制方式跟我們在現實中控制真實的小車是一樣的,這樣就起到了模擬的作用,首先來使用向話題中直接的釋出訊息控制模擬機器人移動:
rostopic pub -r 2 /robot0/cmd_vel geometry_msgs/Twist '{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}'
當開始向話題中釋出訊息後就會發現模擬的機器人開始順時針轉動,這是因為在ROS中規定角速度的正方向是逆時針方向,我們在釋出的訊息中角速度設定為-0.5,所以就會出現順時針運動,運動效果如下圖所示。
(2)接下來第二種方式是我們可以使用鍵盤來遙控模擬機器人來四處移動,首先需要下載teleop_twist_keyboard原始碼,下載操作步驟如下:
git clone https://github.com/ros-teleop/teleop_twist_keyboard.git
對於teleop_twist_keyboard.py原始碼修改部分主要是修改成robot0模擬機器人的速度控制話題,因為預設的傳送話題名稱是/cmd_vel,這樣鍵盤控制時沒辦法傳送到指定的/robot0/cmd_vel話題上,也就沒辦法來遙控機器人了,所以需要修改話題名:
接下來我們就可以先編譯一下該軟體包,然後就可以執行該控制節點來遙控模擬機器人四處走動了,首先我們需要先進入工作空間的根目錄執行catkin_make來編譯該軟體包,然後使用source devel/setup.bash配置環境變數使該軟體包可以被搜尋到,接下來就可以執行如下命令來啟動該節點了:
rosrun teleop_twist_keyboard teleop_twist_keyboard.py
當我們根據提示使用鍵盤上的按鍵就可以控制模擬機器人四處走動了,需要注意的是該模擬機器人對速度的處理方式為:當接收一條控制命令後會一直不斷執行該命令,直到有下一條命令來改變當期的執行狀態,如果想讓機器人停止走動只需要按k鍵即可,向控制移動命令話題中傳送全為0的控制命令就會讓其停止移動,具體效果如下圖所示:
0x05 建立多個機器人
到現在我們一直操作的就是一個機器人,接下來我們看看如何使用該模擬器建立更多的機器人,點選STDR Simulator工具欄中的Load robot工具就會彈出可以載入的各種感測器和機器人。
我們現在只加載robots目錄下的各種機器人,下面是機器人的列表,我們載入pandora_robot.xml這款機器人,因為它跟預設顯示的機器人相同型號:
當選中後點擊open按鈕後我們就可以在STDR Simulator上來選則放置的位置了,同時如果感覺放置的位置不合適還可以通過"Move robot"來更換位置,如果想刪除機器人就選擇“Delete robot"即可,具體操作如下圖所示:
接下來我們使用rostopic pub方式來使兩個模擬機器人同時運動,下面的兩條命令大家可以根據自己建立的機器人來做相應修改:
向robot0傳送一條控制其順時針旋轉的命令:
rostopic pub -1 /robot0/cmd_vel geometry_msgs/Twist '{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}'
向robot2傳送一條控制其逆時針旋轉命令:
rostopic pub -1 /robot2/cmd_vel geometry_msgs/Twist '{linear: {x: 0, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'
運動效果如下圖所示:
0x06 參考資料
[1].ROS wiki上stdr_simulator的主頁[OL]. http://wiki.ros.org/stdr_simulator
[2].stdr_simulator的獨立參考網址[OL]. http://stdr-simulator-ros-pkg.github.io/
[3].GitHub上stdr_simulator原始碼地址[OL].https://github.com/stdr-simulator-ros-pkg/stdr_simulator
[4].GitHub上teleop_twist_keyboard原始碼地址[OL].https://github.com/ros-teleop/teleop_twist_keyboard