1. 程式人生 > >ROS : 修改ROS原始碼(overlaying package)

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
可以看到這個package和大多數ROS原裝的package一樣,放在了ROS安裝時的資料夾裡。

       我們自己如果想要改動這個程式碼該如何做呢?

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
建立好以後(其實就只是建了個新資料夾),再新建/src資料夾,並使用wstool
  • $ mkdir -p ~/overlay_ws/src
    $ cd ~/overlay_ws/src
    $ wstool init
接下來,就是將ros_tutorials package複製到這個新的工作空間中(overlay_ws/src):
  • $ 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
          到此,所有的工作已經完成,接下來呼叫ros_tutorials這個包試試,

在使用這前,別忘了source overlay_ws這個工作空間:

  • $ source ~/overlay_ws/devel/setup.bash
接下來看看呼叫ros_tutorials包,ROS會呼叫哪個?
  • $ 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: