首先注意一點,在ros 2 dashing發行版裡面,只有c++的功能包可以自定義訊息型別;也就是說,在建立包的時候,只有選擇 ament_cmake方式建立的包才可以自定義訊息,但是python型別的功能包可以匯入由c++型別包建立的自定義訊息。
進入工作空間
cd ~/ros_ws/src
建立功能包
ros2 pkg create --build-type ament_cmake test_msgs
由於這個功能包只是生成自定義訊息型別,所以我一般都是不在這裡新增任何演算法,所以這個包裡面也沒有可執行檔案,因此不需要指定節點名字。
cd test_msgs
mkdir msg
gedit testmsg.msg
testmsg.msg檔案內容如下:
float32 x
float32 y
注意事項:
testmsg.msg:檔名一定要以大寫開頭;
檔案中的變數一定全部都要小寫,不能有大寫出現;同時也不要出現特殊符號
在c++呼叫該標頭檔案時候,會以下劃線區分大寫,例如上面的檔案編譯得到後,在c++呼叫時如下:
#include 「test_msgs/msg/test_msg.hpp」
vector的定義是在資料型別後面增加乙個方括號[ ]
可以用自己定義的資料型別作為變數的資料型別,例如在另乙個msg檔案中定義這樣的乙個變數:
testmsg position
在find_package(ament_cmake required)下面新增:
find_package(builtin_inte***ces required)
find_package(geometry_msgs required)
find_package(rosidl_default_generators required)
find_package(std_msgs required)
set(msg_files
"msg/testmsg.msg"
)rosidl_generate_inte***ces($ $ dependencies builtin_inte***ces geometry_msgs std_msgs add_linter_tests)
ament_export_dependencies(rosidl_default_generators)
ament_export_dependencies(rosidl_default_runtime)
ament_export_include_directories(include)
由於介面依賴rosidl_default_generators來生成特定於語言的**,因此需要宣告對其的依賴。
在 ament_cmake下面新增:
>
rosidl_default_generatorsbuild_depend
>
>
rosidl_default_runtimeexec_depend
>
>
rosidl_inte***ce_packagesmember_of_group
>
cd
../../..
# 編譯
colcon build --packages-select test_msgs
# 新增環境
source install/setup.bash
# 檢視msg資料
ros2 msg show test_msgs/msg/testmsg
可以在終端看到我們定義的訊息型別
在package.xml裡新增
test_msgs
在原始檔裡新增
from test_msgs.msg import testmsg
使用的時候
msg = testmsg(
)1.0
)// 加入msg裡有signal這個訊息
在cmakelists.txt裡面新增
find_package(test_msgs required) # 根據你的名稱修改
ament_target_dependencies($_node std_msgs rclcpp test_msgs)
在package.xml裡面新增
>
test_msgsdepend
>
在原始檔中包含
特別注意,這裡的格式,訊息檔案是駝峰風格的命名方式,也就是通過大寫分割單詞,但是包含的時候要用下劃線風格,全部是小寫
#include
"test_msgs/msg/test_msg.hpp"
使用的時候
publisher =
this
->create_publisher
("test",10
);
ROS 自定義訊息型別 c
一 msg 用於發布 訂閱的通訊方式中。在包的src同級目錄下建立msg資料夾。在 sg資料夾中,建立.msg檔案 例 my msg.msg 編輯my msg.msg檔案 int32 data1 string data2 編輯package.xml 新增依賴 message generation m...
ROS 自定義訊息型別方法
1 在package中新建資料夾名為msg 2 在msg資料夾中建立訊息 此處以my msg.msg 為例,注意的是要以msg為字尾名 內容舉例如下 int32 data1 float64 data2關於訊息內容,需要注意的是如果型別錯誤,那麼將不能生成標頭檔案。例如float64寫成了float,...
自定義srv訊息之ros
在ros中,如果沒有現成的訊息型別來描述要去傳遞的訊息時,我們會自定義訊息。我們會新建乙個package來去自定義訊息,通常這個package寫任何的業務邏輯,只是用來宣告自定義的訊息型別,可以只定義一種訊息型別,也可以定義多種訊息型別,根據業務需求來定。所以,首先我們單獨的建立乙個package,...