1. 程式人生 > >ROS學習筆記(持續更新)

ROS學習筆記(持續更新)

獲取 fin camera screen targe dsl duration ria 復雜

之前已經接觸過一些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學習筆記(持續更新)