(轉)-編寫第一個ROS(創建工作空間workspace和功能包package)


原文網址:http://www.cnblogs.com/liuamin/p/5704281.html

剛接觸ROS,學着寫了第一個程序,怕以后忘記,就將其步驟記錄下來。。

首先你必須保證你電腦已安裝配置好ROS。

1.創建工作空間(workspace)

    我們所創建功能包package,應該全部放到一個叫做工作空間(workspace)的目錄中 。你可以把目錄存儲在你賬號的任何位置例如,我所創建的工作空間的是路徑/home,同時你可以用任何你喜歡的名字命名你的工作空間,我的工作空間名為 test,現在請使用標准的mkdir命令行去創建一個工作空間。我首先建立一個工作空間,名字為test,

此處創建的工作空間還需要在工作區目錄中創建一個叫做 src 的子目錄。這個子目錄將用於存放功能包的源代碼。而 代碼中的 “-p” ,這時mkdir命令會自動創建所有不存在的目錄。

在終端命令中鍵入(打開終端的快捷鍵為“Ctrl+Alt+T”)

 

mkdir -p ~/test/src

 

運行后你會發現你名為test的工作空間中已經有了一個src 的子目錄。這樣你的工作空間建立已經完成。

2.創建功能包(package)

創建一個新ROS功能包的命令應該在你工作空間中的src目錄下運 行:catkin_create_pkg package-name,package-name指的是你功能包的名字,我所創建的功能包名為amin,注意是在你工作空間中的src目錄下運行 (cd命令可以進入你要進入的目錄)繼續在終端中鍵入

cd ~/test/src

進入src目錄下運行

catkin_create_pkg amin

 

其實,這個功能包創建命令沒有做太多工作,它只不過創建了一個存放這個功能包的目錄(也就是我所創建的功能包amin),並在amin那個目錄下生成了兩個配置文件。
第一個配置文件,叫做 package.xml,稱為清單文件。

第二個文件,叫做 CMakeLists.txt,是一個 Cmake 的腳本文件,Cmake 是一個符合工業標准的跨平台編譯系統。這個文件包含了一系列的編譯指令,包括應該生成哪種可執行文件,需要哪些源文件,以及在哪里可以找到所需的頭文件和 鏈接庫。當然,這個文件表明 catkin 在內部使用了 Cmake。

注意:ROS 包的命名遵循一個命名規范,只允許使用小寫字母、數字和下划線,而且首字符必須是一個小寫字母。一些 ROS工具,包括 catkin,不支持那些不遵循此命名規范的包。

 

可以不看此處:編 輯清單文件 創建包后,你可能希望編輯其 package.xml 文件,其中包含一些描述這個包的元數據。通過 catkin_create_pkg 創建的功能包默認含有很豐富的注釋,對於讀者在很大程度上是不言自明的。然而,請注意,無論是在編譯時還是在運行時,其中的大部分信息 ROS 並沒有使用,這些信息只有在你公開發布代碼時才變得重要。本着保持文檔與實際功能同步的精神,至少填寫description 和 maintainer 兩部分可能是比較合理的。

3.編寫ROS程序

 

我編寫一個簡單的 hello,ros!的程序,命名為hello.cpp。這個名為 hello.cpp 的源文件 也 存 放 在 你 的 功 能 包 amin文 件 夾 中 , 挨 着 package.xml 和CMakeLists.txt。

 

注意:一些在線教程建議在你的功能包目錄中創建 src 目錄來存放 C ++源文件。這個附加的組織結構可能是有益的,特別是對於那些含有多種類型文件的較大的功能包,但它不是嚴格必要的。

 

復制代碼
#include <ros/ros.h>

int main ( int argc , char ** argv ) 
{
  ros::init ( argc , argv , "hello" ) ;
  ros::NodeHandle nh ;
  ROS_INFO_STREAM( " Hello , ROS! " ) ;
}
復制代碼

4.編譯 Hello 程序

我們該如何編譯和運行這個程序呢?這些交給ROS的catkin編譯系統來處理。

第一步:聲明依賴庫

 首先,我們需要聲明程序所依賴的其他功能包。對於 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)

