教程 Re:Zero ROS (三) —— 新建工程、订阅发布话题

 **前情提要:已经在“Ubuntu 20.04/16.04”上做好了准备 **

《教程 Re:Zero ROS (二) —— 准备工作,安装基础工具》
https://blog.csdn.net/Lovely_him/article/details/107736746

教程 Re:Zero ROS (三)

—— 新建工程、订阅发布话题

1. 建立ROS工程概念

  • 这里推荐由中科院推出的入门教程视频,视频原本是慕课上的限时观看课程,好心人转载到小破站了。讲师口齿清晰逻辑明了,课程内容通俗易懂,还会善用ppt搭配讲解。极力推荐,以下是课程的传送门相关链接。

视频:中科院软件所-机器人操作系统入门(ROS入门教程)
链接:https://www.bilibili.com/video/BV1mJ411R7Ni
慕课:机器人操作系统入门
链接:https://www.icourse163.org/course/ISCAS-1002580008
代码:ROS-Academy-for-Beginners(github社区)
链接:https://github.com/DroidAITech/ROS-Academy-for-Beginners
讲义:《机器人操作系统入门(一)ROS简介》
链接:https://www.cnblogs.com/hg-love-dfc/p/10333202.html
维基:ROS WIKI
链接:http://wiki.ros.org/

  • 1.“前言”和“第一课”都是科普ROS概念;
  • 2.“第二课:工程结构”是重中之重的概念,不过后面运用多了自然就记住了;
  • 3.“第三/四课:通信架构”也是ROS的核心思想(我认为),ros基本上就是围绕通信展开的;
  • 4.“第五课”是介绍软件工具,快速了解即可;
  • 5.“第六/七/八课”就是实践,讲解如何编写不同用途可执行文件(.cpp或.py文件);
  • 6.“第九/十课”则是教你如何调用、配置前人已经写好的库,“窥探”ros的强大之处。
  • 我个人建议,先看完前八节课的内容,有个大概印象和了解。因为前八课的内容是相通的。边看边适当记笔记,这部分算是纯理论,不需要配合上机操作。

2.善用[wiki.ros.org]

  • 现在,我假设你已经花了几天时间把上一点的要求达到了,接下来就开始实践。从实践中学习最快乐(了),我自始至终如此认为道。 实战前先强调一下**<wiki.ros.org>**的重要性。

维基:ROS WIKI
链接:http://wiki.ros.org/

  • 在网址尾加上/cn,便进入中文版wiki页面,不过wiki的中文只有一少部分。每次你都可以尝试性试试这个wiki有没有中文版wiki的性质是众人一起维护的,希望ros的wiki汉化能越来越多,起码是教程的部分。
  • 进入中文版后,点击“教程”,你可以看到,wiki已经有非常详细的初级教程了。如果你百度查ros初级教程的东西,你会发现其实很多都是搬wiki的东西。那为什么不自己直接看wiki呢。我接下要讲述的内容其实也差不多是在wiki学的和复制的。不过是加了自己的理解,进行了缩减与重排。
  • 在这里插入图片描述

3.新建ROS工作空间

Creating a workspace for catkin
http://wiki.ros.org/catkin/Tutorials/create_a_workspace

  • 1)新建文件夹,并跳转进去。命名随意。(多用命令后,都不想右键新建和左键打开了)
mkdir -p ~/him_ws/src
cd ~/him_ws/

《ubuntu——mkdir命令详解》
https://blog.csdn.net/qq_29272753/article/details/91402036

  • 2)编译工程。工程下要src才被认为是ros工程,且编译时需定位在工程主目录下。
catkin_make
  • 3)编译成功后效果如下,编译生成了“build”和“devel”文件夹,与“src”文件夹下“CMakeLists.txt”。
  • 在这里插入图片描述

tree 命令
https://blog.csdn.net/fragrant_no1/article/details/85986511

  • 4)添加环境变量,也可以手动打开~/.bashrc文件进行添加。
echo "source ~/<工作空间的命名>/devel/setup.bash" >> ~/.bashrc
echo "source ~/him_ws/devel/setup.bash" >> ~/.bashrc
  • 5)刷新环境变量,使配置在当前窗口中立即生效
source ~/.bashrc

4.新建pack软件包

Creating a ROS Package
http://wiki.ros.org/catkin/Tutorials/CreatingPackage

  • 1)cd跳转至工程路径下单src文件夹内,使用指令新建pack软件包
catkin_create_pkg himpack_name std_msgs rospy roscpp
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
  • 在这里插入图片描述

  • 2)cd切换回主目录下编译工程

cd ~/catkin_ws
catkin_make
  • 3)编译成功后可发现him_ws/src/himpack_name目录下多了4文件,根据“中科院教学视频”,可知其分别的作用。includesrc是放c++的.h.cpp文件。我使用Python编程,用不到,所以删了。因为Python配置过程简单,编写也简单,所以我建议如果学过Python的话,可先用Python入门ROS。
  • 在这里插入图片描述

