ROS 自定义消息类型

引言

学习ROS的过程中,在话题的发布与订阅之间,我一直在思考,我们能不能定义自己的话题名,甚至在编写我们自己的ROS软件包时,定义我们自己的消息类型。

首先能不能定义自己的话题名

     当然可以,在ROS中,消息的传递是通过话题、服务的方式进行的,其中很大一部分都是通过节点发布话题、订阅话题实现的。 在进行话题的订阅和发布时,其实,话题名 就是订阅者和发布者双方约定的一个暗号,(只要记住,发布者和订阅者定义成一样,剩下的事情就交给节点管理器吧)。
     所以话题名,你想怎么定义就怎么定义,只要发布者和接收者双方协商好就好。只不过我们常常使用别人的ros功能软件包,所以就只好把我们的节点中的订阅者/发布者定义的话题名写成别人软件包的,不得已呀!, 当然我们要自己搞一个订阅者与我们自己的发布者进行通信,当然可以自己定义啦~
而且在launch文件中还有一个话题重映射的功能,我们可以把别人原本好好的订阅-发布的话题,从中间劈一刀,插入一个我们自己的话题,对它进行修改。

//自定义话题非常简单,想定义什么就在“×××”中写什么就行,
ros::Publisher str_pub = nh.advertise<std_msgs::String>("test_topic", 10);  //话题名可以自己定义
//要注意两点:
# 1、订阅和发布要对应
# 2、要想好你的话题要携带什么消息,也就是前面紧跟的消息类型

能不能定义自己的消息类型

    首先明确在ROS中,消息的载体是 话题,我们要真真想要传递的消息内容实际上是通过话题的发布->订阅,从而进行消息的发送和接收的。话题我们都可以自己定义,我们当然可以自己定义。

    当我们使用别人的话题是,当然也要使用它的消息类型,当我们自己定义话题,大多数也是使用别人的消息类型。(因为毕竟要和别人的节点通信吗,仅仅话题一样,消息不一样哪行),所以自定义消息类型的情况比较少,但是也还是能用得到的,所以这个技能还是要会的。

怎么定义自己的消息类型

1、首先在软件包目录下 新建一个 msg文件夹,并且新建一个消息类型文件
mkdir ~/roswork_space/src/hello_ros/msg
cd ~/roswork_space/src/hello_ros/msg
touch my_msg.msg
或者直接 vim ~/roswork_space/src/hello_ros/msg/my_msg.msg

2、编辑你想要的消息类型

int32 A
int32 B
int32 C

常见的ros消息中包含的类型有
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] and fixed-length array[C]
Header(包含一个timestamp和坐标系信息)

3、编辑软件包下的CMakeLists.txt文件

find_package(catkin REQUIRED COMPONENTS
message_generation roscpp geometry_msgs

add_message_files(FILES my_msg.msg) //根据自己的消息写

generate_messages(DEPENDENCIES
std_msgs)

catkin_package(
CATKIN_DEPENDS
message_runtime
)

4、编辑package.xml文件

<build_depend>message_generation</build_depend>
<build_export_depend>message_generation</build_export_depend>
<exec_depend>message_runtime</exec_depend>

编译 后检查
rosmsg show hello_ros/my_msg
int32 A
int32 B
int32 C


使用简例

自定义话题的实例 发布&订阅

#include "ros/ros.h"
#include "std_msgs/String.h" // for std_msgs::String message
#include<sstream> //for stringstream对象

int main(int argc, char *argv[])
{
ros::init(argc, argv, “pub_string_node”);
ros::NodeHandle nh;
ros::Publisher str_pub = nh.advertise<std_msgs::String>(“string_msg“, 1000); //话题名可以自己定义

ros::Rate rate_loop(10);
while (ros::ok())
{
std_msgs::String str_msg; //消息不可以随便定义
std::stringstream ss;
ss << “I am s test stream”;
str_msg.data = ss.str();
//ROS_INFO(“I send (%s)”, str_msg.data.c_str());
ROS_INFO(“I send (%s)”, str_msg.data.c_str());
str_pub.publish(str_msg);
ros::spinOnce();
rate_loop.sleep();
}
return 0;
}


#include "ros/ros.h"
#include "std_msgs/String.h"

void messageCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO(“I heard: [%s]”, msg->data.c_str());
}

