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

来源:互联网 发布:中国微观数据库简介 编辑:程序博客网 时间:2024/06/15 12:49

一、创建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;   }
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝买东西限购怎么办 淘宝被别人登录怎么办 淘宝被厂家投诉怎么办 买家退货说是假货怎么办 同行给差评怎么办 被买家举报了怎么办 淘宝商品被屏蔽怎么办 电脑处于离线状态怎么办 计算机处于离线状态怎么办 交易猫安全提醒怎么办 网吧进游戏代码怎么办 车票冲突买不了怎么办 苹果8淘宝打不开怎么办 我的淘宝打不开怎么办 福袋不支持退货怎么办 不支持跨区下单怎么办 支付宝被占用怎么办 淘宝东西失效了怎么办 访客突然下降了怎么办 淘宝店铺广告违规怎么办 苹果手机网速差怎么办 支付宝账号忘记怎么办 支付宝无法登录怎么办 什么是淘宝空间不足怎么办 支付宝授权失败怎么办 买家旺旺被打标一次怎么办 淘宝网上忘记密码怎么办 登淘宝忘记密码怎么办 手机淘宝闪退怎么办 证券账户忘了怎么办 资金账户忘了怎么办 公积金账户忘了怎么办 淘宝买家号违规怎么办? 淘宝号显示违规怎么办 淘宝网登录不了怎么办 支付宝刷脸登录失败怎么办 blue超出注册限制怎么办 电脑不识别光盘怎么办 4g按钮打不开怎么办 我电脑没有光驱怎么办 电脑360浏览器打不开怎么办