#创建自定义topic
前面我们学了用C++和Python创建发布者与订阅者,这次我们创建自定义的话题,其实同C++实现topic差不多,都是编写.cpp文件。步骤有点多且繁琐,务必耐心跟上。
1、创建topic工作包
第一步仍然是在工作空间里的src文件夹下新建工作包,同样,没有工作空间则新建。
新建工作空间的方法:
![在这里插入图片描述](https://img-blog.csdnimg.cn/93de4a87ea404844bbbc3c5c3bbe2c30.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX-S4ieWygQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
有工作空间的跳过上图那步,直接进入src文件夹
lzw08@ubuntu:~$ cd ros_ws/src
lzw08@ubuntu:~/ros_ws/src$ catkin_create_pkg custom_message roscpp rospy std_msgs
![在这里插入图片描述](https://img-blog.csdnimg.cn/e4ea67be49624e1ca437abbb32cd971f.png)
这次我们创建的工作包的包名是“custom_message”,旁边的topic和turtle是我之前创建的另外两个工作包。同样,我们这次创建的工作包的依赖依旧是roscpp、rospy、std_msgs。
2、进入工作包创建msg文件
首先创建msg文件夹,用来存放我们自定义消息的相关代码:
lzw08@ubuntu:~/ros_ws/src$ cd custom_message/
lzw08@ubuntu:~/ros_ws/src/custom_message$ mkdir msg
然后在msg文件夹中创建.msg文件
lzw08@ubuntu:~/ros_ws/src/custom_message$ cd msg
lzw08@ubuntu:~/ros_ws/src/custom_message/msg$ touch custom.msg
lzw08@ubuntu:~/ros_ws/src/custom_message/msg$ gedit custom.msg
gedit是打开文件的命令,将下列代码粘贴到.msg文件中:
string name
int32 age
int32 num
bool handsome
float32 Price
粘贴之后字体颜色无变化,保存然后关闭即可。
3、回到上级目录,第一次修改编译规则
lzw08@ubuntu:~/ros_ws/src/custom_message/msg$ cd ..
lzw08@ubuntu:~/ros_ws/src/custom_message$ gedit CMakeLists.txt
右下角把“显示行号”打开,具体修改见下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/d18467ef16f349c196b7c5831c7d5c8d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX-S4ieWygQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/8bdeaf1043864d53a83d62de67e9fdfc.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/a55ae7378a9d4e53a790b63a9cd40de9.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/4869247788c8431a8906a7131924328d.png)
具体我改了 第5行、第14行、第51~55行(除了54)、第109行。
改完之后保存然后关闭即可。
4、回到工作空间第一次编译
这次编译目的是产生.h文件,最好是打开工作空间看着.h文件生成,体会这个过程。在工作空间里面的devel文件夹里面,原来是没有“include”这个文件夹的,编译完就会出现,然后一直点进去,会发现生成了一个.h文件,我们仅需观察“include”文件夹的生成,然后进去查看.h文件是否有生成即可。
lzw08@ubuntu:~/ros_ws/src/custom_message$ cd ../..
lzw08@ubuntu:~/ros_ws$ catkin_make
![在这里插入图片描述](https://img-blog.csdnimg.cn/4023cf7cacce48ba829463f961fe2aa5.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX-S4ieWygQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
![在这里插入图片描述](https://img-blog.csdnimg.cn/71f6203dcf914a269671782c7023bab7.png)
5、编写话题的发布者与订阅者
进入工作包里面的src(注意不是工作空间那个),创建.cpp文件
1)创建pcustom.cpp并粘贴代码
lzw08@ubuntu:~/ros_ws$ cd src/custom_message/src
lzw08@ubuntu:~/ros_ws/src/custom_message/src$ touch pcustom.cpp
lzw08@ubuntu:~/ros_ws/src/custom_message/src$ gedit pcustom.cpp
#include <custom_message/custom.h>
#include <iostream>
#include <ros/ros.h>
#include <std_msgs/Int32.h>
int main(int argc, char **argv)
{
ros::init(argc, argv,"pcustom");
ros::NodeHandle n;
ros::Publisher topic_publisher=n.advertise<custom_message::custom> ("topic_msg",1000);
ros::Rate loop_rate(1);
setlocale(LC_ALL,"");
int count=0;
while(ros::ok())
{
custom_message::custom msg;
msg.name="XQ";
msg.age=10;
msg.num=count;
msg.handsome=true;
msg.Price=1123.05+count;
ROS_INFO("发布⾃定义消息 name:%s,age:%d,num:%d,ishandsome:%d,Price:%f",msg.name.c_str(), msg.age, msg.num, msg.handsome,msg.Price);
topic_publisher.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
粘贴完成后保存关闭
2)创建scustom.cpp并粘贴代码
lzw08@ubuntu:~/ros_ws/src/custom_message/src$ touch scustom.cpp
lzw08@ubuntu:~/ros_ws/src/custom_message/src$ gedit scustom.cpp
#include <custom_message/custom.h>
#include <iostream>
#include <ros/ros.h>
#include <std_msgs/Int32.h>
void number_callback(const custom_message::custom::ConstPtr& msg)
{
ROS_INFO("接收⾃定义消息 name:%s,age:%d,num:%d,ishandsome:%d,Price:%f",msg->name.c_str(), msg->age, msg->num, msg->handsome,msg->Price);
}
int main(int argc, char **argv)
{
ros::init(argc,argv,"scustom");
ros::NodeHandle n;
setlocale(LC_ALL,"");
ros::Subscriber talk_subscribe=n.subscribe("topic_msg",10, number_callback);
ros::spin();
return 0;
}
粘贴完成后保存关闭
6、回到上级目录第二次修改编译规则
lzw08@ubuntu:~/ros_ws/src/custom_message/src$ cd ..
lzw08@ubuntu:~/ros_ws/src/custom_message$ gedit CMakeLists.txt
![在这里插入图片描述](https://img-blog.csdnimg.cn/4a877456bcd940a683af9b8a17be7be2.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/cd804196e51c4144bb68de61d6f64356.png)
同样地,因为有两个.cpp文件,所以就有两个add_executable和两个target_link_libraries。打开行号跟着改就行了。
7、回到工作空间第二次编译
lzw08@ubuntu:~/ros_ws/src/custom_message$ cd ../..
lzw08@ubuntu:~/ros_ws$ catkin_make
编译完成后进度条显示100%,没有错误就可以运行了。
8、运行
同理,运行C++节点前要先把主节点运行起来(主节点都需要打开一个新终端让它单独运行)
![在这里插入图片描述](https://img-blog.csdnimg.cn/d9b5ff99858c44cc9bd8e97f81816fe1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX-S4ieWygQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
运行pcustom.cpp,运行前需要先进行环境配置
lzw08@ubuntu:~/ros_ws source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ rosrun custom_message pcustom
![在这里插入图片描述](https://img-blog.csdnimg.cn/56c6fcde3c554a718aa936caf99fe318.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX-S4ieWygQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
打开另外一个新的终端进入工作空间,进行环境配置后运行scustom.cpp
lzw08@ubuntu:~$ cd ros_ws
lzw08@ubuntu:~/ros_ws$ source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ rosrun custom_message scustom
![在这里插入图片描述](https://img-blog.csdnimg.cn/57c0cb98141f411594c17506f2a13aee.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAX-S4ieWygQ==,size_20,color_FFFFFF,t_70,g_se,x_16)
9、相关说明
到此,今天的工作就算是做完了,需要说明的是,如果有些同学想张扬个性,建一个他自己喜欢的工作包名,然后按照我这篇文章操作,不可避免的应该会出现一些错误。就是.msg文件的名字决定了生成的.h文件的名字,而.cpp文件的头文件中又包含了工作包名和.h文件名,如果你想修改的话,就得一视同仁的全部改了,编译提示没有错误,那也行~
还有,pcustom.cpp里面的name和age等变量是可以修改(如果你想的话),修改完回到工作空间下再编译一次,没问题就行。
10、下课下课 ~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)