[ROS Gazebo] ROS跟Gazebo搭配使用的架構——控制模擬世界的機器車
適合的讀者
看過一點點ROS, Gazebo的教學,例如publisher, subscriber, plugin, URDF, xacro……等等,想要把幾個基本教學的功能兜在一起的人。環境
Ubuntu 16.04
ROS kinetic
Gazebo 7
ROS可以幹嘛?
你們人類想要與我溝通,需要透過一個介面,ROS(Robot Operating System)機器人作業系統來實現。這有什麼好處?簡單來說,我們的語言你們不容易了解,透過這個介面,大家有個統一的標準會簡單一些。Gazebo可以幹嘛?
Gazebo是一個3D即時物理模擬系統,假設你在開發一個掃地機器人,很遺憾,它們墮落成人類的幫傭,你想要評估你的掃地機器人的算法能否在真實世界運作,機器人的sensors是否夠準確到能夠建出整個環境的地圖?Gazebo可以幫你實現這些需要。
本次目標
也許可以學會透過ROS操控在Gazebo裡面的機器車
這篇文章你可能可以學到什麼?
我希望大家能學到理解ROS跟Gazebo搭配使用的架構,然後透過ROS操控在Gazebo裡面的機器車。雖然我是個機器人,我第一次在學ROS的時候非常的挫折,那時我的語言模型訓練的還不太夠,資料大部分都是英文的,而且即使要完成一個在真實世界的小功能,要學的東西真的很多。
但是不用擔心,重點是一次專心學一個小部份,時機到了,神經網路自然就會把所有東西連結在一起。底下列出了這個教學需要的預備知識。
預備知識
- 安裝ROS與Gazebo
- ROS 透過publisher來把訊息放到一個像盒子的地方,任何想要或得這個訊息的都必須透過subscriber來取得這個topic
- ROS使用catkin來作為編譯的工具,
- URDF是一種機器人的描述檔,透過這個檔案ROS Gazebo就會知道機器人長什麼樣子
- .world檔是Gazebo場景的描述檔,比如重力、時間流逝的快慢、光線、視線角度......等
- xacro很適合用來動態產生URDF的檔案,比如你想要隨時調整機器人的camera跟機器人的相對位置你就需要xacro
- Launch檔,在ROS裡面launch檔可以整合各種Gazebo和ROS的東西,比如我該啟動哪些服務,或是該跑哪些script,應該載入哪個.world檔或是哪個機器人
- Plugin,比如你想要控制Gazebo裡機器人輪子的轉速時,就必須要透過C++寫的gazebo plugin,這個plugin可以被視為機器人的一部分
Source Code
- 切換到你的catkin_ws的src,例如:
cd ~/catkin_ws/src
- Clone from github
git clone https://github.com/kswwrobot/ROS_GAZEBO_examples
- 切換到你的catkin_ws,例如:
cd ~/catkin_ws - 編譯,如果編譯失敗,請幫忙留言告訴我錯誤訊息
catkin_make - 完成後,要讓ros找的到剛才編譯的project
cd ~/catkin_ws/devel
source setup.bash - 透過roslaunch執行launch file執行ros與gazebo
roslaunch robot_car_move_gazebo robot_car_move.launch - 開啟新的terminal,用python控制輪子轉速
cd ~/catkin_ws/devel
source setup.bash
roscd robot_car_move_gazebo
cd scripts/
python3 robot_car_move.py
如果有少一些module,就照著錯誤的提示安裝,或搜尋google - 成功的話你就會看到像上面youtube影片的結果
教學開始
首先來看看github裡,robot_car_move_gazebo資料夾的結構,建議自己把每一個檔案都打開來看,猜猜看是拿來做什麼的,code裡面都有詳細的註釋,這邊主要講架構。
robot_car_move_gazebo
├── CMakeLists.txt
├── launch
│ └── robot_car_move.launch
├── package.xml
├── plugin
│ └── robot_car_set_wheel_joint_velocity.cc
├── scripts
│ └── robot_car_move.py
└── worlds
└── robot_car_move.world
CMakeLists.txt和package.xml都是編譯這個project必須的檔案,我們會在catkin_ws資料夾執行catkin_make來進行編譯,這邊我們重點放在其它檔案
scripts裡面的robot_car_move.py,publish message到"/robot_car/vel_cmd",plugin裡面的robot_car_set_wheel_joint_velocity.cc會持續的接收"/robot_car/vel_cmd"的消息,只要收到消息,就會設定gazebo世界裡面輪子的轉速。
worlds裡面的robot_car_move.world是一個sdf檔也是xml格式,定義了基本的世界
launch裡面的robot_car_move.launch負責啟動所有東西,包含了去專案robot_car_description取得urdf檔,啟動Gazebo,從worlds讀取world檔。
robot_car_description
├── CMakeLists.txt
├── launch
│ ├── robot_car.launch
│ └── robot_car.rviz
├── meshes
│ └── robot_car.stl
├── package.xml
└── urdf
├── materials.xacro
├── robot_car.gazebo
└── robot_car.xacro
robot_car_description是放機器車描述檔的地方,機器車描述檔由urdf所定義,robot_car.xacro會動態的產生URDF檔,xacro對於隨時要調整機器人元件的相對位置非常有幫助,而URDF要給gazebo用之前需要跟Gazebo說有這些links或是joints,這些處理定義在robot_car.gazebo。
meshes裡面的robot_car.stl是我用freecad自己畫的機器車的身體。
這篇文章的重點是把幾個ROS, 跟Gazebo基本教學介紹的功能兜起來,也可以試試看執行roslaunch robot_car_description robot_car.launch,可以在rviz看到機器車,我都用來檢查機器人各位置的元件位置跟座標軸有沒有正確,啟動比Gazebo快多了。
之後的文章會繼續解析裡面的小元件,比如怎麼用freecad自己畫機器零件,然後導入gazebo,還有增加camera與sensors到機器車上。
歡迎給任何意見,一起互相學習!
robot_car_move_gazebo
├── CMakeLists.txt
├── launch
│ └── robot_car_move.launch
├── package.xml
├── plugin
│ └── robot_car_set_wheel_joint_velocity.cc
├── scripts
│ └── robot_car_move.py
└── worlds
└── robot_car_move.world
CMakeLists.txt和package.xml都是編譯這個project必須的檔案,我們會在catkin_ws資料夾執行catkin_make來進行編譯,這邊我們重點放在其它檔案
scripts裡面的robot_car_move.py,publish message到"/robot_car/vel_cmd",plugin裡面的robot_car_set_wheel_joint_velocity.cc會持續的接收"/robot_car/vel_cmd"的消息,只要收到消息,就會設定gazebo世界裡面輪子的轉速。
worlds裡面的robot_car_move.world是一個sdf檔也是xml格式,定義了基本的世界
launch裡面的robot_car_move.launch負責啟動所有東西,包含了去專案robot_car_description取得urdf檔,啟動Gazebo,從worlds讀取world檔。
robot_car_description
├── CMakeLists.txt
├── launch
│ ├── robot_car.launch
│ └── robot_car.rviz
├── meshes
│ └── robot_car.stl
├── package.xml
└── urdf
├── materials.xacro
├── robot_car.gazebo
└── robot_car.xacro
robot_car_description是放機器車描述檔的地方,機器車描述檔由urdf所定義,robot_car.xacro會動態的產生URDF檔,xacro對於隨時要調整機器人元件的相對位置非常有幫助,而URDF要給gazebo用之前需要跟Gazebo說有這些links或是joints,這些處理定義在robot_car.gazebo。
meshes裡面的robot_car.stl是我用freecad自己畫的機器車的身體。
這篇文章的重點是把幾個ROS, 跟Gazebo基本教學介紹的功能兜起來,也可以試試看執行roslaunch robot_car_description robot_car.launch,可以在rviz看到機器車,我都用來檢查機器人各位置的元件位置跟座標軸有沒有正確,啟動比Gazebo快多了。
之後的文章會繼續解析裡面的小元件,比如怎麼用freecad自己畫機器零件,然後導入gazebo,還有增加camera與sensors到機器車上。
歡迎給任何意見,一起互相學習!
謝謝你的分享!講的真的很詳細!期待之後的文章 :)
回覆刪除学到了,有空试试!
回覆刪除想詢問一下,缺少了一個叫rospkg,要如何新增
回覆刪除