【ros】2.ros的xx.msg编译
ros的使用:
mkdir rosworkspace cd rosworkspace mkdir src cd src catkin_init_workspace # 會在src/生成CMakeLists.txt cd .. # 退回到ros工作空間 catkin_make # 會在rosworkspace生成devel和build文件夾,build是編譯的中間文件,不用管。注意:如果之前編譯過,則需要把devel/和build文件夾刪除之后再catkin_make,否則可能不會編譯新添加的消息 source devel/setup.bash # 設置環境變量,也可以直接在.bashrc中永久設置環境變量,# 以后就不用每次編譯后都執行改設置環境變量這一步驟了 echo $ROS_PACKAGE_PATH # 檢查環境變量 # catkin_make install # 會在rosworkspace生成install文件夾。這一步可不用工作空間下有src,build,devel,install等文件夾
cd rosworkspace/src/ # 下面這句會在rosworkspace/src/下面生成一個功能包,功能包文件夾下會有include、src、CMakeLists.txt和package.xml catkin_create_pkg <功能包名> <依賴包1> <依賴包2> <依賴包3,4,5> cd <功能包名> mkdir msg # 在功能包目錄下創建一個msg文件夾,里面存放一些.msg文件 touch xx.msg touch xxxx.msg cd .. cd .. 退回到工作空間 catkin_make # 編譯,會把xx.msg編譯成xx.h,存放在devel/include/<功能包名>/下。 注意:如果之前編譯過,則需要把devel/和build文件夾刪除之后再catkin_make,否則可能不會編譯新添加的消息ros工作空間下,src/文件夾是自己創建的。src/下執行catkin_init_workspace后會生成一個CMakeLists.txt文件。
devel和build是執行catkin_make命令后生成的。
install目錄是通過catkin_make install命令生成的,該命令可以不用,因為他是在發布版時使用,
平時自己使用只需要用到devel即可,這兩個文件加內容基本相同。
catkin_create_pkg test_pkg std_msgs roscpp rospy sensor_msgs 創建一個test_pkg功能包,
它依賴std_msgs、 roscpp、 rospy、 sensor_msgs這幾個功能包
功能包創建命令執行后,會在src下面生成一個功能包,功能包文件夾下會有include、src、CMakeLists.txt和package.xml。
src是用來放置功能包代碼,包括cpp文件和其他的一些文件;inlude是用來放置頭文件;
CMakeLists.txt和package.xml是每個功能包必須存在的兩個文件。
以下是重點:
以安裝的kinetic版本的ros為例,
方法1:把生成的devel/include/功能包名/在root下拷貝到/opt/ros/kinetic/include/目錄下,然后自定義消息就和ros自帶的功能包(頭文件)在同一個目錄/opt/ros/kinetic/include/下了,就可以不用包含全路徑,只包含相對路徑即可。
方法2:
把source ros包的路徑/devel/setup.bash 添加到.bashrc中即可.
當調用xx.msg編譯后生成的xx.h文件中的類型時候,除了本文件需要#include xx.h頭文件,還需要注意調用時加上功能包名,
如 test_pkg::LightBox就是調用test_pkg功能包下的LightBox.h文件。LightBox就是我要用的類型。
一個.msg文件生成的.h文件就是一個類型。
編譯前需要修改的東西:
需要在功能包下的CMakeLists.txt和package.xml文件中添加內容后再編譯:
package.xml中添加:
如果還有別的依賴,但是在catkin_create_pkg創建功能包命令時沒有添加該依賴,也可以在這個package.xml里面新增。
CMakeLists.txt中加:
find_package()中添加一個message_generation,必須的,否則catkin_make會編譯出錯,添加示例如下:
add_message_files()中添加功能包中msg/文件夾下自定義的幾個xx.msg文件
generate_messages()打開注釋
catkin_package()打開其中一行CATKIN_DEPENDS的注釋,并在后面加上一個message_runtime依賴
對于添加xx.msg文件,如果像文件中默認的那樣會很麻煩,如下:
## Generate messages in the 'msg' folder add_message_files(FILESMessage1.msgMessage2.msg )每增加一個xx.msg文件都會需要在CMakeLists.txt中的這個位置添加對應的xx.msg。
推薦使用下面的方法:
file(GLOB_RECURSE MSG_FILES msg/*.msg) foreach(MSG ${MSG_FILES})get_filename_component(FILE_NAME ${MSG} NAME)list(APPEND ALL_MSG ${FILE_NAME}) endforeach() message(STATUS "$msg is: ${ALL_MSG}")add_message_files(FILES${ALL_MSG} )總結
以上是生活随笔為你收集整理的【ros】2.ros的xx.msg编译的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【ros】1.ros的安装
- 下一篇: 【ros】4.rosbag的相关用法