一、创建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::RobotControl )
ros::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;
}