我們同樣需要在包的清單文件package.xml 中列出依賴庫,通過使用build_depend (編譯依賴)和 run_depend(運行依賴)兩個關鍵字實現:格式如下:
<build_depend>package-name</build_depend>
<run_depend>package-name</run_depend>
在hello 程序在編譯時和運行時都需要 roscpp 庫,因此清單文件package.xml加入:

<build_depend>roscpp</build_depend>
<run_depend>roscpp</run_depend>

package.xml的打開方式用gedit打開如圖:

注意:然而,在清單文件中聲明的依賴庫並沒有在編譯過程中用到;如果你在此處忽略它們,你可能不會看到任何錯誤消息,直到發布你的包給其他人,他們可能在沒有安裝所需包的情況下編譯你發布的包而導致報錯。

第二步:聲明可執行文件

接下來,我們需要在 CMakeLists.txt 中添加兩行,來聲明我們需要創建的可執行文件。

其一般形式是:add_executable(executable-name source-files)                           此處executable-name為執行文件的名字(hello),source-files為源文件的名字(hello.cpp)

                      target_link_libraries(executable-name ${catkin_LIBRARIES})


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

第二行告訴 Cmake 當鏈接此可執行文件時需要鏈接哪些庫(在上面的 find_package 中定義)。如果你的包中包括多個可執行文件,為每一個可執行文件復制和修改上述兩行代碼。

在我的例程中,我們需要一個名為 hello 的可執行文件,它通過名為 hello.cpp 的源文件編譯而來。所以我們需要添加如下幾行代碼到 CMakeLists.txt 中:

add_executable(hello hello.cpp)
target_link_libraries(hello ${catkin_LIBRARIES})

第三步:編譯工作區

利用catkin_make這個命令進行編譯,注意必須從你的工作空間目錄運行,此命令時是進入你的工作空間目錄。

cd ~/test

catkin_make這個命令它將會完成一些配置步驟(尤其是你第一次運行此命令時),並且在你的工作區中創建 devel 和 build 兩個子目錄。這兩個新目錄用於存放和編譯相關的文件,例如自動生成的編譯腳本、目標代碼和可執行文件。如果你喜歡,當完成功能包的相關工作后(譯者注:即 完成了編寫、調試、測試等一系列工作后,此時代碼基本定型),可以放心地刪除 devel 和 build兩個子目錄。

catkin_make

運行完后你的工作空間目錄里多了devel 和 build 兩個子目錄。如圖為運行出來結果。


當然,有可能如 果 你 看 到 來 自 catkin_make 的編譯 錯 誤 , 提 示 無 法 找 到ros/ros.h 頭文件,或者 ros::init 等 ROS 函數未定義的錯誤,你會在執行此步驟時看見它們。最大的可能性是你的 CMakeLists.txt 沒有正確聲明對 roscpp的依賴。

在更正它們以后,你可以重新運行 catkin_make 來完成編譯工作。

5.執行hello程序

首先要啟動 roscore:這個程序是一個節點,節點需要一個節點管理器才可以正常運行。啟動節點管理器的命令:

roscore

啟動完節點管理器后,執行名為 setup.bash 的腳本文件,它是 catkin_make 在你工作區的 devel 子目錄下生成的。

這個自動生成的腳本文件設置了若干環境變量,從而使 ROS 能夠找到你創建的功能包和新生成的可執行文件。(也就是將程序注冊)

注意:除非目錄結構發生變化,否則你只需要在每個終端執行此命令一次,即使你修改了代碼並且用 catkin_make 執行了重編譯。

注意:此命令必須在你的工作空間目錄運行,進入你的工作空間目錄的命令上文提到過cd ~/test”,否則會出現“沒有那個文件或目錄”

source devel/setup.bash

最后一步,運行節點,用命令:使用格式為"rosrun package-name executable-name"   package-name 為功能包名稱, executable-name為可執行文件名稱

rosrun amin hello

運行結果如圖:

這樣一個簡單的ROS程序就完成了。。

參考:

https://www.cnblogs.com/huangjianxin/p/6347416.html

https://blog.csdn.net/yake827/article/details/44564057

http://www.mamicode.com/info-detail-1455818.html

https://www.cnblogs.com/huangjianxin/p/6347416.html

http://blog.exbot.net/archives/1413


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM