[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

小乌龟同样动了起来!!

 

posted @ 2022-08-26 17:20  Gentle_Jan  阅读(221)  评论(0编辑  收藏  举报