ROS学习笔记(2):自定义消息数据类型

ROS学习笔记(2):自定义messages

  • 一、创建自定义的message
    • 1、创建msg文件
    • 2、在package.xml文件中添加相应的依赖项和包
    • 3、在CMakeLists.txt添加编译选项
    • 4、成功编译并且生成.h文件
  • 二.调用自定义的message类型
    • 1、头文件添加 / 程序编写
    • 2、在CMakeLists.txt中添加生成可执行文件的命令行及其依赖的库文件
    • 3、运行

一、创建自定义的message

以下是一个将三个内置消息类型组合成一个自定义的message例子(这三个消息类型的定义都在package std_msgs里面):

1、创建msg文件

这里我们将重新创建一个功能包:

catkin_create_pkg learning_topic roscpp  std_msgs 

在功能包中新建一个msg文件夹,并且在msg文件夹中新建.msg文件

mkdir msg
touch my_Mark_Message.msg

接下来将下面自定义我们自己的消息数据类型,将下面内容写入.msg中

Header header
int32 demo_int
float64 demo_double

2、在package.xml文件中添加相应的依赖项和包

用于设置自定义消息编译和运行时的依赖,能把msg srv文件能转化成c++,py格式可编译执行

message_generation
message_runtime

3、在CMakeLists.txt添加编译选项

添加需要调用的package
find_package( … message_generation std_msgs)

指定.msg文件,写我们定义的.msg文件
add_message_files(FILES 文件名.msg)

指定生成新的message头文件需要的依赖项,这里的消息类型都是在std_msgs中的,添加以下语句:
generate_messages(DEPENDENCIES std_msgs)

最后设置运行的依赖项
catkin_package(… message_runtime)

4、成功编译并且生成.h文件

编译整个工作空间

catkin_make

生成的.h文件在工作空间的devel文件下的include文件

然后使用功能rosmsg show查看显示的消息类型是否与我们预想的一样:

rosmsg show example_ros_msg/ExampleMessage

(格式:rosmsg show 功能包名/.msg文件名字)

二.调用自定义的message类型

1、头文件添加 / 程序编写

要想在任意节点中调用自定义的message类型,需要在该节点的源代码中添加对应的package及包含的头文件,如下:

include 

(格式:include <功能包名/.h文件名>)

以下是一个调用刚刚我们自定义的message类型的节点程序:

#include 
#include 

int main(int argc, char **argv)
{
	//创建一个话题节点
	ros::init(argc,argv,"my_ros_message_publisher");
	//创建一个节点句柄
	ros::NodeHandle n;
	//创建一个发布者
        ros::Publisher my_publisher_object=n.advertise<my_message::my_Mark_Message>("my_message_topic",1);
 
 	//创建一个类型为my_message的变量
        my_message::my_Mark_Message my_new_message;
        
        //设置频率
        ros::Rate naptime(1.0);      
        
        //初始化各项参数的值
        my_new_message.header.stamp = ros::Time::now();
        my_new_message.header.seq   = 0;
        my_new_message.header.frame_id = "base_frame";
        my_new_message.demo_int = 1;
        my_new_message.demo_double = 100.0;
        
        double sqrt_arg; 
        
        while(1)
        {
        	//计算处理
        	my_new_message.header.seq++;
        	my_new_message.header.stamp = ros::Time::now(); 
        	my_new_message.demo_int*=2.0;
        	sqrt_arg = my_new_message.demo_double;
        	my_new_message.demo_double = sqrt(sqrt_arg);
        	//发布话题
        	my_publisher_object.publish(my_new_message);
        	
        	naptime.sleep(); 
	}
}

2、在CMakeLists.txt中添加生成可执行文件的命令行及其依赖的库文件

设置需要编译的代码和生成的可执行文件 / 设置链接库

add_executable(my_message_publishers src/my_message_publishers.cpp)

(格式 :add_executable(可执行文件/编译的代码.cpp) )

target_link_libraries(my_message_publishers ${catkin_LIBRARIES})

(格式: target_link_libraries(可执行文件 ${catkin_LIBRARIES}))

3、运行

最后,在catkin_make 编译完成后

rosrun my_message my_ros_message_publisher

(格式:rosrun 包名 节点名)

然后在另一个terminal中运行

rostopic echo example_topic

(格式:rostopic echo 话题名)

你可能感兴趣的:(ROS学习,linux,c++)