[ROS学习]6. (topic)中发布者Publisher的编程实现
笔记参考:【ROS学习笔记】6.发布者Publisher的编程实现(C++和Python)
基于B站ROS公开课:【古月居】古月·ROS入门21讲
基于Ubuntu 20.04.1、Noetic版本
发布者Publisher
前面提到的通信模式之一的Topic模式,其使用“发布/订阅”的方式来通信。
我们之前是通过命令行或键盘操控的形式让海龟动起来的,这次我们直接编译一个程序来控制它。
本节通过创建一个发布者Publisher来控制海龟。
我们先看要实现的这个小程序的图。
(部分图摘自:b站【古月居】古月·ROS入门21讲)
1 模型图
图中,我们使用ROS Master管理节点。
有两个主要节点:
Publisher,名为Turtle Velocity(即海龟的速度)
Subscriber,即海龟仿真器节点 /turtlesim
Publisher(Turtle Velocity),发布Message(即海龟的速度信息,以geometry_msgs::Twist的数据结构,包括线速度和角速度),通过Topic(/turtle1/cmd_vel)总线管道,将数据传输给Subscriber。
Subscriber订阅得到的速度信息,来控制海龟发生运动。
“/turtle1/cmd_vel”这个topic是海归仿真器节点/turtlesim下自带的topic,可直接拿来用。
2 创建功能包
我们之前已经创建了工作空间了,这次我们在src文件夹创建一个新的功能包learning topic.
cd ~/catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
3 创建Publisher代码(以C++为例)
关于如何实现一个Publisher:
- 初始化ROS节点
- 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型
- 创建消息数据
- 按照一定的频率循环发布消息
先以C++为例(后面会讲Python的情形),我们这次需要在src里创建C++的代码文件以输入代码。
# 创建cpp文件
touch velocity_publisher.cpp
# 打开文件
gedit velocity_publisher.cpp
4 编译代码(以C++为例)
有了代码,接下来编译。
配置Publisher代码编译规则
首先需要配置CMakeLists.txt中的编译规则:
- 设置需要编译的代码和生成的可执行文件,
add_executable(a,b)
将b代码文件编译成可执行文件a - 设置链接库,
target_link_libraries
将可执行文件也ROS的相关库进行链接,主要是cpp的接口,python不需要进行编译
将下列代码拷贝至CMakeLists.txt中:
add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
存放位置如下:
执行编译
回到工作空间目录,执行编译.cd ~/catkin_ws
,然后catkin_make
设置环境变量:source setup.bash
我们之后每次运行这个程序都需要source一下devel/setup.bash,我们不妨将source /home/jjt/catkin_ws/devel/setup.bash
放入环境变量.bashrc中(之前讲过)。
运行
打开3个终端标签页,分别运行:
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic velocity_publisher
海龟就按照我们之前代码中设定的线速度和角速度画圆啦!
我们编译好的程序是放在devel/lib目录下的:
5 创建Publisher代码(以Python为例)
下面我们详述Python的实现方法。
Python的步骤中,在“配置编译规则”和“编译并执行”这俩步骤有些不同,前面都一样。
查看内置Python版本
Ubuntu20.04内置了Python3.8,可见 /usr/bin 目录下:
我们在终端使用python3
命令python3 --version
可调用python,比如查看版本号:
创建Python代码
python代码文件是放在功能包文件夹下的scripts目录下的,我们需要新建一个scripts
文件夹。
需要对python文件进行权限更改,右击文件→属性,打开执行权限,√上下图:
6 编译代码(以Python为例)
有了代码,接下来编译。
配置代码编译规则
在新的Noetic版本的ROS中,需要配置这一步,貌似之前的版本不需要配置。
我们配置一下CMakeLists.txt中的编译规则:
将文件中的catkin_install_python这段取消注释,并将默认的my_python_script改成velocity_publisher.py
执行编译
回到工作空间目录,执行编译.
cd ~/catkin_ws
catkin_make
source 一下 setup.bash
如前所述,需要将source /home/jjt/catkin_ws/devel/setup.bash
放入环境变量.bashrc中。
我们前面C++的时候这句话已经放进去了。
再打开终端进行运行,这里运行的是velocity_pulisher.py
,而不是velocity_pulisher
,因为没有将py编译成可执行文件velocity_pulisher
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic velocity_publisher.py
小乌龟同样动了起来!!