iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 9
0
Software Development

ROS進階學習筆記系列 第 9

Day 09 - ROS中的CMakeList.txt

昨天寫了package.xml,今天不免俗的就來寫CMakeList.txt吧!
其實平常有在開發大型專案的人應該對CMakeList.txt不陌生,所以其實這篇不會ros的人也可以看,只是我會比較著重在ros官網有介紹的部分囉~ ros主要使用的編譯器是catkin,所以其編寫的方式也會遵從catkin的規則。

CMakeList.txt 架構

CMakeList.txt是CMake編譯系統用來編譯檔案的描述檔,其內會定義要如何編譯專案的程式以及相應的函式庫,而ROS的專案所需要的格式必須遵從下列幾項規則,並且需要照順序編寫:

  1. CMake的版本 (cmake_minimum_required)
  2. Package名稱 (project())
  3. 其他相依的package(find_package())
  4. 支援python的設定(catkin_python_setup())
  5. 建立Message/Service/Action的檔案 (add_message_files(), add_service_files(), add_action_files())
  6. 編譯上述message/service/action時需要用到的相依模組 (generate_messages())
  7. 編譯上述package時需要用到的模組資訊 (catkin_package())
  8. 主要編譯的函式庫/執行檔等,以及其需要相依的函式庫(add_library()/add_executable()/target_link_libraries())
  9. 測試檔編譯 (catkin_add_gtest())
  10. Install時的規則 (install())

雖然官網寫上述10點都是必須遵守的規則,但是筆者實際在撰寫cmakelist的時候少了4.9.10都還是可以正常執行呦~XD

cmake 版本

這個就是每個CMakeList.txt的起手式啦! 先定義好cmake編譯的版本,若使用catkin編譯,所需使用的是2.8.3以上的版本。

cmake_minimum_required(VERSION 2.8.3)

Package/project 名稱

在ros內,一個package基本上等同於一個專案(project),也就是平常下rosrun / roslaunch / roscd 後面接著的package名稱,在這邊定義。

project(project_name)

其他相依的package(find_package())

find_package是cmake原生有的功能,在這邊可以寫編寫此專案的時候會用到的其他相依模組,通常在我們下catkin_create_package後面加的package會直接被加入這裡面,例如:

find_package(catkin REQUIRED COMPONENTS     
             roscpp
             rospy
             std_msgs
)

支援python的設定(catkin_python_setup())

如果你寫的這個package包含一些需要用到的python模組,就需要寫個setup.py檔並且加入這行:

catkin_python_setup()

但是筆者我平常寫c++的node比較多,還真的沒加過這行呢(´・ω・`)

建立Message/Service/Action的檔案 (add_message_files(), add_service_files(), add_action_files())

message, service, action都是ros會用到的功能,需要透過下列三個格式進行編譯以後才有辦法拿來用在package中呼叫,不同檔名都需放在對應的資料夾內,例如msg檔要放在msg的資料夾中,以此類推,這樣cmakelist才連接得到該msg。

## Generate messages in the 'msg' folder
add_message_files(
  FILES
  message_name.msg
)

## Generate services in the 'srv' folder
add_service_files(
  FILES
  service_name.srv
)

## Generate actions in the 'action' folder
add_action_files(c86
  FILES
  action_name.action
)

編譯上述message/service/action時需要用到的相依模組 (generate_messages())

在編譯msg/srv/action時會用到的msg格式,例如最常用的std_msgs、sensor_msgs等,需要列在generate_messages底下:

## Generate added messages and services with any dependencies listed here
generate_messages(
  DEPENDENCIES
  std_msgs
  geometry_msgs
)

雖然筆者很想把cmakelist在一天內寫完,無奈社畜的空閒時間實在不多,而且cmakelist認真要寫的話真的可以寫一串出來XD 所以我們明天繼續吧~

Reference

http://wiki.ros.org/catkin/CMakeLists.txt
https://www.itread01.com/content/1548087310.html


上一篇
Day 08 - package.xml 的奧妙
下一篇
Day 10 - ROS中的CMakeList.txt (2)
系列文
ROS進階學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言