ros2古月居,古月居ros课程百度云
主题、发布者、订阅者主题模型发布者的编程实现订阅者的编程实现主题消息定义
主题模型
并且发布者和订阅者通过ROS Master建立链接形成话题(建立后关闭不会影响数据的继续传输),传输数据的数据类型为Message。下面描述了发布者、订阅者的建立以及主题消息数据类型的定义。
Publisher Publisher的编程实现创建一个工作区,在工作区中创建一个名为learning_topic的功能包。见上一篇柳絮_创建_ PKG学习_主题ROS CPPRO SPY STD _ MSGS几何_ MSGS Turtlesim创建发布者代码
在learning_topic的src中创建一个名为velocity_publisher.cpp的cpp文件
打开。cpp文件并输入代码/* * *。此例程将发布主题turtle1/cmd_vel,消息类型为geometry _ msgs:twist */# include ROS/ROS . h # include geometry _ msgs/twist . hint main(int argc,Char * * argv){//ROS node init ROS:init(argc,argv, velocity _ publisher );//创建一个节点句柄ROS:node handle n;//创建一个发布者发布一个名为/turtle1/cmd_vel的主题,消息类型为geometry_msgs:Twist,队列长度为10 ROS:Publisher turtle _ vel _ pub=n . advertise geometry _ msgs:Twist(/turtle 1/cmd _ vel ,)//设置循环的频率ROS:Rate loop _ Rate(10);int count=0;While (ros:ok()){ //初始化geometry_msgs:Twist类型消息geometry _ msgs:Twist vel _ msg;vel _ msg . linear . x=0.5;vel _ msg . angular . z=0.2;//发布消息turtle _ vel _ pub . Publish(vel _ msg);ROS _ INFO( publish龟速命令[%0.2f米/秒,%0.2f弧度/秒],vel_msg.linear.x,vel _ msg . angular . z);//根据循环频率延迟loop _ rate . sleep();}返回0;}
配置发布者代码编译规则
打开learning_topic中的CMakelist.txt,将代码# compile velocity_publisher.cpp输入velocity _ publisher # add _ executable(velocity _ publisher src/velocity _ publisher . CPP)#将编译后的文件与ROS # target _ link _ libraries的对应库(velocity _ publisher $ { chunks _ libraries })链接
编译并运行发布程序
返回到工作区路径,打开终端,输入chu絮_make进行编译。进度0 ~ 100%成功。
设置环境变量。方法一:每次输入source devel/setup.bash。Sxdfh:在主文件夹中,按Ctrl+H打开。bashrc文件,并在最后一行输入#source /home/用户名/工作区名称/devel/setup . bash source/home/speike/my _ workspace/devel/setup . bashroscore打开Rosmaster运行海龟im海龟im _ node打开海龟模拟器;ROS learning _ topic velocity _ publisher运行编译好的c文件。
运行python文件
在learning_topic中,创建一个名为scripts的文件夹来存储。py文件,打开海龟模拟器直接进入rosrunlearning _ topic velocity _ publisher . py,不需要提前编译,但是需要保证的属性权限。py文件。
订阅者订阅者的编程实现创建订阅者代码。
在learning_topic/* *的src中创建pose_subscriber.cpp文件这个例程会订阅/turtle1/pose topic,键入turtle sim:pose */# include ROS/ROS . h # include turtle sim/pose . h /收到订阅的消息后,会进入消息回调函数void pose callback(const turtle sim:pose:constptrmsg){//并打印收到的消息ROS _ info (turtle pose: x:% 0.6f,y:% 0.6f ,msg-x,msg-y);} int main (int argc,char * * argv){//初始化ROS节点ROS: init (argc,argv, pose _ subscriber );//创建一个节点句柄ROS:node handle n;//创建订阅者,订阅名为/turtle1/pose的主题,注册回调函数pose回调ROS:Subscriber pose _ sub=n . subscribe(/turtle 1/pose ,10,pose回调);//循环等待回调函数ROS:spin();返回0;}配置订户代码编译规则
打开learning_topic中的CMakeLists.txt文件,在如图所示的位置输入规则add _ executable(pose _ subscriber src/pose _ subscriber . CPP)target _ link _ libraries(pose _ subscriber $ { chucking _ libraries })。
编译和运行订阅服务器。
在my_workspace打开终端,输入柳絮_make进行编译。
罗斯科雷打开罗斯玛斯特;rosrun turtlesim turtlesim_node打开海龟仿真器;rosrun learning _ topic pose _ subscriber运行订阅者;rosrun turtlesim turtle _ teleop _ key使用键盘控制海龟话题消息的定义定义味精文件
在工作空间的功能包中创建味精文件夹
在味精文件夹中创建Person.msg文件
打开Person.msg文件,将数据接口定义写入
在Package.xml中添加功能包依赖
将下面代码复制到Package.xml的对应位置,以便自动生成程序构建依赖消息生成/构建依赖执行依赖消息运行时/执行依赖
在CMakeList.txt中添加编译选项
1、在查找_包中加入消息_生成
2、在如图位置添加添加消息文件(文件文件名Person.msg)生成消息(依赖标准消息)
3、在柳絮_包装中添加消息_运行时
尝试编译
回到工作空间的根目录,在终端输入柳絮_制作
编译成功后在如图路径中能找到Person.h文件(三)的头文件)
创建发布者和订阅者
在学习_主题中的科学研究委员会里创建文件分别名为person_publisher.cpp和person_subscriber.cpp的文件,代码如下
/** * 该例程将发布/个人信息话题,自定义消息类型learning _ topic:Person */#包含ROS/ROS。h #包含“学习主题/人”。h int main(int argc,char **argv){ //ROS节点初始化ros:init(argc,argv, person _ publisher );//创建节点句柄ROS:节点句柄n;//创建一个出版商,发布名为/个人信息的题目,消息类型为学习_话题:人,队列长度10 ROS:Publisher Person _ info _ pub=n . advertise learning _ topic:Person(/Person _ info ,10);//设置循环的频率ROS:Rate loop _ Rate(1);int count=0;while (ros:ok()) { //初始化学习_话题:人类型的消息学习_话题:人person _ msg person _ msg . name= Tom person _ msg . age=18 person _ msg。性别=学习_话题:人:男;//发布消息个人信息发布。发布(person _ msg);ROS_INFO(发布人信息:姓名:%s年龄:%d性别:%d ,person_msg.name.c_str(),person_msg.age,person_msg。性);//按照循环频率延时loop _ rate睡眠();}返回0;} /** * 该例程将订阅/个人信息话题,自定义消息类型learning _ topic:Person */#包含ROS/ROS。h #包含“学习主题/人”。h //接收到订阅的消息后,会进入消息回调函数void personInfoCallback(const learning _ topic:Person:const ptr msg){//将接收到的消息打印出来ROS _ INFO(订阅人信息:姓名:% s年龄:% d性别:% d ,msg-name.c_str(),msg-年龄,msg-性别);}int main(int argc,char **argv){ //初始化活性氧簇(活性氧物种的缩写)节点ros:init(argc,argv, person _ subscriber );//创建节点句柄ROS:节点句柄n;//创建一个订户,订阅名为/个人信息的题目,注册回调函数personInfoCallback ROS:Subscriber person _ info _ sub=n . subscribe(/person _ info ,10,personInfoCallback);//循环等待回调函数ROS:spin();返回0;} 配置代码编译规则add _ executable(person _ publisher src/person _ publisher。CPP)target _ link _ LIBRARIES(person _ publisher $ { chunks _ LIBRARIES })add _ dependencies(person _ publisher $ { PROJECT _ NAME } _ generate _ messages _ CPP)add _ executable(person _ subscriber src/person _ subscriber。CPP)target _ link _ LIBRARIES(person _ subscriber $ { chunks _ LIBRARIES })add _ dependencies(person _ subscriber $ { PROJECT _ NAME } _ generate _ messages _ CPP)
编译并运行
在工作空间打开终端输入柳絮_制作
在主目录中罗斯科雷;再rosrun learning _ topic person _ publisher;再rosrun learning _ topic person _ subscriber