ROS學習(五):構建系統

     ROS的構建系統默認使用CMake(Cross Platform Make),其構建環境在功能 包目錄中的CMakeLists.txt文件中描述。在ROS中,CMake被修改爲適合於ROS的 “catkin” 構建系統。

     在ROS中使用CMake的是爲了在多個平臺上構建 ROS功能包。因爲不同於只支持 Unix系列的Make,CMake支持Unix類的Linux、BSD和OS X以外,還支持Windows 系列。並且,它還支持Microsoft Visual Studio,也還可以輕鬆應用於Qt開發。此外, catkin 構建系統可以輕鬆使用與ROS相關的構建、功能包管理和功能包之間的依賴關係。

一.創建功能包

     創建ROS功能包的命令如下。

“catkin_create_pkg”命令在創建用戶功能包時會生成catkin 構建系統所需的 CMakeLists.txt和package.xml文件的包目錄。讓我們來創建一個簡單的功能包,以鞏 固理解。首先打開一個新的終端窗口(Ctrl + Alt + t)並運行以下命令移至工作目錄。 

 

 

要創建的功能包名稱是“my_first_ros_pkg”。ROS中的功能包名稱全部是小寫字 母,不能包含空格。格式規則是將每個單詞用下劃線(_)而不是短劃線( - )連接起 來。有關ROS編程,請參閱相關頁面的編碼風格47 48和命名約定。那麼下面使用以下命令 創建一個名爲my_first_ros_pkg的功能包:

     上面用“std_msgs”和“roscpp”作爲前面命令格式中的依賴功能包的選項。這 意味着爲了使用ROS的標準消息包std_msgs和客戶端庫roscpp(爲了在ROS中使用C/ C++),在創建功能包之前先進行這些選項安裝。這些相關的功能包的設置可以在創建功 能包時指定,但是用戶也可以在創建之後直接在package.xml中輸入。

     如果已經創建了功能包,“~/catkin_ws/src”會創建“my_first_ros_pkg”功能 包目錄、ROS功能包應有的內部目錄以及CMakeLists.txt和package.xml文件。用戶 可以用下面的“ls”命令來檢查內容,並使用類似Windows資源管理器的基於GUI的 Nautilus來檢查功能包的內部。

 

 

 二.修改功能包配置文件(package.xml)

     必要的ROS配置文件之一的package.xml是一個包含功能包信息的XML文件,包括 功能包名稱、作者、許可證和依賴功能包。最初沒有做任何修改的原始文件如下:

 

 下面是對每個語句的說明。

 

 

修改了功能包配置文件(package.xml),如下所示。也可以根據自己的 環境進行修改。如果還不熟悉,可以鍵入以下內容:

 三.修改構建配置文件(CMakeLists.txt)

ROS的構建系統catkin基本上使用CMake,並在功能包目錄中的CMakeLists.txt 文件中描述構建環境。在這個文件中設置可執行文件的創建、依賴包優先構建、連接器 (linker)的創建等等。

 

 

 

 

  構建配置文件(CMakeLists.txt)中的每一項如下所示。第一條是操作系統中安 裝的cmake的最低版本。由於它目前被指定爲版本2.8.3,所以如果使用低於此版本的 cmake,則必須更新版本。

cmake_minimum_required(VERSION 2.8.3)

project項是功能包的名稱。只需使用用戶在package.xml中輸入的功能包名即可。 請注意,如果功能包名稱與package.xml中的<name>標記中描述的功能包名稱不同,則 在構建時會發生錯誤,因此需要注意。

project(my_first_ros_pkg)

find_package項是進行構建所需的組件包。目前,roscpp和std_msgs被添加爲依賴 包。如果此處沒有輸入功能包名稱,則在構建時會向用戶報錯。換句話說,這是讓用戶先 創建依賴包的選項。

find_package(catkin REQUIRED COMPONENTS 

          roscpp 

          std_msgs

)

    以下是使用ROS以外的功能包時使用的方法。例如,使用Boost時,必須安裝system 功能包。功能如前面的說明,是讓用戶先創建依賴功能包的選項。

find_package(Boost REQUIRED COMPONENTS system)

    catkin_python_setup( )選項是在使用Python,也就是使用rospy時的配置選項。其 功能是調用Python安裝過程setup.py。 catkin_python_setup()

    add_message_files是添加消息文件的選項。FILES將引用當前功能包目錄的msg目 錄中的*.msg文件,自動生成一個頭文件(*.h)。在這個例子中,我們將使用消息文件 Message1.msg和Message2.msg。

add_message_files(

FILES

Message1.msg

Message2.msg

)

add_service_files是添加要使用的服務文件的選項。使用FILES會引用功能包目錄 中的srv目錄中的*.srv文件。在這個例子中,用戶可以選擇使用服務文件Service1.srv和 Service2.srv。

add_service_files(

FILES

Service1.srv

Service2.srv )

    generate_messages是設置依賴的消息的選項。此示例是將DEPENDENCIES選項設 置爲使用std_msgs消息包。

generate_messages( 

DEPENDENCIES 

std_msgs

)

generate_dynamic_reconfigure_options是使用dynamic_reconfigure時加載要 引用的配置文件的設置。

