ROS2/C++ 自定義訊息型別

moriarty_jack發表於2020-12-07

首先注意一點,在ROS 2 dashing發行版裡面,只有C++的功能包可以自定義訊息型別;也就是說,在建立包的時候,只有選擇 ament_cmake方式建立的包才可以自定義訊息,但是python型別的功能包可以匯入由C++型別包建立的自定義訊息。

建立自定義訊息功能包

  1. 進入工作空間
cd ~/ros_ws/src
  1. 建立功能包
ros2 pkg create --build-type ament_cmake test_msgs

由於這個功能包只是生成自定義訊息型別,所以我一般都是不在這裡新增任何演算法,所以這個包裡面也沒有可執行檔案,因此不需要指定節點名字。

建立msg檔案

cd test_msgs
mkdir msg
gedit TestMsg.msg

TestMsg.msg檔案內容如下:

float32[] x
float32[] y 

注意事項:

  1. TestMsg.msg:檔名一定要以大寫開頭;
  2. 檔案中的變數一定全部都要小寫,不能有大寫出現;同時也不要出現特殊符號
  3. 在C++呼叫該標頭檔案時候,會以下劃線區分大寫,例如上面的檔案編譯得到後,在c++呼叫時如下:
#include “test_msgs/msg/test_msg.hpp”
  1. vector的定義是在資料型別後面增加一個方括號[ ]
  2. 可以用自己定義的資料型別作為變數的資料型別,例如在另一個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呼叫

  1. 在package.xml裡新增
<exec_depend>test_msgs</exec_depend>
  1. 在原始檔裡新增
from test_msgs.msg import TestMsg
  1. 使用的時候
msg = TestMsg()
msg.x.append(1.0) // 加入msg裡有signal這個訊息

C++呼叫

  1. 在CMakeLists.txt裡面新增
find_package(test_msgs REQUIRED) # 根據你的名稱修改
ament_target_dependencies(${PROJECT_NAME}_node std_msgs rclcpp test_msgs)
  1. 在package.xml裡面新增
<depend>test_msgs</depend>
  1. 在原始檔中包含

特別注意,這裡的格式,訊息檔案是駝峰風格的命名方式,也就是通過大寫分割單詞,但是包含的時候要用下劃線風格,全部是小寫

#include "test_msgs/msg/test_msg.hpp" 
  1. 使用的時候
publisher = this->create_publisher<test::msg::MyOwnNum>("test", 10);

相關文章