ROS2/C++ 自定义消息类型

本文详细介绍了在ROS 2 dashing中如何创建并使用自定义C++消息类型,包括创建功能包、定义msg文件、修改CMakelists和package文件,以及在Python和C++中调用这些消息的步骤。文中强调了文件命名规范和消息类型的使用注意事项。

首先注意一点,在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文件中定义这样的一个变量:

                
要将自定义消息类型通过UDP发送,需要按以下步骤进行操作: 1. 定义自定义消息类型ROS中,自定义消息类型通常是通过.msg文件定义的。您可以使用ROS提供的标准消息类型,也可以自己定义消息类型。例如,假设您希望定义一个名为“my_message”的自定义消息类型,可以按照以下步骤进行操作: - 在ROS工作空间中创建一个名为“my_message”的包。 - 在该包中创建一个名为“msg”的文件夹。 - 在“msg”文件夹中创建一个名为“MyMessage.msg”的文件。 - 在该文件中定义您的自定义消息类型,例如: ``` Header header uint16 id float32 x float32 y ``` 2. 生成消息源代码 在定义自定义消息类型后,需要使用ROS的消息生成工具生成消息源代码。运行以下命令: ``` $ cd <catkin_ws> $ catkin_make ``` 该命令将自动生成消息源代码,并将其放在“<catkin_ws>/devel/include”目录中。 3. 编写发送程序 现在,您可以编写发送程序来发送自定义消息类型。在ROS中,您可以使用ROS的发布者(Publisher)来发送消息。以下是一个简单的发送程序示例: ``` #include <ros/ros.h> #include <my_message/MyMessage.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/socket.h> #include <unistd.h> int main(int argc, char **argv) { ros::init(argc, argv, "udp_publisher"); ros::NodeHandle nh; // 创建UDP套接字 int sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock < 0) { perror("socket"); return 1; } // 设置目标地址和端口号 struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(12345); addr.sin_addr.s_addr = inet_addr("127.0.0.1"); // 创建ROS发布者 ros::Publisher pub = nh.advertise<my_message::MyMessage>("my_topic", 1000); // 发送消息 while (ros::ok()) { my_message::MyMessage msg; // 填充消息 msg.id = 1; msg.x = 1.0; msg.y = 2.0; pub.publish(msg); // 将消息序列化为字节数组 uint8_t buffer[1024]; ros::serialization::OStream stream(buffer, sizeof(buffer)); ros::serialization::serialize(stream, msg); // 发送消息 if (sendto(sock, buffer, stream.getLength(), 0, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("sendto"); return 1; } // 等待1秒 ros::Duration(1.0).sleep(); } // 关闭UDP套接字 close(sock); return 0; } ``` 在该程序中,我们首先创建了一个UDP套接字,并设置目标地址和端口号。然后,我们创建了一个ROS发布者,并在循环中发送自定义消息类型。在发送消息之前,我们将消息序列化为字节数组,并使用sendto()函数将其发送到目标地址。 4. 运行程序 在编写发送程序后,您可以使用ROS的运行工具(如roslaunch)来启动程序。在启动之前,请确保ROS主节点已经运行。运行以下命令: ``` $ roslaunch my_package udp_publisher.launch ``` 在程序运行时,它将定期发送自定义消息类型。您可以使用ROS的订阅者(Subscriber)来接收该消息。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值