【从0开始自动驾驶】ros2编写自定义消息 msg文件和msg文件嵌套

详细解答和讨论请私信

在工作空间内新建一个功能包

ros2 pkg create --build-type ament_cmake test_msg

可以看见创建了一个名为test_msg的功能包
cd到功能包内,创建msg文件夹

cd test_msg
mkdir msg

在msg内创建对应的msg文件

需要注意的是:

  • ROS2中的msg文件应大写字母开头
  • msg文件中的header,在ros2中需写成std_msgs/Header
  • msg文件名不支持下划线
  • msg文件中的变量定义不支持大写字母
  • msg文件名首字母应大写 msg文件中不应有=的赋值操作

创建名为TestMsg.msg的文件

- 此次创建的msg文件存在自定义msg的引用,即文件中的TestSubMsg

int64 x
TestSubMsg test_sub

创建名为TestSubMsg.msg的文件(在前一个msg文件中引用)

float32 test

在这里插入图片描述

修改CmakeList.txt

添加如下内容
注意!

  • 若msg文件内使用了自定义的msg格式,则编译时应先加入自定义msg格式
find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/TestSubMsg.msg"
  "msg/TestMsg.msg"
 )

在这里插入图片描述

修改package.xml文件

添加如下内容

<build_depend>rosidl_default_generators</build_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

编译

注意!!!
一定要停用conda环境

conda deactivate
conda deactivate
conda deactivate

直接编译整个包

colcon build

在这里插入图片描述

在这里插入图片描述

详情、交流请直接联系作者wx:nangua0963

### ROS 中创建使用复杂自定义消息结构体 #### 定义复杂的自定义消息文件 为了在ROS中创建复杂的自定义消息结构体,首先需要编辑`.msg`文件。这些文件通常位于包内的`msg/`目录下。对于更复杂的数据结构,可以通过组合基本数据类型其他已有的消息类型来构建新的复合型消息。 例如,假设要创建一个名为 `ComplexMessage.msg` 的复杂消息,该消息包含多个字段: ```plaintext string name geometry_msgs/Pose pose sensor_msgs/Image[] images float64[3] dimensions ``` 上述例子展示了如何在一个消息嵌套其他标准库中的消息类型(如 `geometry_msgs/Pose` `sensor_msgs/Image`),同时也支持数组形式的变量声明以及固定长度数组的定义[^1]。 #### 修改 CMakeLists.txt 文件 为了让系统识别新添加的消息文件并为其生成必要的接口代码,在项目的根目录下的 `CMakeLists.txt` 文件里需加入如下配置: ```cmake find_package(rosidl_default_generators REQUIRED) rosidl_generate_interfaces(${PROJECT_NAME} "msg/ComplexMessage.msg" ) ``` 这段脚本指定了项目名称,并列出了所有待处理的消息文件路径。注意这里的 `${PROJECT_NAME}` 应替换为实际的包名;同时确保已经找到了 `rosidl_default_generators` 这个依赖项以便能够调用其提供的宏命令[^3]。 #### 编写 Python 或 C++ 节点程序 一旦完成了 `.msg` 文件的设计与注册工作,则可以在编写节点时利用这些自定义消息类型来进行通信。下面是一个简单的Python订阅者示例,用于接收前面提到的那种复杂消息类型的实例化对象: ```python import rclpy from std_msgs.msg import String from my_custom_msg.msg import ComplexMessage def callback(complex_message): node.get_logger().info('Received complex message: "%s"' % complex_message.name) rclpy.init() node = rclpy.create_node('complex_subscriber') subscription = node.create_subscription( ComplexMessage, 'topic_name', callback, 10 ) rclpy.spin(node) node.destroy_node() rclpy.shutdown() ``` 此段代码片段展示了一个典型的ROS2节点初始化流程,其中包括导入所需的模块、设置回调函数以响应接收到的信息流,并最终进入循环等待事件触发[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值