ros2自定义消息
时间: 2025-05-01 18:31:05 AIGC 浏览: 38
### ROS2 中创建和使用自定义消息
#### 创建自定义 `.msg` 文件
为了在ROS2中创建自定义的消息类型,需先在一个已存在的包里或者新建立的包中添加`.msg`文件。此操作通常是在指定用于存储消息类型的子目录 `msg/` 下完成[^1]。
对于希望传递的数据结构,在该`.msg`文件中按照特定语法描述数据字段及其类型。例如,如果要创建一个名为 `CustomMessage.msg` 的消息来传输两个整数和一个字符串,则可以在文件中这样编写:
```text
int32 id
string name
float64 value
```
#### 更新 `package.xml`
为了让构建工具识别新的消息文件,需要编辑 `package.xml` 并加入依赖项 `<build_depend>message_generation</build_depend>` 和执行时依赖 `<exec_depend>message_runtime</exec_depend>` 来支持消息处理功能。
#### 修改 `CMakeLists.txt`
同样重要的是调整 `CMakeLists.txt` 配置文件以包含对新消息的支持。这涉及到设置变量 `PROJECT_MSG_FILES` 列表并调用宏指令 `rosidl_generate_interfaces()` 将其转换为目标语言接口代码。
```cmake
find_package(ament_cmake REQUIRED)
find_package(rmw_implementation_cmake REQUIRED)
if(NOT PROJECT_MSG_FILES)
set(PROJECT_MSG_FILES "")
endif()
list(APPEND PROJECT_MSG_FILES "${PACKAGE_SHARE_DIRECTORY}/msg/CustomMessage.msg")
rosidl_generate_interfaces(${PROJECT_NAME}
${PROJECT_MSG_FILES}
)
```
#### 实现发布者节点 (Publisher Node)
一旦完成了上述配置工作,就可以着手实现发布这些自定义消息的服务端程序了。下面是一个简单的Python版本的例子,展示了怎样实例化 Publisher 对象并通过它发送我们之前定义好的 `CustomMessage` 类型的信息给其他订阅者[^3]。
```python
import rclpy
from rclpy.node import Node
from my_custom_msg_module.msg import CustomMessage as MyMsgType
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
self.publisher_ = self.create_publisher(MyMsgType, 'topic', 10)
timer_period = 0.5 # seconds
self.timer = self.create_timer(timer_period, self.timer_callback)
self.i = 0
def timer_callback(self):
msg = MyMsgType()
msg.id = self.i
msg.name = f'Name_{self.i}'
msg.value = float(self.i * 0.1)
self.publisher_.publish(msg)
self.get_logger().info(f'Sending: {msg}')
self.i += 1
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()
```
#### 构建与测试
最后一步是编译整个项目,并通过命令行启动刚才写的发布者节点以及对应的监听器(Subscriber),以此验证一切正常运作。假设已经安装好了必要的环境并且处于正确的源码路径下,那么可以通过如下方式快速检验成果:
```bash
colcon build --packages-select your_package_name
source install/setup.bash
ros2 run your_package_name publisher_node_executable
```
同时打开另一个终端窗口运行订阅者的可执行文件来进行接收测试:
```bash
ros2 run learning_topic helloworld_sub
```
阅读全文
相关推荐



















