ROS2/C++ 自定義訊息型別
首先注意一點,在ROS 2 dashing發行版裡面,只有C++的功能包可以自定義訊息型別;也就是說,在建立包的時候,只有選擇 ament_cmake方式建立的包才可以自定義訊息,但是python型別的功能包可以匯入由C++型別包建立的自定義訊息。
建立自定義訊息功能包
- 進入工作空間
cd ~/ros_ws/src
- 建立功能包
ros2 pkg create --build-type ament_cmake test_msgs
由於這個功能包只是生成自定義訊息型別,所以我一般都是不在這裡新增任何演算法,所以這個包裡面也沒有可執行檔案,因此不需要指定節點名字。
建立msg檔案
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
修改CMakelists檔案
在find_package(ament_cmake REQUIRED)下面新增:
find_package(builtin_interfaces 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_interfaces(${PROJECT_NAME} ${msg_files} DEPENDENCIES builtin_interfaces geometry_msgs std_msgs ADD_LINTER_TESTS)
ament_export_dependencies(rosidl_default_generators)
ament_export_dependencies(rosidl_default_runtime)
ament_export_include_directories(include)
修改package檔案
由於介面依賴rosidl_default_generators來生成特定於語言的程式碼,因此需要宣告對其的依賴。
在 <buildtool_depend>ament_cmake</buildtool_depend>下面新增:
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
編譯&檢視訊息
cd ../../..
# 編譯
colcon build --packages-select test_msgs
# 新增環境
source install/setup.bash
# 檢視msg資料
ros2 msg show test_msgs/msg/TestMsg
可以在終端看到我們定義的訊息型別
呼叫
Python呼叫
- 在package.xml裡新增
<exec_depend>test_msgs</exec_depend>
- 在原始檔裡新增
from test_msgs.msg import TestMsg
- 使用的時候
msg = TestMsg()
msg.x.append(1.0) // 加入msg裡有signal這個訊息
C++呼叫
- 在CMakeLists.txt裡面新增
find_package(test_msgs REQUIRED) # 根據你的名稱修改
ament_target_dependencies(${PROJECT_NAME}_node std_msgs rclcpp test_msgs)
- 在package.xml裡面新增
<depend>test_msgs</depend>
- 在原始檔中包含
特別注意,這裡的格式,訊息檔案是駝峰風格的命名方式,也就是通過大寫分割單詞,但是包含的時候要用下劃線風格,全部是小寫
#include "test_msgs/msg/test_msg.hpp"
- 使用的時候
publisher = this->create_publisher<test::msg::MyOwnNum>("test", 10);
相關文章
- ros|自定義訊息型別ROS型別
- 自定義型別型別
- 自定義資料型別資料型別
- 型別自定義格式字串型別字串
- DM自定義資料型別資料型別
- RocketMQ 常用訊息型別MQ型別
- RocketMQ 訊息整合:多型別業務訊息-普通訊息MQ多型型別
- WIN32傳送自定義訊息Win32
- RocketMQ 訊息整合:多型別業務訊息——定時訊息MQ多型型別
- Android 自定義構建型別 BuildTypeAndroid型別UI
- UnrealEngine建立自定義資產型別Unreal型別
- springmvc 自定義訊息轉換器完整例子SpringMVC
- Laravel 5.5 Validator 自定義錯誤返回訊息Laravel
- C# 泛型集合的自定義型別排序C#泛型型別排序
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- 兄弟連go教程(7)自定義型別Go型別
- C語言筆記——自定義型別C語言筆記型別
- Vector中存放自定義資料型別資料型別
- Laravel 使用 Easywechat 書寫自定義模板訊息丶廣播訊息頻道Laravel
- 如何在Mac上設定自定義鎖屏訊息?Mac
- 企業微信hook,自定義工具,收發訊息Hook
- Mybatis使用小技巧-自定義型別轉換器MyBatis型別
- Python 多程式的自定義共享資料型別Python資料型別
- 《Haskell趣學指南》筆記之自定義型別Haskell筆記型別
- 沒有學不會的C++:使用者自定義的隱式型別轉換C++型別
- 多型關聯自定義的型別欄位的處理多型型別
- 自主資料型別:在TVM中啟用自定義資料型別探索資料型別
- 5G訊息的三種型別型別
- C++教程-----C++變數型別和變數的定義C++變數型別
- 第11章 使用類——型別轉換(二)將自定義型別轉換為內建型別型別
- 還可以這麼玩?超實用 Typescript 內建型別與自定義型別TypeScript型別
- 一文說透WordPress的自定義文章型別型別
- BGP訊息型別和分組公有首部-VeCloud型別Cloud
- 訊息佇列Rabbitmq的交換器型別佇列MQ型別
- 微信公眾號開發(二)識別訊息型別型別
- 自定義錯誤型別時應該注意的 nil !=nil型別
- 09.AutoMapper 之自定義型別轉換器(Custom TypeAPP型別
- Kettle自定義資料庫連線型別連線HGDB資料庫型別