ROS学习笔记一:古月居ROS 21讲学习
文章目录
笔者背景:
这里简单介绍笔者的知识、学习背景,方便读者与自身的学习需求相比较,有针对性地选择阅读。
笔者是一位自动化专业大四学生,修完了本科相关课程,但是很遗憾没有学习过机械设计。大创期间参与了机器人设计,包括机器人仿真方面、上位机编程方面以及stm32方面。仿真软件采用的是webots,不过研究生阶段要求使用ROS,这也是现在开始学习ROS的原因。
本专栏的学习目的:熟知ROS操作,学会运用 rviz 以及 gazebo 进行仿真、激光点阵建图、slam等操作。
笔者自知水平不高,自学内容如有错误或可以改进的地方,烦请指教二三。
一、预习总结
笔者在写作之前,已经完整观看过一遍ROS 21讲,因此将边写文章边进行第二遍观看。
对于第一遍观看的一些总结写在前面:
- 观看ROS 21讲并不能立刻让你学会机器人仿真,因为该课程主要注重于基础原理,基本不涉及相关软件操作。
- 你可以学会ROS系统的运用逻辑、文件格式、操作方法,而这些是学习后续仿真(rviz、gazebo)的必要前提,当然需要去另外课程继续学习。
- 个人体会过“哪里不懂学哪里”方式的痛苦,似乎能够很快学会一系列操作,但这懂一点,那又不太懂,总之很难得到成体系的知识。
- ROS系统看似简单,但细锁的知识点是需要你仔细掌握的,这样才能在真正理解的基础上解决以及避免问题。因此,可能基础的学习稍显枯燥,但我还是建议完整地学完ROS 21讲,课程时间也并不长不是吗?
二、学习记录
第1、2以及5讲:课程介绍及linux系统安装:
1. ROS(robot operating system)即机器人操作系统。
便于理解,可以认为是通信机制 + 开发工具 + 应用功能 + 生态系统;
那么ROS有什么用?ROS中的各种功能被封装成包,你只需要在ROS框架下调用这些包,就能实现各种算法、功能。当然,具体的问题大概率还是需要你自己在他人基础上改进或者自己开发实现对应功能。
ROS学习需要哪些知识?
c++、python、linux、机器人学等基础知识…
因此上手并不容易,即使是掌握了知识,实践上也会遇到各种编译、运行错误。
2. Linux,是一种操作系统。
即用于管理计算机硬件和软件资源的计算机程序,是最基本的程序,任何其他软件都在操作系统的支持下运行。
那么Linux作为操作系统的一种,其特点是什么呢?
- 开源:Linux是一种自由、开源的类Unix系统
Unix 要早于 Linux,Linux 的初衷就是要替代 UNIX,并在功能和用户体验上进行优化,所以 Linux 模仿了 UNIX(但并没有抄袭 UNIX 的源码)。
3. 如何安装Linux?
Ubuntu是一整套封装好的Linux发行版,我们通过安装Ubuntu即可便捷地安装使用Linux系统。
注意,计算机硬盘安装失误的话可能会导致系统崩溃,有可能失去资料等重要文件,因此电脑性能足够的话还是建议通过虚拟机安装,方便管理。安装方法参考视频即可。
4. 如何安装ROS系统?
古月居ROS1视频中的方法已经过时了,现在通过大佬制作的一键安装指令,即可自动便捷地完成安装。
百度 “鱼香ROS一键安装” 即可找到相关教程。
例如 爱尔兰的楠小楠—鱼香ROS一键安装
*注意Ubuntu版本和ROS版本的对应关系,在安装时选取合适的版本进行安装。*
第3讲:Linux基本操作
- Linux 最重要的操作方式:命令行
- 如何输入命令行? :打开终端输入
- 如何打开终端? : Ctrl +T 或者 右键并选择打开终端。
注意,你在哪个文件夹下打开终端,终端的路径就会默认在该文件夹下,终端只能操作对应路径的文件,因此要么在对应文件夹打开终端,要么随意打开终端后使用指令进入到对应文件夹。
相关基础指令:
pwd ---查看当前终端路径
cd + 路径 ---进入对应路径
(例如: cd /home/hcx 进入home下的hcx文件夹)
cd .. ---回到上级目录
mkdir + 名称 ---建立对应名称的文件夹。
ls ---查看当前目录下的文件
touch + 名称 ---创建对应名称的文件
mv + 文件名 + 目标路径 ---剪切文件至对应路径
cp + 文件名 + 目标路径 ---复制文件至对应路径
rm + 文件名 ---删除文件
rm -r + 文件夹 ---删除文件夹
('-r 的作用是递归指令','即循环删除该文件夹内的文件','以达到删除文件夹的效果')
sudo + 欲执行的操作 ---提升权限并执行操作
指令 --help ---查询指令的帮助
指令使用可以到具体场景再进行熟悉,目前了解即可。
第4讲:C++&Python的极简基础
个人还是C++用得多些。
然后在两种语言编译器的安装,在鱼香ROS中已经完成了(如果按步骤来的话)
如何查看自己是否安装了某个包?
rospack list ------查看已安装的包
rospack find packagename------命令查询功能包的路径。
————————————————————————————
C++和Python的特点?
不论在ros内与否,我们在图像处理、深度学习都是使用python较多,因此当涉及到视觉等时,可以考虑使用python。其余时间其实还是习惯用C++多一些。
这两者都能实现对应功能,如何选择还是看个人,不过话说回来,其实很难说只会一种编程语言,因此我们更多时候还是主一个,了解另一个,关键时候能够起到互补的作用。
————————————————————————————
小知识: python是解析性语言,而c++是编译性语言。因此c++程序在运行之前需要编译,而python可以直接运行。那么他们的差别到底在哪?
——
编译型语言在程序执行之前,先会通过编译器对程序执行一个编译的过程,把程序转变成机器语言。运行时就不需要翻译,而直接执行就可以了。最典型的例子就是C语言。
——
解释型语言就没有这个编译的过程,而是在程序运行的时候,通过解释器对程序逐行作出解释,然后直接运行,最典型的例子是Ruby。
——
总结一下就是,编译型语言把所有代码统一翻译成目标代码后统一执行;解释型语言每翻译出一条目标代码就执行它。并不是python就不需要编译了。
相关示例源码可以去古月居视频下载,这里不再赘述。
python与c++的显著区别: c++靠大括号判断代码段的范围,而python靠缩进。
c++每段末尾有分号,而python每段末尾没有分号。
-------------------------------------------------------------------
运行c++文件的方法:
g++ file_ame.cpp -o new_name ---这段代码能够编译c++文件为可执行文件,并非运行。
-o 代表将可执行文件保存为新名字
./new_name ---即可直接运行可执行文件,不需要其他指令。
-----------------
./ 是什么意思?
. 表示当前目录
.. 表示当前目录的上一级目录。
./ 表示当前目录下的某个文件或文件夹,视后面跟着的名字而定
../ 表示当前目录上一级目录的文件或文件夹,视后面跟着的名字而定。
--------------------------------------------------------------------
运行python文件的方法:
python file_name.py ---python加文件名即可,因为python不需要我们专门编译。
第6讲:ROS是什么?
其目的就是提高机器人研发中的复用率
ROS的通信机制
发布者订阅者等,后续会讲。
开发工具
rviz、gazebo、QT工具等等,后续会讲。
应用功能
各种功能包,包括导航、slam等等,调用包可以方便地实现目的。
生态系统
ROS wiki、ROS answers、博客等等,便于交流学习。
第7讲:ROS的核心概念
- 节点(Node):执行单元,不同节点可以使用不同编程语言,但是可以通过ROS的框架实现标准化沟通;
- 节点管理器(ROS Master):节点的控制中心,帮助命名、注册节点,为节点之间的沟通提供支持。或者提供参数服务器服务。
1. 两种通信方式
-
话题(Topic):异步通信机制,使用发布者/订阅者模型,信息传递单向。
消息(message):话题传递的数据,具体一定的数据结构,可以使用ROS自带的,也可自己使用 .msg 文件定义,编译即可自动生成对应的代码文件。 -
服务(service):同步通信机制。
使用客户端 / 服务器模型,客户端发送请求,服务器处理后发送应答数据,信息传递是双向的。
可以通过定义 .srv 文件定义请求和应答的数据结构。
2. 参数(parameter):
是一种全局共享字典,存储运行过程中的参数。
适合于静态、非二进制的配置参数,并不适合于动态参数,因为不会实时更新节点参数,只有节点进行信息同步之后节点自身才会获取到新参数,导致不灵活。
因此,也有专门的动态参数配置方式,需要时再学习即可。
3. 文件系统:
- 功能包(package):
- 功能包清单(manifest):
- 元功能包(meta packages):多个用于同一目的的功能包的集合。
第8讲:ROS命令行工具的使用
常用命令:
rostopic
rosservice
rosnode
rosparam
rosmsg
rossrv
示例1:启动小海龟程序
roscore ---启动ros master
rosrun turtlesim turtlesim_node ---启动海龟仿真节点
rosrun turtlesim turtle_teleop_key ---启动海龟控制节点
---------------------------
turtlesim 是已经安装好的功能包的名字,之后运行我们自己定义的功能包也是类似的格式。
'小技巧':tab键的使用
在我们输入 rosrun turtlesim 之后,可以双击tab键,此时会列出该功能包内部的全部 '节点'。
当我们输入文件名的一部分时,可以通过单击tab键,自动补全文件名。
(当你单击tab无法补全时,三种可能。要么是自己打错了,要么功能包内没有对应节点,
要么是功能包没能成功载入,即功能包不存在)
示例2:查询当前系统状态的方法
rqt_graph ---画出当前节点通信关系的可视图。
rosnode list ---列出当前正在运行的节点
rosnode info /name ---显示该节点的信息
-----------------------
'话题部分'
rostopic list ---列出当前的所有话题
rostopic pub /turtle1/cmd_vel +双击两次tab键 ---可以显示出话题发布的数据结构,并支持修改,修改之后再发布即可改变话题内容,但只会发布一次。
想要循环发布,需要在pub 后加上 -r (可以再加一个数字表示循环的频率)。
rosmsg show + 数据结构名(建议灵活运用tab键补全) ---显示详细的数据结构类型。
-----------------------
'服务部分'
rosservice list ---查询当前运行的所有服务
如何添加第二个海龟?
rosservice call /spawn +双击两下tab键 ---可以显示出对应服务的参数列表,修改后可以发送请求.
类似于话题的发布的操作。
如何完成 .bag文件,即rosbag包的创建
rosbag record -a -o name ---将话题记录并保存为名为name的文件
(前例可知,-o 就是保存文件的意思,而此处 -a 是all的意思,即全部保存。)
rosbag play name.bag ---复现,即运行包内记录的指令
第9讲:创建工作空间 与 功能包
1. 什么是工作空间(workspece)?
是ros中存放相关工程文件的文件夹,包括:
- src:代码空间
- build:编译空间(这个空间基本不用大家关心,因为编译之后自动生成)
- devel:开发空间(development)
- install:安装空间
(实际上需要我们自己完成的只有src 代码空间)
2. 如何创建工作空间?
'小知识':工作空间的格式要求: 例如 /catkin_ws/src,其中catkin_ws作为工作空间的名字,是可以随意更改的,
但是其下的 src 只能命名为src。
1.创建工作空间,两种方法:(1)直接鼠标右键创建,右键文件夹并且按规则命名即可。
(2)通过以下三行命令行创建:
'注意:下面代码中的 folder_name 指的是任意名称,'
'你可以命名为catkin_ws这种比较直白的名称,这样也可以方便''配合下方的示例代码。'
mkdir -p ~/folder_name/src ---创建对应文件夹。(-p 文件夹,-f 文件)
cd ~/folder_name/src ---进入对应路径
catkin_init_workspace ---工作空间初始化
'注:'其实我们关注的一般只有src文件夹,其中是我们自己编写的代码,其他部分都可以自动生成
2.编译工作空间;输入
cd ~/catkin_ws/ ---进入工作空间路径下,或者通过鼠标进入后再开启终端
catkin_make ---需要在工作空间路径终端下输入
3.设置环境变量: source devel/setup.bash ---每次都需要输入,很容易忘,谨记
'注:'还有一种将devel 命令写入启动程序自动运行的方式,可以不用手动输入,按个人需求判断是否需要。具体方式网上查询即可。
4.检测环境变量: echo $ROS_PACKAGE_PATH
3. 什么是功能包?
如之前所说,功能包是放置源码的最小单元。
工作空间的 src 文件夹收纳各种功能包,而各种功能包内收纳各种功能的源码。这样一种收纳结构也是需要大家注意的。
4. 如何创建功能包?
1.创建功能包:
cd ~/catkin_ws/src ---进入工作空间的src,或鼠标进入后再右键打开终端
catkin_create_pkg <pkg_nanme> depend1 depend2 depend3
---创建对应名字的包,并添加依赖
2. 编译功能包:
cd ~/catkin_ws ---进入工作空间
catkin_make ---编译
source ~/catkin_ws/devel/setup.bash ---设置环境变量
'注意:'catkin_ws是工作空间的名字,该名称可以自己修改。
同一工作空间下功能包不能重名,但是不同工作空间下功能包可以重名。
正确理解CMakelists.txt 和 package.xml 文件是什么意思:
CMakelists.txt :帮助功能包进行编译,虽然是txt文件但基于CMake语法,很多时候需要进行修改来让代码能够顺利编译,方法在后续会有介绍。–
package.xml : 包含该功能包的作者信息,以及相关依赖,即创建时添加的依赖。也可以后续手动添加。
总结
第1-9讲到此结束,剩余的见下一部分的专栏。