int main(int argc, char **argv)
{
ros::init(argc, argv, “sub_string_node”);
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe(“string_msg“, 10, messageCallback);
ros::spin(); //一直授权订阅
return 0;
}


自定义消息类型,自己发布&订阅

#include "ros/ros.h"
#include "hello_ros/test_msg.h" //虽然是test_msg.msg,这里却是.h

int main(int argc, char *argv[])
{
ros::init(argc, argv, “pub_num_node”);
ros::NodeHandle nh;
ros::Publisher num_pub = nh.advertise(“add_num_msg”, 10); //话题名可以自己定义,

hello_ros::test_msg num; //定义消息
ros::Rate rate_loop(10);
while (ros::ok())
{
static int i;
i++;
num.A = i;
num.B = i;
num.C = i;
num_pub.publish(num);
ros::spinOnce();
rate_loop.sleep();
}
return 0;
}


#include "ros/ros.h"
#include "hello_ros/test_msg.h" //虽然是test_msg.msg,这里却是.h

void messageCallback(const hello_ros::test_msg::ConstPtr& msg)
{
ROS_INFO(“I heard: A=%d,B=%d,C=%d sum=[%d]”,msg->A,msg->B,msg->C,msg->A+msg->B+msg->C);
//这里只做求和,表示简单的处理
}

int main(int argc, char **argv)
{
ros::init(argc, argv, “sub_num_node”);
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe(“add_num_msg”, 10, messageCallback);
ros::spin(); //一直授权订阅
return 0;
}

注意,自定义消息的时候,要添加test_msg.msg文件,并且修改CMakeLists.txt和package.xml

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ROS中,你可以通过自定义消息类型来定义自己的消息结构。以下是一些创建自定义消息类型的步骤: 1. 在ROS工作空间的`src`目录中创建一个新的包(如果还没有): ``` $ cd ~/catkin_ws/src $ catkin_create_pkg my_custom_msgs std_msgs rospy roscpp ``` 这个命令将在`src`目录中创建一个名为`my_custom_msgs`的新包,并将其依赖于`std_msgs`、`rospy`和`roscpp`。 2. 在`my_custom_msgs`包的目录中创建一个名为`msg`的文件夹: ``` $ cd my_custom_msgs $ mkdir msg ``` 3. 在`msg`文件夹中创建一个`.msg`文件,用于定义你的自定义消息类型。例如,创建一个名为`MyCustomMessage.msg`的文件: ``` $ touch MyCustomMessage.msg ``` 4. 在`MyCustomMessage.msg`文件中定义你的消息结构。例如: ``` float32 value string name uint32[] data ``` 这个例子定义了一个包含一个浮点数、一个字符串和一个无符号整数数组的消息。 5. 编译你的包: ``` $ cd ~/catkin_ws $ catkin_make ``` 6. 在ROS中使用你的自定义消息类型。在你的ROS节点代码中,包含自动生成的消息头文件,并使用`<包名>/<消息类型>`的格式引用你的消息类型。例如,在Python中使用自定义消息类型: ```python from my_custom_msgs.msg import MyCustomMessage # 创建一个自定义消息类型的实例 my_message = MyCustomMessage() my_message.value = 1.23 my_message.name = "custom_message" my_message.data = [1, 2, 3, 4, 5] ``` 这样,你就可以在ROS中定义和使用自己的自定义消息类型了。记得在修改完消息类型后重新编译你的包。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一銤阳光

希望分享的内容对你有帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值