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型別
- 自定義訊息獲取訊息(轉)
- 自定義訊息和對訊息的理解
- 自定義NSNotification訊息中心
- 自定義型別型別
- VC增加自定義訊息 (轉)
- RocketMQ 訊息整合:多型別業務訊息-普通訊息MQ多型型別
- RocketMQ 訊息整合:多型別業務訊息——定時訊息MQ多型型別
- RocketMQ 常用訊息型別MQ型別
- 型別自定義格式字串型別字串
- 自定義資料型別資料型別
- Pl/SQL 自定義型別SQL型別
- ORACLE 自定義型別[轉]Oracle型別
- VC自定義訊息postmessage用法(訊息響應函式)函式
- WIN32傳送自定義訊息Win32
- Jquery實現自定義訊息彈窗jQuery
- 訊息型別快速配置型別
- DM自定義資料型別資料型別
- UnrealEngine建立自定義資產型別Unreal型別
- Linq to sql 自定義型別SQL型別
- 形形色色的自定義訊息(上) (轉)
- 形形色色的自定義訊息(下) (轉)
- 建立自定義塊 - 型別檢查型別
- springmvc 自定義訊息轉換器完整例子SpringMVC
- Laravel 5.5 Validator 自定義錯誤返回訊息Laravel
- Laravel 使用 Easywechat 書寫自定義模板訊息丶廣播訊息頻道Laravel
- C# 泛型集合的自定義型別排序C#泛型型別排序
- JumpList中Recent類別和自定義型別薦型別
- Android 自定義構建型別 BuildTypeAndroid型別UI
- MyBatis使用自定義TypeHandler轉換型別MyBatis型別
- C語言筆記——自定義型別C語言筆記型別
- 兄弟連go教程(7)自定義型別Go型別
- EF:自定義Oracle的對映型別Oracle型別
- SQL Server 中自定義資料型別SQLServer資料型別
- 如何在Mac上設定自定義鎖屏訊息?Mac
- 如何給FineReport設定自定義訊息提醒工具
- 訊息佇列Rabbitmq的交換器型別佇列MQ型別
- 5G訊息的三種型別型別