#创建自定义topic
前面我们学了用C++和Python创建发布者与订阅者,这次我们创建自定义的话题,其实同C++实现topic差不多,都是编写.cpp文件。步骤有点多且繁琐,务必耐心跟上。
1、创建topic工作包
第一步仍然是在工作空间里的src文件夹下新建工作包,同样,没有工作空间则新建。
新建工作空间的方法:
有工作空间的跳过上图那步,直接进入src文件夹
lzw08@ubuntu:~$ cd ros_ws/src
lzw08@ubuntu:~/ros_ws/src$ catkin_create_pkg custom_message roscpp rospy std_msgs
这次我们创建的工作包的包名是“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
右下角把“显示行号”打开,具体修改见下图:
具体我改了 第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
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
同样地,因为有两个.cpp文件,所以就有两个add_executable和两个target_link_libraries。打开行号跟着改就行了。
7、回到工作空间第二次编译
lzw08@ubuntu:~/ros_ws/src/custom_message$ cd ../..
lzw08@ubuntu:~/ros_ws$ catkin_make
编译完成后进度条显示100%,没有错误就可以运行了。
8、运行
同理,运行C++节点前要先把主节点运行起来(主节点都需要打开一个新终端让它单独运行)
运行pcustom.cpp,运行前需要先进行环境配置
lzw08@ubuntu:~/ros_ws source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ rosrun custom_message pcustom
打开另外一个新的终端进入工作空间,进行环境配置后运行scustom.cpp
lzw08@ubuntu:~$ cd ros_ws
lzw08@ubuntu:~/ros_ws$ source devel/setup.bash
lzw08@ubuntu:~/ros_ws$ rosrun custom_message scustom
9、相关说明
到此,今天的工作就算是做完了,需要说明的是,如果有些同学想张扬个性,建一个他自己喜欢的工作包名,然后按照我这篇文章操作,不可避免的应该会出现一些错误。就是.msg文件的名字决定了生成的.h文件的名字,而.cpp文件的头文件中又包含了工作包名和.h文件名,如果你想修改的话,就得一视同仁的全部改了,编译提示没有错误,那也行~
还有,pcustom.cpp里面的name和age等变量是可以修改(如果你想的话),修改完回到工作空间下再编译一次,没问题就行。
10、下课下课 ~
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)