1. 程式人生 > >第一個hello ros程式

第一個hello ros程式

1  設定環境變數

      在使用者許可權下輸入以下命令

      

       每次啟動一個新的shell,且要在這個shell中執行ROS時,只要執行上述source命令,ROS就能順利工作。

      但是切換使用者或者新建一個shell時,且要繼續執行ros時,需要多次輸入source命令,過於重複

      為了解決上述弊端,為每個使用者的.bashrc檔案新增上述指令

      .bashrc  這個檔案主要儲存個人的一些個性化設定,如命令別名、路徑等。也即在同一個伺服器上,只對某個使用者的個性化設定相關。~/bashrc:為每一個執行bash shell的使用者執行此檔案.當bash shell被開啟時,該檔案被讀取。這個檔案是使用者目錄下的隱藏檔案,通過ls -a才能顯示。使用vim命令開啟.bashrc檔案。在檔案最後一行輸入source命令。按esc退出插入模式,輸入:wq退出vim。此時,任意開啟一個shell,只要使用者名稱是設定過的,如本例中的使用者a,那麼都可以直接執行ros相關命令

      

      

       

      

 


2 建立第一個小程式

2.1  建立工作區

        使用mkdir命令去建立一個目錄,稱之為工作區目錄;

        建立工作區目錄下的src資料夾,用於存放功能包的原始碼

      

            

2.2 建立功能包

       使用命令catkin_create_pkg建立一個在src下的功能包ling

    

       可見,在src目錄下多了一個資料夾ling,同時,在ling資料夾中又多了2個配置檔案;

       第一個配置檔案,叫做package.xml,即清單檔案;

       第二個檔案,叫做CMakeLists.txt,是一個Cmake的指令碼檔案,Cmake是一個符合工業標準的跨平臺編譯系統。這個檔案包含了一系列的編譯指令,包括應該生成哪種可執行檔案,需要哪些原始檔,以及在哪裡可以找到所需的標頭檔案和連結庫。當然,這個檔案表明catkin在內部使用了Cmake。

  

2.3 編寫hello.cpp檔案

      在ling目錄下,使用命令vim hello.cpp新建一個cpp檔案,同時新增以下內容,退出儲存(esc->:wq)

  

  ros::init函式初始化ROS客戶端庫。請在你程式的起始處呼叫一次該函式3。函式最後的引數是一個包含節點預設名的字串。

  ros::NodeHandle(節點控制代碼)物件是你的程式用於和ROS系統互動的主要機制4。建立此物件會將你的程式註冊為ROS節點管   理器的節點。最簡單的方法就是在整個程式中只建立一個NodeHandle物件。

  ROS_INFO_STREAM巨集將生成一條訊息,且這一訊息被髮送到不同的位置,包括控制檯視窗。

  此時可以發現資料夾ling下有3個檔案

 

2.4 編譯hello程式

2.4.1 宣告依賴庫

       首先,我們需要宣告程式所依賴的其他功能包。對於c++程式而言,此步驟是必要的,以確保catkin能夠向c++編譯
器提供合適的標記來定位編譯功能包所需的標頭檔案和連結庫。

    編輯包目錄下的CMakeLists.txt檔案。該檔案的預設版本含有如下行:find_package(catkin REQUIRED)

    

     所依賴的其他catkin包可以新增到這一行的COMPONENTS關鍵字後面,如下所示:

                     find_package(catkin REQUIRED COMPONENTS package-names)

     對於hello例程,我們需要新增名為roscpp的依賴庫,它提供了ROS 的C++客戶端庫。因此,修改後的find_package行如下所示:find_package(catkin REQUIRED COMPONENTS roscpp)

  

      我們同樣需要在包的清單檔案中列出依賴庫,通過使用build_depend (編譯依賴)和run_depend(執行依賴)兩個關鍵字實現:
                                             <build_depend>package-name</build_depend>
                                             <run_depend>package-name</run_depend>

   開啟package.xml檔案後,找到檔案偏下方的綠色字型<buildtool_depend>catkin</buildtoo;_depend>,在其後新增我們的依賴庫

   

       在清單檔案中宣告的依賴庫並沒有在編譯過程中用到;如果你在此處忽略它們,你可能不會看到任何錯誤訊息,直到釋出你的包給其他人,他們可能在沒有安裝所需包的情況下編譯你釋出的包而導致報錯。

