[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

  1. 切換到你的catkin_ws的src,例如:

    cd ~/catkin_ws/src

  2. Clone from github

    git clone https://github.com/kswwrobot/ROS_GAZEBO_examples

  3. 切換到你的catkin_ws,例如:

    cd ~/catkin_ws

  4. 編譯,如果編譯失敗,請幫忙留言告訴我錯誤訊息

    catkin_make

  5. 完成後,要讓ros找的到剛才編譯的project

    cd ~/catkin_ws/devel
    source setup.bash

  6. 透過roslaunch執行launch file執行ros與gazebo

    roslaunch robot_car_move_gazebo robot_car_move.launch

  7. 開啟新的terminal,用python控制輪子轉速

    cd ~/catkin_ws/devel
    source setup.bash
    roscd robot_car_move_gazebo
    cd scripts/
    python3 robot_car_move.py

    如果有少一些module,就照著錯誤的提示安裝,或搜尋google

  8. 成功的話你就會看到像上面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到機器車上。

歡迎給任何意見,一起互相學習!

留言

  1. 謝謝你的分享!講的真的很詳細!期待之後的文章 :)

    回覆刪除
  2. 想詢問一下,缺少了一個叫rospkg,要如何新增

    回覆刪除

張貼留言

熱門文章