**前情提要:已经在“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文件,根据“中科院教学视频”,可知其分别的作用。include
和src
是放c++的.h
和.cpp
文件。我使用Python编程,用不到,所以删了。因为Python配置过程简单,编写也简单,所以我建议如果学过Python的话,可先用Python入门ROS。
5.使用IDE打开工程
- 1)其实就是使用“VS Code”打开文件夹
him_ws
而已。我删掉了include
和src
,新建了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)下一篇将大概浏览
tf
、urdf
、services
、param
的内容,主要讲述launch
、move_base
等软件包的内容。
《教程 Re:Zero ROS (四)—— 略讲:Service/msg/srv/tf/urdf/launch/param》
https://blog.csdn.net/Lovely_him/article/details/107778767