2.4.2 宣告可執行檔案

       在CMakeLists.txt中新增兩行,來宣告我們需要建立的可執行檔案。其一般形式是:
                                         add_executable(executable-name source-files)
                                          target_link_libraries(executable-name ${catkin_LIBRARIES})

       第一行聲明瞭我們想要的可執行檔案的檔名,以及生成此可執行檔案所需的原始檔列表。如果你有多個原始檔,把它們列在此處,並用空格將其區分開

        第二行告訴Cmake當連結此可執行檔案時需要連結哪些庫(在上面的find_package中定義)。如果你的包中包括多個可執行檔案,為每一個可執行檔案複製和修改上述兩行程式碼。

      在我們的例程中,我們需要一個名為hello的可執行檔案,它通過名為hello.cpp的原始檔編譯而來。所以我們需要新增如下幾行程式碼到CMakeLists.txt中。注意:在CMakeLists.txt檔案中有很多註釋和例句,找到對應的例句,在其下方輸入我們要求的命令,儲存退出

   

2.4.3 編譯工作區

   使用下列命令在工作區目錄下編譯包中所有的可執行檔案 :catkin_make

  

   執行結果如下表示成功

  

  如果出現編譯出錯,找不到ros標頭檔案,錯誤截圖如下 

 

  此錯誤說明未正確包含標頭檔案,即是CMakeLists.txt檔案出錯,2個原因

   第一個原因是依賴項未正確宣告,以下是正確宣告(find_package部分)

  

   第二個原因是未包含標頭檔案路徑,即在CMakeLists.txt檔案中錯誤示例如下

  

 注意看綠色線段標明的一行,此行是包含標頭檔案路徑的命令列,此處是用#註釋掉的,即沒有包含,去掉前面的#號即可成功編譯

2.4.4   執行指令碼檔案

        執行名為setup.bash的指令碼檔案,它是catkin_make在你工作區的devel子目錄下生成的。source devel/setup.bash。這個自動生成的指令碼檔案設定了若干環境變數,從而使ROS能夠找到你建立的功能包和新生成的可執行檔案。。它類似於1.1節介紹的全域性setup.bash,但是是專門為你的工作區量身定做的。除非目錄結構發生變化,否則你只需要在每個終端執行此命令一次,即使你修改了程式碼並且用catkin_make執行了重編譯。為了使rosrun命令可以隨時找到你自己編寫的包,可以仿照1.1節將source語句新增到使用者的.bashrc

     

2.5 執行hello程式

      當所有這些編譯步驟完成後,新的ROS程式就可以使用rosrun來執行,就像任何其他ROS程式一樣。

      但是注意:任何ros程式在執行前都要保證roscore在執行

如果沒有執行節點管理器roscore,那麼就會報錯,如下


3 補充內容

3.1  source filename 與 sh filename 及./filename執行指令碼的區別

      當shell指令碼在當前使用者下具有可執行許可權時,用sh filename與./filename執行指令碼是沒有區別得。./filename是因為當前目錄沒有在PATH中,所有”.”是用來表示當前目錄的。
      sh filename 重新建立一個子shell,在子shell中執行腳本里面的語句,該子shell繼承父shell的環境變數,但子shell新建的、改變的變數不會被帶回父shell。
      source filename:這個命令其實只是簡單地讀取腳本里面的語句依次在當前shell裡面執行,沒有建立新的子shell。那麼腳本里面所有新建、改變變數的語句都會儲存在當前shell裡面。

3.2 為配置為檔案package.xml檔案新增依賴項的時候注意事項

        catkin支援兩種package.xml標籤格式,格式1標準說明是REP-0127,格式2標準說明是REP-0140

        格式1   <run_depend> (多個):執行時需要依賴的其它package,如動態連結庫、可執行檔案、Python模組、指令碼檔案等

                   <build_depend>:用於幫助使用本package的其它包傳遞依賴宣告

        格式2 <exec_depend>:相當於格式1的run_depend標籤。

                   <build_export_depend>:用於幫助使用本package的其它包傳遞依賴宣告

      在不同的版本中要採用對應的版本命令,如果用混將報以下錯誤

        

        

        如果在package.xml檔案的第二行有以下文字  format=“2”   則需要需要使用格式2,否則使用格式1

        


參考文獻:

https://blog.csdn.net/bluewhalerobot/article/details/73658162  【 catkin_make的時候發生了什麼】

https://blog.csdn.net/sukha/article/details/52460492【ROS原始碼分析--子話題-catkin】

https://blog.csdn.net/weixin_38500110/article/details/78448603【CMakeList.txt指令碼檔案及Cmake常用命令】

http://www.cnblogs.com/Jessica-jie/p/6706225.htmlROS兩種workspace :overlay rosbuild_ws->catkin_ws->ROS庫

https://blog.csdn.net/violet_echo_0908/article/details/52056071【Linux下source命令詳解】