第3步,设置cmakelists.txt&package.xmlcmakelists.txt:
find_package(catkin required components roscpp std_msgs)//告诉系统编译本包时,需要找到这两个包catkin_package(# include_dirs include# libraries studycatkin_depends roscpp std_msgs# depends system_lib)//声明依赖本包同时需要里面这两个ros包add_executable(${project_name}_node src/study_listen_node.cpp)//编译本包生成的可执行文件add_dependencies(${project_name}_node ${${project_name}_exported_targets} ${catkin_exported_targets})//链接可执行文件和依赖库//一般情况而已,cmakelists.txt是创建包同时,系统自动生成的,然后,我们需要的工作,一般情况就是把上面基本地方去掉#号就行了(目的告诉系统,关于该包,在哪,依赖是啥)package.xml:
roscppstd_msgsroscppstd_msgs//主要修改类似样式,当然,本例子比较简单,系统生成的,不需要做其他修改,但是,如果节点添加新的依赖,需要在这些地方添加相应的包第4步,编译
$ catkin_make #注意在要做工作空间的一级目录下使用该指令第5步,验证
$ roscore & #运行一个ros master$ rosrun study study_node & #包名+节点名;由于测试listener的节点,所以需要启动一个talker的node才行$ rostopic echo #study_topicdata: hello study world!432---data: hello study world!433 //表示发布成功#开启一个新终端$ rosrun study study_listen_node #包名+节点名[ info] [1606043574.419247936]: i can see you again,hello study world!178 //表示监听成功这时,从零开始创建的listener节点node,成功创建完成
自定义消息类型并发布演示这里主要就是定义一个消息类型是重点,然后,在上面创建的talker以及listener包里面头文件包含,然后在cmakelists.txt&package.xml两文件中,添加新的头文件类型即可使用新定义的消息类型了。
第一步,创建一个包:
$ catkin_create_pkg study_msgs std_msgs roscpp第二步,在包创建一个msg文件夹( 注意文件夹名称一定是这样子的,否则,在cmakelists要修改很多 )
第三步,在文件夹中新建文件,studymsg.msg(注意命名方式以及后缀)
string detailint32 id注意,自定义的消息类型,记得一定不能写其他说明性内容进去,否则发生编译错误
第四步,设置cmakelists.txt&package.xmlcmakelists.txt:
find_package(catkin required componentsroscppstd_msgs message_generation)## generate messages in the 'msg' folder//这里可以看出,系统只会在msg文件夹中查找,对应第二步add_message_files( files studymsg.msg)## generate added messages and services with any dependencies listed heregenerate_messages( dependencies std_msgs)package.xml:
message_generation message_runtime第五步,编译,catkin_make
第六步,查看
$ cd include/study_msgs$ lsstudymsg.h //表示该头文件生成成功这时候,自定义消息类型生成成功,并且,可以被其他包通过头文件#includestudy_msgs/studymsg.h方式,就可以正常使用。下面,以发布一个talker节点来展示,并且发布的topic名称为/study_topic_new当然,cmakelists.txt&package.xml要做相应的补充,cmakelists.txt:
find_package(catkin required componentsroscppstd_msgs study_msgs)catkin_package(# include_dirs include# libraries studycatkin_depends roscpp std_msgs study_msgs# depends system_lib)//两者都是添加新消息类型study_msgspackage.xml:
study_msgsstudy_msgs//添加新消息类型study_msgs此时,study_node.cpp为:
#includeros/ros.h#includestd_msgs/string.h#include#includestudy_msgs/studymsg.h//使用自定义消息类型int main(int argc,char **argv){ ros::init(argc,argv,study_talker);//node's attribute name ros::nodehandle n; ros::publisher study_pub=n.advertise终端查看:
$ rostopic echo /study_topic_new---detail: hello study world! newid: 29975---4.** 参数中心rosparam的使用演示**
开始展示之前,一定要记得在study_listen包的cmakelists.txt&package.xml做好跟上面的talker包study一样准备,保证可以使用自定义消息类型。
study_node.cpp:
#includeros/ros.h#includestd_msgs/string.h#include#includestudy_msgs/studymsg.hint main(int argc,char **argv){ ros::init(argc,argv,study_talker);//node's attribute name ros::nodehandle n; ros::publisher study_pub=n.advertisestudy_listen_node.cpp:
#includeros/ros.h#includestd_msgs/string.h#includestudy_msgs/studymsg.hvoid studycallback(const std_msgs::string::constptr& msg){ ros_info(i can see you again,%s ,msg->data.c_str());}//测试是监听study_topic成功与否void studycallback_new(const study_msgs::studymsg::constptr& msg){ ros_info(i think i cant forget you,%s,%d,msg->detail.c_str(),msg->id);}//测试监听自定义消息成功与否void studycallback_param(const study_msgs::studymsg::constptr& msg){ ros_info(i think i cant forget you,%s,%d,msg->detail.c_str(),msg->id);}//测试rosparam参数中心是否工作成功int main(int argc,char ** argv){ ros::init(argc,argv,study_listener); ros::nodehandle n; ros::subscriber sub=n.subscribe(/study_topic,10,studycallback); ros::subscriber sub_new=n.subscribe(study_topic_new,10,studycallback_new); ros::subscriber sub_param=n.subscribe(/params_topic,10,studycallback_param); ros::spin(); return 0;}修改了上面的两个文件,接下来就是编译整个工作空间并成功,接着在终端执行
$ roscore & #启动ros master$ rosrun study study_node & #启动talker节点$ rosrun study_listen study_listen_node #启动listener节点[ info] [1606047990.464340880]: i can see you again,hello study world!99[ info] [1606047990.464436530]: i think i cant forget you,hello study world! new,100[ info] [1606047990.476383810]: i think i cant forget you,cc,100这时候我们发现,上面我们定义的回调函数,都成功调用了(表示上面的talker/listener/自定义消息 类型都是编写并运行正常的)当我们在终端2启动参数中心rosparam设置参数:
$ rosparam set /myparam yqy终端1的显示调整为:
[ info] [1606048163.371016634]: i can see you again,hello study world!368[ info] [1606048163.371113447]: i think i cant forget you,hello study world! new,369[ info] [1606048163.394940978]: i think i cant forget you,yqy,369也就是将周期第三个,cc调整为yqy了。
本章小结:创建一个包,需要定义好cmakelists.txt 、package.xml两个文件,主要就是告诉系统,我这个包编译和运行时依赖是什么;talker和listener的编写也是基本套路一样的,重新发布的主题以及消息类型以及内容就发布ok了;listener的回调函数,注意是无返回类型的;重新自定义一个消息类型,注意文件夹命名以及文件后缀名称。基本是这些。
将SAP系统迁移到云上? 同时带上您的存档数据
分体式主动降噪蓝牙耳机 专业降噪耳机品牌推荐
技术的升级换代,“热水器求臻之旅”
使用网关解决方案将Zigbee和BLE设备连接到AWS IoT平台
使用VMX设计的能量计实时测量系统
ROS操作系统学习笔记4
智能电网未来商机无限 亟待打破技术制约
华为将不再是小米的竞争对手?
中国移动发布了2020年PC服务器集中采购招标公告
丰巢受邀参展第三届数字中国建设峰会,展现数字化成果
外媒:博通收购博科未获批准,盯上高通结果未知
基于UC3879芯片和MOSFET器件实现全桥移相谐振逆变弧焊电源的设计
Yole:VCSEL市场双寡头垄断,两强争霸
浅谈5G、WiFi 6、LPWAN 和卫星
5G新时代Cloud X将带来历史机遇和无限可能
美联储金融系统崩溃终端数小时
第三代半导体市场小?只是现在产量小而已,而且是有原因的
智能手表哪家强?
盘古大模型个人能用吗 华为盘古ai个人可以用吗
英特尔OpenGL ES API中的新功能介绍