ROS之msg文件定义以及自定义发布主题消息类型

一、创建msg文件(相当于一个结构体)

  • 在catkin_ws/src: mkdir msg
  • catkin_ws/src/msg: touch xxx.msg chmod 777 xxxx.msg
  • 编辑msg文件(定义数组):
    **float32[] X
    float32[] Y
    float32[] Z**
  • 打开package.xml文件,确保里面存在这两行且去掉它们的注释:
    message_generation
    message_runtime
  • 打开包src目录下的CMakeLists.txt文件,然后打开包目录下的CMakeLists.txt
    文件,在find_message调用中添加message_generation依赖,让你可以生成ROS信息。
    如下所示,括号里添加一项message_generation即可
    ***find_package(catkin REQUIRED COMPONENTS
    roscpp
    rospy
    std_msgs
    message_generation
    )

  • 确保你加入了message_runtime 依赖,如图所示:

这里写图片描述

  • 接着在add_message_files 里面去掉注释,改为:
    add_message_files(
    FILES
    Num.msg //编辑的msg文件名
    )
  • 保证generate_messages()函数被调用:去掉注释,修改为:
    generate_messages(
    DEPENDENCIES
    std_msgs
    )
  • catkin_make编译会自动生成xxxx.h头文件(路径:devel/include/xxxx.h)

总结:

  • 在msg目录下使用msg文件语法定义一个msg
  • 修改CmakeLists.txt,在find_package调用中,添加message_generation依赖
  • 修改CmakeLists.txt,在catkin_message下添加message_runtime依赖
  • 修改CmakeLists.txt,去掉add_message_files注释,添加我们自己定义的msg文件
  • 修改CmakeLists.txt,去掉generate_messages()的注释

二、使用msg文件

  • catkin_make编译完之后,rosmsg show beginner_tutorials/xxx会得到:
    float32[] X
    float32[] Y
    float32[] Z
  • 在需要用到msg文件中自定义的类型的文件中加入编译该文件时自动生成的xxx.h头文件,如:#include “ControlRobot/RobotControl.h”,其中ControlRobot 是该msg文件所处的包的名称。

*注意:msg文件自定义数据类型其实就是一个结构体类型,所以使用的时候就是相当于定义一个结构体成员变量
struct stu{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在学习小组
float score; //成绩
}stu1,stu2;*
三、自定义发布消息的类型
这里举一个例子:
RobotControl.msg:(相当于定义了一个含有三个一维数组作为成员的结构体类型)
float32[] X
float32[] Y
float32[] Z

TestPublish.cpp:

#include "ControlRobot/RobotControl.h"
nt main(int argc, char **argv){

  ros::init(argc, argv,"TestPublish");
  ros::NodeHandle n;
  ros::Publisher cordinate_pub = n.advertise<ControlRobot::RobotControl>("RobotCordinate",1000);    //发布的主题名称 (定义了消息发布类型:ControlRobot::RobotControlros::Rate loop_rate(10);
  while(ros::ok()){
    ControlRobot::RobotControl RobotCordinate; //相当于定义了一个结构体变量
    RobotCordinate.X.resize(6);                       //一定要定义数组大小,否则会出现段错误
    RobotCordinate.Y.resize(6);
    RobotCordinate.Z.resize(6);
    for(int i = 0; i<6; i++){
    RobotCordinate.X[i] = i;                       //Kinect获取的骨骼坐标赋值后发布出去(在此处赋值)
    RobotCordinate.Y[i] = i;
    RobotCordinate.Z[i]=  i;
    }
    cordinate_pub.publish(RobotCordinate);
    ros::spinOnce();
    loop_rate.sleep();

  }
return 0;   
}
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS中,使用.msg文件定义消息类型。具体步骤如下: 1. 在ROS包中创建一个名为msg文件夹。 2. 在msg文件夹中创建一个名为*.msg文件,其中*为你所定义消息类型名称。 3. 在*.msg文件定义消息类型的字段和类型。例如,定义一个包含字符串和整数字段的消息类型可以写作: ``` string name int32 age ``` 4. 在CMakeLists.txt文件中添加以下代码: ``` add_message_files( FILES *.msg ) generate_messages( DEPENDENCIES std_msgs ) ``` 其中,add_message_files()函数将*.msg文件添加到ROS包中,generate_messages()函数根据*.msg文件生成对应的消息类型代码。 5. 在package.xml文件中添加以下代码: ``` <build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend> ``` 这些代码声明了消息生成器(message_generation)和消息运行时(message_runtime)的依赖项。 6. 编译ROS包。在ROS包的根目录下运行以下命令: ``` catkin_make ``` 编译成功后,将生成一个msg_gen_cpp文件夹,其中包含自动生成的消息类型代码。 7. 在ROS节点中使用自定义消息类型。 在ROS节点中使用自定义消息类型时,需要包含消息类型的头文件,并使用该消息类型的变量进行消息传递。例如,使用上面定义消息类型可以写作: ``` #include <ros/ros.h> #include <your_package_name/your_message_type_name.h> int main(int argc, char **argv) { ros::init(argc, argv, "your_node_name"); ros::NodeHandle nh; your_package_name::your_message_type_name msg; msg.name = "John"; msg.age = 30; ros::Publisher pub = nh.advertise<your_package_name::your_message_type_name>("your_topic_name", 10); pub.publish(msg); ros::spin(); return 0; } ``` 这个例子中,我们使用了自定义消息类型your_message_type_name,将消息发布到your_topic_name话题上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值