5.使用IDE打开工程

  • 1)其实就是使用“VS Code”打开文件夹him_ws而已。我删掉了includesrc,新建了scrips存放Python.py文件。
  • 在这里插入图片描述
  • 2)之后我们改代码在IDE里改,编译的话还是打开终端使用catkin_make指令。如果是“RoboWare”,在左上角会有个编译按钮,也可以编译。不过速度会稍微慢一点,因为它还要加载IDE内的指令。
  • 这里推荐的是使用之前安装的“Guake Terminal”终端工具,每次需要编译就按快捷键下拉终端,然后按下方向键“向上”和回车,就可以快速编译了。(这是我个人的习惯,我分享一下)
  • 在这里插入图片描述

6.导入pack软件包

  • 1)把“中科院教学视频”的软件包例程加载到新建的工程里。
  • 中科院教学视频”的配套例程是基于Ubuntu16.04编写的,在Ubuntu20.04下不能缺少相关软件包,即使使用rosdep安装相关依赖也失败了,只能将部分依赖包的源代码下载到工程内编译,都是这依然不行。最后还是有几个软件包找不到源代码和安装包,我只得放弃在Ubuntu20.04上运行这套例程了。

代码:ROS-Academy-for-Beginners(github社区)
链接:https://github.com/DroidAITech/ROS-Academy-for-Beginners

  • 1)虽然不能编译运行中科院的例程,都是还是可以使用IDE查看例程里代码的编写方法。所以影响不大,这里先采用另一套程序,尝试将它安装到你都工作空间内。

代码:lovely-him/him_ws
链接:https://github.com/lovely-him/him_ws

  • 2)跳转到工作空间的src,使用指令下载源代码,上一篇教了“github”下载的方法,忘记的回去补一下。
cd ~/him_ws/src
git clone https://github.com/lovely-him/him_ws
  • 3)跳转回工作空间主目录,安装所需依赖(注意填写的ros版本名对不对),编译程序,刷新环境 (假设你已经在~/.bashrc内添加了环境变量)。
cd ~/him_ws
rosdep install --from-paths src --ignore-src --rosdistro=noetic -y
catkin_make
source ~/.bashrc
  • 4)防止有人太新手,说明一下,刚刚说的指令都是在终端输入的。部分IDE内也自带终端窗口,可以在IDE内输入指令。不过在IDE内打开有点慢,还是直接用终端工具更好。同时你可以看到IDE实时刷新了文件夹src里的内容,看到了刚下载的软件包。(因为例程不能用下载后就“剪切”到其他目录,不然编译不通过。
  • 在这里插入图片描述

7.编写topic话题

  • 终于要开始编写第一个程序了。假设你之前已经看过中科院的教程了,已经知道了topic的概念和编写方式,那现在就来实践一下。

《写一个简单的消息发布器和订阅器 (Python)》
http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28python%29

  • 1)在之前创建的himpack_him软件包下的scripts创建一个Python.py文件。可以使用指令也可以在“VS Code”内快捷创建。
  • 在这里插入图片描述
cd ~/him_ws/scripts
gedit output_control.py

《Ubuntu下如何创建文本文件》
https://blog.csdn.net/zhuiyunzhugang/article/details/86349566

  • 2)创建后需要给权限,使其为可执行文件,不然之后会报错。使用ls命令查看当前文件夹下单文件,可以看到可执行文件的名字为绿色(如果你没改终端配色的话),如果是白色则表示还没改权限。
chmod +x output_control.py

《Linux常用命令:chmod修改文件权限 777和754》
https://blog.csdn.net/pythonw/article/details/80263428

  • 在这里插入图片描述
  • 3)然后打开.py文件,将下列代码复制到你都文件中。
#!/usr/bin/env python
#-*-coding:utf-8-*-

# 加载ros的Python基础包
import rospy
# 加载topic话题 的 msg消息
from std_msgs.msg import Float64
from geometry_msgs.msg import Twist

class main_class:
    # 初始化函数
    def __init__(self):
        # 创建node节点 —— 电机控制
        rospy.init_node('motor_control', anonymous=True)
        # 订阅topic话题 —— 电机pwm输出
        rospy.Subscriber("motor_output", Twist, self.callback)
        # 发布topic话题 —— 线速度输出
        self.pub_linear = rospy.Publisher('linear_output', Float64, queue_size=10)
        # 发布topic话题 —— 角速度输出
        self.pub_angular = rospy.Publisher('angular_output', Float64, queue_size=10)
        # 阻塞等待
        rospy.spin()
    # 回调函数
    def callback(self,data):
        # 创建 msg 消息, 注意:ros的float64是一个结构体
        angle = Float64()
        speed = Float64()
        # 提取 线速度 与 角速度
        speed.data = ((data.linear.x) * 8)
        angle.data = ((data.angular.z) * 1)
        # 向topic话题 发送 msg消息
        self.pub_linear.publish(speed.data)
        self.pub_angular.publish(angle.data)

