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;   
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值