前面提到的通信模式之一的Topic模式,其使用“发布订阅”的方式来通信。
我们之前是通过命令行或键盘操控的形式让海龟动起来的,这次我们直接编译一个程序来控制它。
本节通过创建一个发布者Publisher来控制海龟。
我们先看要实现的这个小程序的图。
(部分图摘自:b站【古月居】古月·ROS入门21讲)
1 模型图
图中,我们使用ROS Master管理节点。 有两个主要节点: Publisher,Turtle Velocity 即海龟的速度 Subscriber,即海龟仿真器turtlesim Turtle Velocity为Publisher,发布Message(即海龟的速度信息,以geometry_msgs::Twist的数据结构,包括线速度和角速度),通过Topic(/turtle1/cmd_vel)的总线管道,将数据传输给Subscriber。Subscriber订阅得到的速度信息,来控制海龟发生运动。
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++的代码文件以输入代码。源码见下。 (源码地址:https://github.com/guyuehome/ros_21_tutorials/blob/master/learning_topic/src/velocity_publisher.cpp) 将这个cpp文件创建在src文件夹下:
4 编译代码(以C++为例)
有了代码,接下来编译。
配置Publisher代码编译规则
首先需要配置CMakeLists.txt中的编译规则:
将下列代码拷贝至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 devel/setup.bash 放入环境变量.bashrc中。
运行
打开终端,分别运行:
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic velocity_publisher
海龟就按照我们之前代码中设定的线速度和角速度画圆啦!
我们编译好的程序是放在devel/lib目录下的:
5 创建Publisher代码(以Python为例)
下面我们详述Python的实现方法。 Python的步骤中,在“配置发布者代码编译规则”和“编译并执行”这俩步骤有些不同,前面都一样。
查看内置Python版本
Ubuntu20.04内置了Python3.8,可见 /src/bin 目录下: 我们在终端使用python3 命令可调用python,比如查看版本号:
python3 --version
创建Python代码
python代码文件是放在功能包文件夹下的scripts目录下的,我们需要新建一个scripts文件夹。 复述一下实现Publisher的方法:
- 初始化ROS节点
- 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型
- 创建消息数据
- 按照一定的频率循环发布消息
我们把我们的Python版的代码拷贝到目录下。 (源码地址:https://github.com/guyuehome/ros_21_tutorials/blob/master/learning_topic/scripts/velocity_publisher.py) (注意:第31行 rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 原作者没对齐,手动对齐一下) 右击文件→属性,打开执行权限:
6 编译代码(以Python为例)
有了代码,接下来编译。
配置代码编译规则
在新的Noetic版本的ROS中,需要配置这一步,貌似之前的版本不需要配置。
我们配置一下CMakeLists.txt中的编译规则: 将文件中的catkin_install_python这段取消注释,并将默认的my_python_script改成velocity_publisher.py
执行编译
回到工作空间目录,执行编译.
cd ~/catkin_ws
catkin_make
source 一下 setup.bash
如前所述,需要将source devel/setup.bash 放入环境变量.bashrc中。 我们前面C++的时候这句话已经放进去了。
运行
打开终端,分别运行:
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic velocity_publisher.py
python直接执行功能包下的这个py文件就行了。 小海龟一样跑起来啦~
|