if __name__ == '__main__':
    try:
        main_class()
    except rospy.ROSInterruptException:
        pass
  • 4)假设你已经看过中科院的教程了,那要讲的就只有几点了:
#!/usr/bin/env python
#-*-coding:utf-8-*-
  • 这段看似注释的东西一定要加在.py文件开头,第一行是“每个Python ROS节点在顶部都有这个声明。第一行确保您的脚本作为Python脚本执行。”;第二行是“声明文件编码的注释”。少第一行则不能执行,少第二行则不能输入中文。在ros工程中还有些文件是完全不支持中文的,只要有就编译失败。 -

《python文件开头两行#!/usr/bin/python和# -- coding:utf-8 --解释以及Pycharm自动创建py文件头部信息》
https://blog.csdn.net/qq_36512295/article/details/89057856

  • try - except组合是Python的语法。就算不写问题也不大,只是会在运行ros时报错,但一般不影响使用 ,要严谨规范一点较好。

《try-except异常处理》
https://blog.csdn.net/m0_37701037/article/details/82709456

  • 5)因为只是写了单个文件,所以可以不用catkin_make整个工程。检查.py文件无误后运行,py文件。可使用指令运行,也可以在“VS Code”内右键点击运行。若无任何报错与提示,则表示运行正常。
  • 运行ros程序前需要先打开ros,运行以下指令,再打开.py
roscore
python3 ~/him_ws/src/himpack_name/scripts/output_control.py

8.测试topic话题

《理解ROS话题》
http://wiki.ros.org/cn/ROS/Tutorials/UnderstandingTopics

  • 0)经过教程的学习rqt工具ros指令,我们现在实践一下,先运行好output_control.py
  • 1)查看现在开了多少个node节点
rosnode list
  • /rosout节点是随着ros一起一直开着的;/motor_control就是刚刚运行的py文件建立的节点。单独开启ros节点的节点名会有一段后缀,是为了防止节点重名。如果是在工程里启动的节点说不会强行加后缀的,工程会在编译的时候就提醒你节点名重复了。
  • 在这里插入图片描述
  • 3)查看现在开了多少个topic话题
rostopic list
  • 根据我们编写的程序,话题/angular_output/linear_output/motor_control节点发布;话题/motor_output被订阅。这里也确实显示了这3个话题。
  • 在这里插入图片描述
  • 4)使用rqt_graph查看节点图
rqt_graph 
  • 如果显示的内容和下图不一样,把上栏Nodes/Topic(all)选中,还有下栏除Debug外的勾都取消。这个图就更加清晰明了反应了/motor_control节点的功能了,订阅其他节点发布的/motor_output电机输出)消息,发布给车模的/angular_output角速度)与/linear_output线速度)消息。当然,我现在还没写其他模块的发布节点和车模的接收节点。
  • 在这里插入图片描述

《linux下清屏的几种技巧》
https://blog.csdn.net/u013091013/article/details/83509906

  • 5)向/motor_output话题发布msg消息,订阅/angular_output/linear_output的msg消息,观察变化。
python3 ~/him_ws/src/himpack_name/scripts/output_control.py
rostopic pub /motor_output geometry_msgs/Twist -r 1 -- [1.0,2.0,3.0] [4.0,5.0,6.0]
rostopic echo /angular_output
rostopic echo /linear_output
  • 善用“Terminator”,真的越用越顺手。将终端分块,然后直观的对比输出。因为一个程序进程就要占用一个终端,这样分屏才能管理快速有效管理多个终端。 上端窗口用于执行运行.py文件;左端用于循环发布msg信息给/motor_output话题;右端两个窗口用于订阅/angular_output/linear_output的msg消息。可修改motor_control.py的参数,看看输出结果有何变化.
  • 在这里插入图片描述
  • 6)再次执行上一步,这次打开rqt_plot工具查看波形图。
rqt_plot
  • 每次发送一次,横轴就增加1个定位,并整体往左移,最后把这次的数据大小点在纵坐标上。连续如此显示波形图像。
  • 在这里插入图片描述

9.练习&结尾

  • 1)学会怎么编写topic话题程序后,应该再自己多实践一下,我的例程只提到了topic的发送与于接收函数的使用。这是最基础简单的内容,ros库内还有很多其他可以调用的相关函数。希望能自行去调用试试,练习一下。

Topics
http://wiki.ros.org/Topics

  • 2)之后我们用到的小车内的motor_control.py不止发布两个topic话题,是共发送6个:4个前后轮的转速,2个前轮摆动的角度。学到这里已经实现了。如果之前学过智能小车的控制,还可以给线速度和角速度加个限幅滤波,还有差数转弯完成这点后再看下一个教程吧。
  • 3)下一篇将大概浏览tfurdfservicesparam的内容,主要讲述launchmove_base等软件包的内容。

《教程 Re:Zero ROS (四)—— 略讲:Service/msg/srv/tf/urdf/launch/param》
https://blog.csdn.net/Lovely_him/article/details/107778767

猜你喜欢

转载自blog.csdn.net/Lovely_him/article/details/107751902