目录
说明:
1. 话题模型
图示
说明
2. 实现过程(C++)
创建订阅者代码(C++)
配置发布者代码编译规则
编译并运行
编译
运行
3. 实现过程(Python)
创建订阅者代码(Python)
运行效果
说明:
1. 本系列学习笔记基于B站:古月居《ROS入门21讲》课程,且使用的Ubuntu与ROS系统版本与课程完全一致;
虚拟机版本 | Linux系统版本 | ROS系统版本 |
---|---|---|
VMware WorkStation Pro 16 | Ubuntu18.04 | Melodic |
2. 课程中的所有示例代码均已跑通,且对Pyhon版本的代码也都做了运行验证,并附带验证过程(错误均已修正);
3. 本节是整个笔记的第9节,对应视频课程的第11节,请自行对应学习;
4. 整个系列笔记基本已经完结,但部分章节仍需润色修改 ,后面会陆续发布,请大家持续关注, 创作不易,感谢支持!
1. 话题模型
图示
说明
ROS Master:管理所有节点
主要节点:
Publisher(turtlesim): 消息的发布者,后面会通过程序(c++,py)实现发布者发布一个位置消息数据;
Message(turtlesim::Pose): 发布者发布的消息数据,Pose为位置消息数据;
Topic(/turtle1/pose): 消息传输管道,将发布者发布的消息数据传输给订阅者,
让Subscriber(Pose Listener)订阅者得到这个消息数据;
Subscriber(Pose Listener): 消息的订阅者,Subscriber(Pose Listener)接收到通过
Topic(/turtle1/pose)传输来的消息数据Message(turtlesim::Pose)。
2. 实现过程(C++)
创建订阅者代码(C++)
cd ~/catkin_ws/src/learning_topic/src touch pose_subscriber.cpp
初始化ROS节点;
订阅需要的话题;
循环等待话题消息,接收到消息后进入回调函数;
在回调函数中完成消息处理。
/**
* 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
*/
#include <ros/ros.h>
#include "turtlesim/Pose.h"
// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
// 将接收到的消息打印出来
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::NodeHandle n;
// 定义一个名为turtle_vel_pub的Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
第(1)步:切换工作路径到~/catkin_ws/srclearning_topic/src目录下
第(2)步:创建代码文件pose_subscriber.cpp;
第(3)步:复制代码到文件中并保存,
配置发布者代码编译规则
将下面两行代码复制到CMakeLists.txt文件中,
add_executable(pose_subscriber src/pose_subscriber.cpp) target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
上面两行代码的作用:
add_executable:将pose_subscriber.cpp代码文件编译成(pose_subscriber可执行文件;
target_link_libraries:把编译生成的可执行文件pose_subscriber跟ROS相关的一些库做连接的,比如调用的C++的接口。
复制到CMakeLists.txt文件中的位置如下:
编译并运行
编译
cd ~/catkin_ws catkin_make
第一步:先把工作路径切换到catkin_ws工作空间目录下;
第二步:在catkin_ws工作空间目录下catkin_make编译代码文件
运行
roscore rosrun turtlesim turtlesim_node rosrun learning_topic pose_subscriber
第一步:打开ROS Master,打开一个新终端输入:roscore;
第二步:运行海龟仿真器,再打开一个新终端输入:rosrun turtlesim turtlesim_node;
第三步:运行我们编译好的可执行文件,再打开一个新终端输入:rosrun learning_topic pose_subscriber,
这个程序会不断的发布海龟的当前位置(x,y坐标)。
如果我们让海龟动起来,就可以看到海龟当前位置的变化效果,我们可以通过程序或者海龟的键盘控制节点让海龟动起来,
下面为海龟的键盘控制节点方式,
打开一个新终端输入:rosrun turtlesim turtle_teleop_key
我们上面运行的可执行文件的位置在 home/catkin_ws/devel/lib/learning_topic 目录下
3. 实现过程(Python)
创建订阅者代码(Python)
cd ~/catkin_ws/src/learning_topic/scripts touch pose_subscriber.py
第一步:先把工作路径切换到~/catkin_ws/src/learning_topic/scripts目录下;
第二步:在scripts文件夹下创建pose_subscriber.py文件;
第三步:双击打开pose_subscriber.py文件,复制代码到里面并保存
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
import rospy
from turtlesim.msg import Pose
def poseCallback(msg):
rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y)
def pose_subscriber():
# ROS节点初始化
rospy.init_node('pose_subscriber', anonymous=True)
# 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
rospy.Subscriber("/turtle1/pose", Pose, poseCallback)
# 循环等待回调函数
rospy.spin()
if __name__ == '__main__':
pose_subscriber()
注意:给pose_subscriber.py文件赋予作为程序文件执行的权限,
点击pose_subscriber.py文件,右键,属性,权限,勾选(允许作为程序文件执行),
python文件不需要编译,直接运行即可。
运行效果
运行pose_subscriber.py文件,流程和上面一样,
roscore rosrun turtlesim turtlesim_node rosrun learning_topic pose_subscriber.py