ROS : 修改ROS原始碼(overlaying package)
ROS官方或者其他個人提供了很多package供大家使用,但是隨著學習的深入,很多人可能想去修改這些package的原始碼,ROS提供了一種稱之為overlaying的機制。它允許ROS原有安裝的package和你修改的package共存,譬如安裝ROS的時候已經安裝了用於二維SLAM的gmapping包,但是你要修改原始碼,而又想儲存好ROS原已安裝的,ROS執行的時候還要能夠找到你修改的那個package,而不是使用原裝的,這時候overlaying機制就派上用場了。
該部落格分為兩部分:
(1) 用ros_tutorials package作為例子講解overlaying機制的使用
(2) 如何overlaying gmapping包
這篇部落格中我們將覆蓋ros官方的ros_tutorials 包,如果你沒用安裝過這個包,請先進行如下準備工作:
1.安裝ros_tutorials
-
$ sudo apt-get install ros-groovy-ros-tutorials
這個包中包含了ROS的一些教程,如用於模擬的漁龜turtlesim等。接下來我們看看這個包安裝到了哪裡?在終端中輸入:
-
$ roscd rospy_tutorials $ pwd
/opt/ros/hydro/share/rospy_tutorials
我們自己如果想要改動這個程式碼該如何做呢?
ROS的overlaying機制華麗登場:
在學習此篇部落格的時候,博主猜想讀者您應該熟練使用ROS做了一些工作了,這時候的你已經有了一個catkin工作空間(如LZ的 catkin_ws),在這個工作空間中(catkin_ws/src)已經有了很多你自己或者其他網友提供的package(如usb_cam,beginner_tutorials)。為了overlaying 工作的進行,博主強烈建議另外再新建一個catkin空間,專門用來做覆蓋原始package的工作
-
$ mkdir -p ~/overlay_ws $ cd ~/overlay_ws
-
$ mkdir -p ~/overlay_ws/src $ cd ~/overlay_ws/src $ wstool init
-
$ git clone git://github.com/ros/ros_tutorials.git $ wstool update
如圖所示:
複製進來之後,按找以前學習的步奏應該就是使用catkin_make編譯這個檔案了。但是這裡是要overlay,也就是覆蓋原來的package,好讓ROS執行的時候能夠找到我們自己修改了的這個package。在做準備工作的時候,我們已經知道ros_tutorials 安裝在ROS安裝資料夾(/opt/ros/hydro)下。所以我們要先source一下這個環境,說明我們要覆蓋的ros_tutorials在那個環境中:
-
$ source /opt/ros/hydro/setup.bash
注意:這一步其實沒必要做,因為安裝ROS的時候,我們已經把這句話寫到了/.bashrc檔案中,每次啟動終端時會自動呼叫這句命令。不信的話,你可以使用gedit ~/.bashrc命令來開啟在這個檔案,看它的最後一行。但是,這裡強調這一步是為了告訴你,有時候你要覆蓋的package可能是在你自己的另一個catkin工作空間中(如catkin_ws),如你的工作空間catkin_ws中有一個自己的機器人驅動包robot_dirver,然後你也想在overlay_ws空間中覆蓋他,進行一些修改再進行試驗,那你就要使用如下的source來說明一下原有的package所在的環境了,更詳細的請參考ROS官方wiki裡的第四部分chaining catkin worksapces:
$ source ~/caktin_ws/devel/setup.bash宣告完你要覆蓋的package所處的環境以後,就可以編譯了
-
$ cd ~/overlay_ws/ $ catkin_make
在使用這前,別忘了source overlay_ws這個工作空間:
-
$ source ~/overlay_ws/devel/setup.bash
-
$ roscd rospy_tutorials $ pwd
~/overlay_ws/src/ros_tutorials/rospy_tutorials
這個時候結果很明顯,但是ROS原裝的那個/opt/ros/hydro裡的那個ros_tutorials也還存在,如果你不想呼叫自己修改了的,而去用原裝的package那怎麼做?
很簡單,只要不使用source overlay_ws,而是使用source /opt/ros...就行,總結起來如下:
$ source /opt/ros/hydf/setup.bash $ roscd rospy_tutorials $ pwd /opt/ros/hydro/share/rospy_tutorials $ source ~/overlay_ws/devel/setup.bash $ roscd rospy_tutorials $ pwd /home/<user>/overlay_ws/src/ros_tutorials/rospy_tutorials以上博文記錄瞭如何覆蓋簡單的package,內容絕大部分都來自ROS官方wiki,LZ只是加入了一些簡單的理解。 那如何覆蓋gmapping?
其實覆蓋gmapping包步奏和上面的沒有區別,這裡主要是理清gmapping包中迷惑大家的地方。如果你去gmapping的ROS wiki官方頁面,你會發現有兩個包gmapping和openslam_gmapping,如下圖所示:
這很容易讓初學者迷惑,為啥有兩個?
這是由於gmapping演算法實現的正宗原始碼是來自開源專案openslam,ROS的開發者提供了gmapping包和openslam_gmapping包,他們作用各不相同。其中openslam_gmapping是gmapping創始者Grisetti開發的對外開放的gmapping庫,裡面有各種函式和介面供使用者呼叫。而ROS中的gmapping包是ROS開發者呼叫openslam_gmapping 中的函式而完成gmapping的所有功能(包括讀取資料(scan,odom),處理資料(粒子濾波,scan match 等),釋出資料(map,tf關係等) ),openslam_gmapping包可以理解為opencv,gmapping包可以理解為用opencv中函式實現的一個機器視覺工程。
因此要修改真正的gmapping演算法,應該去修改openslam_gmapping中的東西。當然也許你也只是想改改gmapping包而不去修改SLAM原演算法,譬如將gmapping得到的最優粒子的軌跡記錄到txt中等。所以在overlay gmapping時,同時把兩個包都覆蓋:
開啟一個新的終端,輸入如下命令:
$ cd ~/overlay_ws/src $ git clone https://github.com/rosperception/openslam_gmapping.git$ git clone https://github.com/ros-perception/slam_gmapping.git$ wstool update $ source /opt/ros/hydro/setup.bash $ cd ~/overlay_ws $ catkin_make
編譯完以後,沒有錯誤,就可以按自己需要對gmapping程式碼進行修改了,只是每次要是想呼叫自己修改的gmapping程式碼,要記得source一下overlay_ws工作環境,然後再呼叫就行了。
reference: