ros2 自定义消息类型
时间: 2025-04-21 21:45:22 AIGC 浏览: 54 评论: 5
### 定义和使用自定义消息类型
#### 创建功能包并配置 package.xml 文件
为了在 ROS2 中创建自定义消息类型,首先需要创建一个新的功能包。如果已经有一个现有的功能包,则可以直接在此基础上操作。
在 `package.xml` 文件中添加必要的依赖项:
```xml
<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>
```
这些设置确保了编译器能够识别并处理新的消息文件[^2]。
#### 修改 CMakeLists.txt 配置文件
接着,在 `CMakeLists.txt` 文件里加入如下指令以支持消息生成:
```cmake
find_package(ament_cmake REQUIRED)
find_package(rmw_implementation_cmake REQUIRED)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
endif()
find_package(builtin_interfaces REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(std_msgs REQUIRED)
set(msg_files "")
list(APPEND msg_files "msg/CustomMessage.msg")
rosidl_generate_interfaces(${PROJECT_NAME}
${msg_files}
DEPENDENCIES builtin_interfaces geometry_msgs std_msgs
)
```
这段脚本指定了要生成的消息文件路径以及它们所依赖的标准消息类型[^3]。
#### 编写自定义消息文件
假设要在名为 `my_custom_msg` 的目录下创建一个简单的自定义消息 `MyMsg.msg`:
```text
float64 data_field
string text_field
```
此文件描述了一个包含浮点数字段 (`data_field`) 和字符串字段 (`text_field`) 的新消息结构[^1]。
#### 构建工作空间
完成上述更改之后,通过命令行工具构建整个 Catkin 工作区:
```bash
colcon build --packages-select your_package_name
source install/setup.bash
```
这会触发对所有指定资源的重新编译过程,并使新定义的消息可用。
#### 发布与订阅自定义消息
一旦成功建立了自定义消息类型,就可以像常规方式一样编写节点程序来发布或接收此类消息实例。例如,在 Python 节点中发送一条 MyMsg 类型的信息:
```python
import rclpy
from my_custom_msg.msg import MyMsg
from rclpy.node import Node
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
self.publisher_ = self.create_publisher(MyMsg, 'topic', 10)
timer_period = 0.5 # seconds
self.timer = self.create_timer(timer_period, self.timer_callback)
def timer_callback(self):
msg = MyMsg()
msg.data_field = float('some value') # Replace with actual logic to set the field.
msg.text_field = str('example string')
self.publisher_.publish(msg)
def main(args=None):
rclpy.init(args=args)
minimal_publisher = MinimalPublisher()
rclpy.spin(minimal_publisher)
minimal_publisher.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
同样地,可以在另一个节点内实现对该主题的监听逻辑。
阅读全文
相关推荐




















评论

湯姆漢克
2025.07.11
提供了一个全面的ROS2自定义消息类型创建和使用流程,适合初学者。

玛卡库克
2025.07.11
指导了如何构建工作空间以使自定义消息生效,步骤清晰。

石悦
2025.06.07
详细说明了ROS2功能包创建和配置,有助于理解消息生成机制。

忧伤的石一
2025.04.27
演示了发布和订阅自定义消息的Python节点程序,易于实践操作。

shkpwbdkak
2025.03.27
通过具体的自定义消息文件示例,直观展示了消息结构的定义方法。