机器人操作系统入门_中科院软件所-重德智能机器人联合研究中心_中国大学MOOC(慕课)
可以参考视频学习
目录
.1ROS版本
.2 ROS架构
.3 ROS与IDE安装
.4 Catkin与工作空间
5.ROS的Package结构
6.ROS的常用指令
7.Metapackage
8.Master和Node
.9 Topic和msg
.10 Service和srv
.11 Parameter Serve
12.Action
13.Gazebo
14.RViz
15.Rqt
16.Rosbag
17.Client Library
References:
ROS可以看作是一种中间件,沟通了自己写的代码和真正的操作系统(如Linux)。ROS由四部分组成:框架+工具+功能+社区。
ROS中的节点(Node)=电脑中的进程或可执行文件。ROS是一个模块化、分布式的架构,自带了进程管理和通信的相关功能。因此在开发的时候无需自己考虑进程的并行运行、协同调度等问题,简化了开发。
关于ROS的安装,基本上直接按照官网安装流程(中文)安装即可,不难。安装完成后终端输入roscore
,如果无报错说明安装成功。
推荐IDE:RoboWare Studio,官网是这里,但现在貌似上不去了。Github项目主页是这里,基于VS Code开发。官网打不开的话可以去Github下载deb
包自己安装,点击这里去Github下载。
Catkin(中文意思为柳絮))是ROS定制的编译构建系统,是对CMake的扩展。Catkin Workspace则是组织和管理package的文件夹,组织结构如下所示。
src
是实际写代码的地方,可以放多个package,如下,其它是系统自动生成的。
package是Catkin编译的基本单元。
catkin_make
用于初始化创建空间以及编译项目(常用),基本操作命令如下。
src
文件夹,否则会提示没有src
文件夹,新建不了。在编译时注意两点:
catkin_make
,不然会报错;catkin_make
之后记得source
一下catkin_ws/devel/setup.bash
,否则可能会提示找不到可执行文件。 建立工作空间可能会遇到如下问题。
提示找不到包,这时候pip install catkin_pkg
安装一下就好了。建好的工作空间终端输出如下。
中文可叫做功能包,是ROS软件的基本组织形式,是Catkin的基本编译单元。一个package可以包含多个可执行文件(节点)。Package的完整结构如下:
CMakeLists.txt
(必须):规定Catkin的编译规则package.xml
(必须):自我描述,定义package的属性信息,如包名、版本、作者等。一般只需要改和
就可以了。
scripts
:用于存放一些shell或python脚本include
:源代码的头文件src
:源代码,如cpp文件、py文件等msg
:自定义消息格式,*.msg
srv
:自定义服务,*.srv
action
:自定义动作,*.action
config
:参数、设置文件等,如*.yaml
launch
:启动规则文件,*.launch
,配合roslaunch
命令可以一次运行多个可执行文件
常用依赖:roscpp、rospy、std_msg、nav_msg等。直接在catkin_create_pkg
时在包名后面空格加上即可。
全新新建工作空间终端代码:
mkdir -p ~/catkin_ws/src
cd catkin_ws
catkin_make
接着在工作空间中新建package:
catkin_create_pkg test roscpp rospy std_msg
这样便建好了一个包。
而对于从Github上clone或下载下来的代码,在建好了工作空间后,可以按照如下方式安装。
cd ~/catkin_ws/src
git clone https://github.com/DroidAITech/ROS-Academy-for-Beginners.git
cd ~/catkin_ws
rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y
catkin_make
source ~/catkin_ws/devel/setup.bash
需要注意的是下载的代码需要放到工作空间的src
文件夹下,
第二是需要在工作空间根目录下安装包所需的依赖以及CatkinMake。最后别忘了source
一下。
当然如果嫌麻烦也可以将最后一行添加到~/.bashrc
中,在终端中输入echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
即可。这样每次CatkinMake后,重新打开终端即可。
注意:
最好不要CatkinMake后直接就运行。因为在打开终端时会载入~/.bashrc
的内容,但这个时候你还没有CatkinMake,所以你载入的其实是上一次CatkinMake后的结果。当然如果说你的package项目不是第一次编译、名称也没有改变,那么setup.bash
中的内容也就没有变,这样CatkinMake前载入也是可以的。
可以翻译为“元包”或“虚包”,其本身没有什么内容,只包含有package必备的CMakeLists.txt
和package.xml
。但它依赖了其它包(在package.xml
中指定),通过这种方式将多个包组合起来。这样做的好处就是在安装的时候就不需要一个个安装,而只安装一个metapackage就可以了。ROS中常见的Metapackage如下:
在ROS中,所有的Node都是通过Master管理的,因此如果想启动一个Node,必须先要启动Master(roscore
)然后再启动节点(rosrun
)。
话题通信中
发布者和订阅者都需要一个节点
(可以理解为连接master的一个端口,通信的话需要给一个端口进行通信)
Master:节点管理器。每个node启动的时候都要向master注册,管理node之间的通信。启动Master的命令是roscore
,启动master
的同时也会顺带启动rosout
(日志输出)和parameter server
(参数服务器)。
Node:ROS的进程,package里的可执行文件运行的示例,一般以功能划分。启动Node的命令是rosun [pkg_name] [node_name]
(必须先启动好master);也可以以launch文件的方式启动:roslaunch [pkg_name] [*.launch]
(自动判断master是否运行,没有的话自动启动),这样可以一次启动多个node。rosnode
命令则用于查看和管理node,常用功能如下。
实际项目中,一般将用于启动机器人的包命名成name_bringup
,这样在终端输入roslaunch name_bringup name.launch
就可以启动机器人了
Topic:ROS中的异步通信方式,可以看作是一个“频道”,Node之间通过publish-subscribe机制通信,如下所示。
一个Topic可以被多个Node订阅,一个Node也可以发布多个Topic,同时一个Topic也可以由多个Node发送,是一种多对多的关系。Topic在代码层面是字符串。
Message:Topic内容的数据类型(格式标准),定义在*.msg
文件中。Message可以理解为类,而发布的一条条的信息则是类的对象。基本Message类型如下:
例如ROS里定义的Image的Message格式如下:
相关命令:
上图是运动小乌龟的时候echo出来的消息
Service:ROS中的同步通信方式,Node间可以通过request-reply方式通信,如下。相比于Topic的“发了就不再管”或“只管接收”的单向通信,Service更加“有来有回”,所以比较适用于一些修改等场景,返回结果是是否修改成功。
节点(Node)就是Master分配给运行文件的端口
srv:Service通信的数据格式,定义在*.srv文件中。一个示例srv文件如下。
Service常用命令如下:
此外在自定义了Topic或Service后,都需要在package.xml和CMakeLists.txt中修改对应内容,如下。
参数服务器中存储各种参数的字典(键值对),可以用命令行、launch文件和node(API)读写。一般将系统中不常改变的参数、设置等放到参数服务器中。可以理解为参数服务器中的参数对于节点是共享的,节点可以读写内容。
命令行修改参数命令rosparam
:
launch文件中修改参数:
一般用于单个参数设置,
一般用于批量参数设置。
可以理解为升级版的Service。
Action通信的数据格式定义在*.action中。一个简单的示例如下:
ROS下的机器人仿真工具,Gazebo基于ODE物理引擎,用于动力学、导航、感知等任务的模拟。官网是这里。直接点击Gazebo的图标即可启动。
全称The Robot Visualization tool,是一个方便监控和调试的可视化工具,其本质上就是将一些订阅得到的数据可视化地显示出来,从而方便调试。在终端中直接输入rviz
即可启动(需要先启动Master)。
可视化工具,显示一些抽象的信息,如rqt_graph
用于显示系统的通信架构,rqt_plot
用于绘制一些动态参数曲线(如线速度、角速度、IMU数据等),rqt_console
用于查看日志等等。
ROS的命令行工具,用于记录和回放数据流。
基本使用:
Client Library是ROS提供的用于编程的API库,如建立node、发布消息、调用服务等。比较常用的两个是roscpp
和rospy
。
roscpp
常用函数如下:
rospy
常用函数如下:
ROS学习笔记1