ROS學習筆記(持續更新)
之前已經接觸過一些ROS的使用,但是還沒有系統地學習過,因此在此記錄一下學習的筆記。學習ROS首先必須參考ROS wiki及ROS Answers,另外國內“古月居”的博客和“東方赤龍”的博客都可以參考學習,古月居的書《ROS機器人開發實踐》也不錯,可以用來系統的學習。不過,需知道ROS本身只是一個方便大家開發的工具罷了。
1. 初識ROS
分布式網絡,TCP/IP,模塊間松耦合連接
三種通信機制:
1.基於發布/訂閱topic通信(異步)
- talker註冊
- listener註冊
- ROS master進行信息匹配
- listener發送連接請求
- talker確認連接請求
- listener嘗試與talker建立網絡連接
- talker向listener發布數據
註意,節點建立連接後,可以關掉ROS master,節點間數據傳輸不受影響,但其他節點也無法加入這兩個節點間的網絡。
2.基於客戶端/服務器service通信(同步)
帶有應答,減少了listener與talker間的RPC通信。底層協議和topic通信一樣,用的都是ROSTCP/ROSUDP。
只允許一個節點提供指定命名的服務(一對多),實時性比topic強。
3.基於遠程過程調用(RPC)的參數服務器
不涉及TCP/UDP通信。
參數類似ROS中的全局變量,包含key和value,由ROS master進行管理。
需註意有時需要動態參數配置來通知listener參數已被更新。
topic通信適用於不斷更新、含較少邏輯處理的數據通信;service通信適用於數據量較少但有邏輯處理的數據交換。
2. ROS架構
分為三層:
- OS層。基於linux
- 中間層。提供通信機制及一些庫
- 應用層。各功能包內模塊以節點為單位
3. ROS基礎
3.1 創建工作空間和功能包
mkdir -p ~/catkin_ws/src # 在工作空間根目錄編譯,編譯後自動出現build和devel文件夾及幾個腳本文件,用於設置環境變量等 cd ~/catkin_ws/ catkin_make # 運行腳本文件使其生效 source devel/setup.bash # 查看環境變量是否生效 echo $ROS_PACKAGE_PATH # 如果沒添加上使用sudo gedit ~/.bashrc打開文件手動添加。或者在終端使用下面命令直接添加。 # 這種方式對所有終端都有效,而source只對當前終端有效! echo "source ~/catkin_ws/devel/setup.bash">> ~/.bashrc source ~/.bashrc # 進入代碼空間,創建自己的功能包。一般都會依賴roscpp,rospy,std_msgs這幾個功能包 # 不過也可以不用現在添加,後續用到具體的依賴時,再在CMakeLists中直接加上即可。 # 你也可以直接去github下載別人寫好的功能包,就不用自己創建啦。 # 創建完成後,代碼空間src中會生產一個叫my_package的功能包,其中已經包含package.xml和CMakeLists.txt文件。 # 在後續寫代碼時,就可以把源碼放進功能包src文件夾中,然後寫相應的CMakeLists.txt就可以了。具體見下面CLion教程。 cd ~/catkin_ws/src catkin_create_pkg my_package roscpp rospy std_msgs
3.2 工作空間的覆蓋
# ROS中為解決同名功能包問題,存在覆蓋機制。即$ROS_PACKAGE_PATH中記錄的環境變量,最前面覆蓋最後面的。
# 創建多個同名功能包時,需要註意這點!
# rospack 查找功能包所放置的工作空間
rospack find roscpp
3.3 使用IDE運行及調試ROS程序
這個是非常重要的一點!否則後面不管是自己寫ros程序還是用別人開源的程序,調試起來會很麻煩。
ROS支持許多IDE開發,具體可以看wiki上的介紹。CLion是一個個人覺得非常好用的跨平臺c++IDE。搭建CLion開發環境後可以利用CLion運行和調試ros程序,十分方便,具體見CLion官方教程
其中需要註意的是,每次必須從終端利用bash打開CLion;或者要改一個桌面快捷方式文件,使其每次通過bash啟動,網上可以搜到解決方案。
另外,還可以配置下編譯路徑。CLion默認在cmake-build-debug或cmake-build-release文件夾保存編譯文件。可以通過File|Settings(Ctrl+Alt+S)|Build, Execution, Deployment|CMake改一下:
1.Generation path改為/home/name/catkin_ws/build
2.CMake options加上 -DCATKIN_DEVEL_PREFIX:PATH=/home/name/catkin_ws/devel
3.4 創建Publisher和Subscriber
這也是一個非常重要的一點!因為做slam會經常用到訂閱傳感器發布的話題,然後獲取各種傳感器數據並在程序中處理後,生成位姿與地圖,最終把結果按相應規定的數據格式發布出去。
基於C++寫一個ROS程序,深入理解發布和訂閱機制:
http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29
3.5 自定義話題消息
ROS的元功能包common_msgs提供了許多不同消息類型的功能包,如std_msgs、geometry_msgs、sensor_msgs等。當不能滿足自己程序的需求時,可以在項目下新建msg文件夾,並將自定義的消息類型文件.msg放於其中。然後更改package.xml和CMakeLists.txt文件即可。
話題消息編譯與編程語言無關。
3.6 創建Server和Client
類似可以自定義消息,你也可以將自定義服務數據.srv放置於新建的srv文件夾。
創建Server過程類似創建Subscriber,而創建Client類似創建Publisher。
3.7 分布式多機通信
非常常用,第五章會用到
需要配置IP地址和設置ROS_MASTER_URI
4. ROS中常用組件
4.1 launch啟動文件
利用xml文件同時啟動和配置多節點,避免了每次打開多個終端運行多個節點。
重要的節點屬性包括name/pkg/type/args/output等,其中:
<name>
定義節點運行的名稱,將覆蓋節點中init()賦予節點的名稱<pkg>
定義節點所在功能包名稱<type>
定義節點可執行文件名<args>
定義節點運行參數,可以有多個<output>
若值為screen表示節點標準輸出到終端屏幕,默認輸出為日誌文檔
參數設置:
<param>
類似變量聲明<rosparam>
直接加載整個yaml文件<arg>
類似launch文件內部的局部變量,僅限內部使用,與節點無關
這裏需要註意一個小問題。比如我的程序需要1個輸入參數(即argc=2),在使用launch文件後,程序參數個數變多了(即argc>2)。比如這是我的launch文件,可以看到我的程序需要1個輸入參數:
<launch>
<node
name="rgbdslam" pkg="rgbdslam" type="run_vo" args="$(find rgbdslam)/config/default.yaml"
output="screen"
/>
</launch>
但是,運行後程序的實際argv打印到屏幕如下,多了兩個參數。不過這個小問題影響不大,了解即可:
/home/gjh/catkin_ws/src/rgbdslam/bin/run_vo
/home/gjh/catkin_ws/src/rgbdslam/config/default.yaml
__name:=rgbdslam
__log:=/home/gjh/.ros/log/e840c676-1bca-11e9-b271-000c290958e7/rgbdslam-2.log
重映射:類似c++別名機制,如:
<remap from="/turtlebot/cmd_vel" to="/cmd_vel" />
另外,也可以使用終端完成重映射,如之前運行lsd-slam時就使用過這種方法:
rosrun lsd_slam_core live_slam image:=/image_raw camera_info:=/camera_info
嵌套復用。其中使用find命令查找當前包的路徑,如:
<include file="$(find mypackage)/launch/other.launch">
在launch中直接啟動master,參數還可以為restart或no:
<master auto="start"/>
4.2 TF坐標變換
# 一些TF工具
# 1.查看指定坐標系之間變換關系,即平移和旋轉
rosrun tf tf_echo <source_frame> <target_frame>
# 2.顯示TF樹信息,並保存為pdf
rosrun tf view_frames
# 3.其他
tf_monitor
static_transform_publisher
通過創建TF廣播器和TF監聽器,實現烏龜跟隨運動
4.3 Qt工具箱
日誌輸出工具 rqt_console
計算圖可視化工具 rqt_graph
數據繪圖工具 rqt_plot
參數動態配置工具 rqt_reconfigure
4.4 rviz可視化平臺
配置好rviz後,可以在file|save config as保存.rviz文件。然後使用-d參數加載配置文件,從而可以避免每次重新配置:
rosrun rviz rviz -d <path>/rvizfile.rviz
# for example
rosrun rviz rviz -d `rospack find turtle_tf`/rviz/rvizfile.rviz
或者還可以把這一步寫進launch文件中,更加方便!
4.5 rosbag數據記錄與回放
# 查看bag文件信息,時長duration,是否壓縮等
rosbag info <your bagfile>
# 解壓縮
rosbag decompress <your bagfile>
5.機器人平臺搭建
機器人組成:
- 執行機構。類似“手腳”
- 驅動機構。類似“肌肉和筋絡”。驅動板:電源子系統、電機驅動子系統、傳感器接口
- 傳感系統。類似“感官”。內部傳感器(裏程計、陀螺儀);外部傳感器(攝像頭、激光)
- 控制系統。類似“大腦”。處理器(使用樹莓派/PC等)、算法,與ROS相關較大
基於樹莓派控制系統
- 使用單處理器。直接使用PC+ROS,通過usb通信,但無法遠程監控。
- 使用多處理器(推薦)。兩臺PC/PC+嵌入式,無線網絡通信。
例子:利用PC控制MRobot移動,並配備傳感器。
嵌入式完成本地運動控制及傳感器數據采集,遠端PC完成遠程監控及復雜功能計算。
6.機器人建模與仿真
6.1 URDF統一機器人描述格式
<link>
機器人剛體部分外觀和物理屬性
<joint>
連接兩個剛體link,6種類型
<robot>
最頂層標簽,包含一系列link和joint
<gazebo>
不是必需,只在gazebo仿真時加入
6.2 創建機器人URDF模型
# 1.編寫urdf
# 2.檢查xml格式
check_urdf mrobot_chasssis.urdf
# 3.生成模型的整體結構圖
urdf_to_graphiz mrobot_chasssis.urdf
# 4.rviz中可視化
6.3 xacro優化urdf
原始urdf冗長重復,xacro進行改進。
可以使用常量定義、調用數學公式、使用宏定義(類似函數)以達到精簡目的。
6.4 添加傳感器模型
6.5 Gazebo仿真
rosrun gazebo_ros gazebo
如果沒有真實機器人,則需仿真。仿真前,需構建仿真環境。兩種方式:
- 直接insert模型. 需連外網,或把模型提前下載到指定目錄下;
- Building Editor. 在Edit菜單中
7.SLAM
8.ROS進階
9.ROS2
ROS學習筆記(持續更新)