generate_dynamic_reconfigure_options( 

cfg/DynReconf1.cfg 

cfg/DynReconf2.cfg

)

    以下是catkin 構建選項。INCLUDE_DIRS表示將使用INCLUDE_DIRS後面的內部 目錄include的頭文件。LIBRARIES表示將使用隨後而來的功能包的庫。

   CATKIN_DEPENDS後面指定如roscpp或std_msgs等依賴包。目前的設置是表示依 賴於roscpp和std_msgs。DEPENDS是一個描述系統依賴包的設置。

catkin_package(

INCLUDE_DIRS include

LIBRARIES my_first_ros_pkg

CATKIN_DEPENDS roscpp std_msgs

DEPENDS system_lib

)

    include_directories是可以指定包含目錄的選項。目前設定爲${catkin_INCLUDE_ DIRS},這意味着將引用每個功能包中的include目錄中的頭文件。當用戶想指定一個額 外的include目錄時,寫在${catkin_INCLUDE_DIRS}的下一行即可。

include_directories( 

${catkin_INCLUDE_DIRS}

)

    add_library聲明構建之後需要創建的庫。以下是引用位於my_first_ros_pkg功能包 的src目錄中的my_first_ros_pkg.cpp文件來創建my_first_ros_pkg庫的命令。

add_library(my_first_ros_pkg 

     src/${PROJECT_NAME}/my_first_ros_pkg.cpp )

    add_dependencies是在構建該庫和可執行文件之前,如果有需要預先生成的有依賴 性的消息或dynamic_reconfigure,則要先執行。以下內容是優先生成my_first_ros_ pkg庫依賴的消息及dynamic reconfigure的設置。

add_dependencies(my_first_ros_pkg ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

     add_executable是對於構建之後要創建的可執行文件的選項。以下內容是引用src/ my_first_ros_pkg_node.cpp文件生成my_first_ros_pkg_node可執行文件。如果有多 個要引用的*.cpp文件,將其寫入my_first_ros_pkg_node.cpp之後。如果要創建兩個以 上的可執行文件,需追加add_executable項目。

add_executable(my_first_ros_pkg_node src/my_first_ros_pkg_node.cpp)

    如前面描述的add_dependencies一樣,add_dependencies是一個首選項,是在構 建庫和可執行文件之前創建依賴消息和dynamic reconfigure的設置。下面介紹名爲my_ first_ros_pkg_node的可執行文件的依賴關係,而不是上面提到的庫。在建立可執行文 件之前,先創建消息文件的情況下會經常用到。

add_dependencies(my_first_ros_pkg_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

    target_link_libraries是在創建特定的可執行文件之前將庫和可執行文件進行鏈接的 選項。

target_link_libraries(my_first_ros_pkg_node

    ${catkin_LIBRARIES}

)

    此外,還提供了創建官方發行版ROS功能包時使用的Install項目和用於單元測試的 Testing項目。 筆者如下修改了構建配置文件(CMakeLists.txt)。可以根據情況進行修 改。有關如何使用它的更多信息,請參閱https://github.com/ROBOTIS-GIT上發佈的 TurtleBot3和OP3功能包,相信會對大家有用。
 

 四.編寫源代碼

    在上述CMakelists.txt文件的可執行文件創建部分(add_executable)中,進行了以 下設置。

 add_executable(hello_world_node src/hello_world_node.cpp)

 換句話說,是引用功能包的src目錄中的hello_world_node.cpp源代碼來生成hello_ world_node可執行文件。由於這裏沒有hello_world_node.cpp源代碼,我們來寫一個 簡單的例子。

首先,用cd命令轉到功能包目錄中包含源代碼的目錄(src),並創建hello_world_ node.cpp文件。這個例子使用gedit編輯器,但是您可以使用自己的編輯器,比如vi、 gedit、qtcreator、vim或者emacs。

$ cd ~/catkin_ws/src/my_first_ros_pkg/src/

$ gedit hello_world_node.cpp

之後如下修改代碼。

 五.構建功能包

    所有構建功能包的準備工作都已完成。在構建之前,使用以下命令更新ROS功能包的 配置文件。這是一個將之前創建的功能包反映在ROS功能包列表的命令,這並不是必選操 作,但在創建新功能包後更新的話使用時會比較方便。

$ rospack profile

下面是catkin構建。移動到catkin工作目錄後進行catkin構建。

$ cd ~/catkin_ws && catkin_make

 六.運行節點

    如果構建無誤,那麼將在“~/catkin_ws/devel/lib/my_first_ros_pkg”中生成 “hello_world_node”文件。

    下一步是運行該節點,打開一個終端窗口(Ctrl + Alt + t)並在運行該節點之前先運 行roscore。請注意,運行roscore後,ROS中的所有節點都可用,除非退出了roscore, 否則只需運行一次。

$ roscore

    最後,打開一個新的終端窗口(Ctrl + Alt + t)並使用以下命令運行節點。這是在名 爲my_first_ros_pkg的功能包中運行名爲hello_world_node的節點的命令。

$ rosrun my_first_ros_pkg hello_world_node

   運行這個節點的時候,可以在終端窗口中看到以hello world!0,1,2,3 ... 作爲 字符串發送的消息。這不是一個實際的消息傳遞,但可以看作是討論的構建系統的結 果。由於旨在說明ROS的構建系統,因此對於消息和節點的源代碼將在後面的博客中 將更詳細地討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章