导图社区 ROS学习
ROS是一个适用于机器人编程的框架,这个框架把原本松散的零部件耦合在了一起,为他们提供了通信架构
编辑于2022-06-15 11:23:27第一章 初识ROS
ROS特点
1. 点对点的设计
节点间的通信消息通过一个带有发布和订阅功能的RPC传输系统
2. 多语言支持
ROS被设计成为一种语言弱相关的框架结构
目前已经支持Python、C++、Java、Octave和LISP等
3. 架构精简、集成度高
非ROS问题:在已有繁杂的机器人应用中,软件的复用性是一个巨大的问题
ROS优点: ROS框架具有的模块化特点使得每个功能节点可以进行单独编译,并且使用统一的消息接口让模块的移植、复用更加便捷
4. 组件化工具包丰富
ROS定义的接口在其中显示机器人3D模型、周围环境地图、机器人导航路线
5. 免费并且开源
ROS遵照的BSD许可给使用者较大的自由,允许其修改和重新发布其中的应用代码,甚至可以进行商业化的开发与销售
ROS安装
版本选择
ROS目前主要支持Ubuntu操作系统, 同时也可以在OS X、Android、Arch、Debian等系统上运行 ROS也针对ARM处理器编译了核心库和部分功能包
安装方法
软件源安装
软件源(Repository)为系统提供了一个庞大的应用程序仓库,只要通过简单的命令即可从仓库中找到需要的软件并完成下载安装
源码编译安装
源码编译的方法相对复杂,需要手动解决繁杂的软件依赖关系,更适合那些对系统比较熟悉而且希望在未支持的平台上安装ROS的开发者
软件源
更换软件源
添加ROS软件源
sources.list是Ubuntu系统保存软件源地址的文件,位于/etc/apt目录下 在这一步中我们需要将ROS的软件源地址添加到该文件中,确保后续安装可以正确找到ROS相关软件的下载地址。
ROS官方源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
中科大USTC
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
中山大学
sudo sh -c '. /etc/lsb-release && echo "deb http://mirror.sysu.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
添加密钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
ROS安装
首先确保之前的软件源修改得以更新
$ sudo apt-get update
版本选择
版本对应关系
桌面完整版安装(Desktop-Full)
除了包含ROS的基础功能(核心功能包、构建工具和通信机制)外,还包含丰富的机器人通用函数库、功能包(2D/3D感知功能、机器人地图建模、自主导航等)以及工具(rviz可视化工具、gazebo仿真环境、rqt工具箱等)
命令: sudo apt-get install ros-kinetic-desktop-full
桌面版安装(Desktop)
该版本是完整安装的精简版,去掉了机器人功能包和部分工具,仅包含ROS基础功能、机器人通用函数库、rqt工具箱和rviz可视化工具
命令: sudo apt-get install ros-kinetic-desktop
基础版安装(ROS-Base)
基础版精简了机器人通用函数库、功能包和工具,仅保留了没有任何GUI的基础功能(核心功能包、构建工具和通信机制)。因此该版本软件的规模最小,也是ROS需求的“最小系统”,非常适合直接安装在对性能和空间要求较高的控制器之上,为嵌入式系统使用ROS提供了可能
命令: sudo apt-get install ros-kinetic-ros-base
独立功能包安装(Individual Package)
后期安装包使用
命令: sudo apt-get install ros-kinetic-PACKAGE
PACKAGE代表需要安装的功能包名
初始化rosdep(首次安装无需)
rosdep是ROS中自带的工具,主要功能是为某些功能包安装系统依赖,同时也是某些ROS核心功能包必须用到的工具。完成以上安装步骤后,需要使用以下命令进行初始化和更新:
命令
sudo rosdep init rosdep update
设置环境变量
描述: 默认在/opt路径下。在后续使用中,由于会频繁使用终端输入ROS命令,所以在使用之前还需要对环境变量进行简单设置
终端设置
bash(ubuntu默认)
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc
zsh
echo "source /opt/ros/melodic/setup.zsh" >> ~/.zshrc source ~/.zshrc
多版本共存
命令: source /opt/ros/ROS-RELEASE/setup.bash
ROS-RELEASE代表希望使用的ROS版本(如lunar、kinetic、indigo、hydro、groovy等)
终极方法是打开~/.bashrc或者~/.zshrc文件,找到设置环境变量的命令,然后修改对应的ROS版本
验证安装
查看版本:rosversion -d
启动rosMaster:roscore
ROS架构
架构设计
架构图
OS层
ROS并不是一个传统意义上的操作系统,无法像Windows、Linux一样直接运行在计算机硬件之上,而是需要依托于Linux系统
中间层
ROS并不是一个传统意义上的操作系统,无法像Windows、Linux一样直接运行在计算机硬件之上,而是需要依托于Linux系统 ROS的通信系统基于TCP/UDP网络,在此之上进行了再次封装,也就是TCPROS/UDPROS。 通信系统使用发布/订阅、客户端/服务器等模型,实现多种通信机制的数据传输。
ROS还提供一种进程内的通信方法——Nodelet:可以为多进程通信提供一种更优化的数据传输方式,适合对数据传输实时性方面有较高要求的应用。
可以为多进程通信提供一种更优化的数据传输方式,适合对数据传输实时性方面有较高要求的应用。
应用层
ROS需要运行一个管理者——Master,负责管理整个系统的正常运行
功能包内的模块以节点为单位运行,以ROS标准的输入输出作为接口,开发者不需要关注模块的内部实现机制,只需要了解接口规则即可实现复用,极大地提高了开发效率
实现角度
三个层次:文件系统、计算图和开源社区
计算图
作用
描述程序是如何运行的
从计算图的角度来看,ROS系统软件的功能模块以节点为单位独立运行,可以分布于多个相同或不同的主机中,在系统运行时通过端对端的拓扑结构进行连接
节点
节点(Node)就是一些执行运算任务的进程,一个系统一般由多个节点组成,也可以称为“软件模块”
消息
节点之间最重要的通信机制就是基于发布/订阅模型的消息(Message)通信
每一个消息都是一种严格的数据结构,支持标准数据类型(整型、浮点型、布尔型等),也支持嵌套结构和数组(类似于C语言的结构体struct),还可以根据需求由开发者自主定义
话题
适用范围:单向传输
消息以一种发布/订阅(Publish/Subscribe)的方式传递
发布者和订阅者并不了解彼此的存在,系统中可能同时有多个节点发布或者订阅同一个话题的消息
服务
适用范围:双向传输
基于客户端/服务器(Client/Server)模型
包含两个部分的通信数据类型:一个用于请求,另一个用于应答,类似于Web服务器
特点:与话题不同的是,ROS中只允许有一个节点提供指定命名的服务
标注
节点管理器
ROS Master通过远程过程调用(RPC)提供登记列表和对其他计算图表的查找功能,帮助ROS节点之间相互查找、建立连接,同时还为系统提供参数服务器,管理全局参数
文件系统
结构图
功能包(Package)
功能包是ROS软件中的基本单元,包含ROS节点、库、配置文件
1)config:放置功能包中的配置文件,由用户创建,文件名可以不同。 2)include:放置功能包中需要用到的头文件。 3)scripts:放置可以直接运行的Python脚本。 4)src:放置需要编译的C++代码。 5)launch:放置功能包中的所有启动文件。 6)msg:放置功能包自定义的消息类型。 7)srv:放置功能包自定义的服务类型。 8)action:放置功能包自定义的动作指令。 9)CMakeLists.txt:编译器编译功能包的规则。 10)package.xml:功能包清单
功能包清单(Package Manifest)
每个功能包都包含一个名为package. xml的功能包清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等。
服务(Service)类型
服务类型定义了ROS客户端/服务器通信模型下的请求与应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包的srv文件夹中进行定义。
代码(Code)
用来放置功能包节点源代码的文件夹。
消息(Message)类型
消息是ROS节点之间发布/订阅的通信信息,可以使用ROS提供的消息类型,也可以使用.msg文件在功能包的msg文件夹下自定义所需要的消息类型。
元功能包(Meta Package)
元功能包是一种特殊的功能包,只包含一个package.xml元功能包清单文件
在新版本的ROS中,将原有功能包集(Stack)的概念升级为“元功能包”,主要作用都是组织多个用于同一目的的功能包
需要包含一个引用的标签
<export> <metapackage/> </export>
开源社区
关系图
发行版(Distribution)
类似于Linux发行版,ROS发行版包括一系列带有版本号、可以直接安装的功能包,这使得ROS的软件管理和安装更加容易,而且可以通过软件集合来维持统一的版本号
软件源(Repository)
ROS依赖于共享网络上的开源代码,不同的组织机构可以开发或者共享自己的机器人软件
ROS wiki
记录ROS信息文档的主要论坛。所有人都可以注册、登录该论坛,并且上传自己的开发文档、进行更新、编写教程
邮件列表(Mailing List)
ROS Answers
博客(Blog)
标注
问题梳理
什么是节点?
节点就是一些直行运算任务的进程。ROS利用规模可增长的方式是代码模块化
话题和服务通信的异同点有哪些?
话题与服务的区别
概括
1. 话题是ROS中基于发布/订阅模型的异步通信模式,这种方式将信息的产生和使用双方解耦,常用于不断更新的、含有较少逻辑处理的数据通信
2. 服务多用于处理ROS中的同步通信,采用客户端/服务器模型,常用于数据量较小但有强逻辑处理的数据交换。
ROS Master在系统中的作用是什么?
ROS Master
需要有一个控制器可以使所有节点有条不紊的执行,这就是一个ROS的控制器(ROS Master)
RPC(Remote Procedure Call Protocol,远程过程调用):提供了登记列表和对其他计算图表的查找
话题通信中有哪七个步骤?
相比话题通信,服务通信少了哪几个步骤?
ROS参数管理时有没有用到TCP/UDP通信?
ROS通讯
ROS通讯
ROS Master
需要有一个控制器可以使所有节点有条不紊的执行,这就是一个ROS的控制器(ROS Master)
RPC(Remote Procedure Call Protocol,远程过程调用):提供了登记列表和对其他计算图表的查找
话题通信机制
描述: 一个是发布者Talker,另一个是订阅者Listener。两个节点分别发布、订阅同一个话题,启动顺序没有强制要求
通讯图
步骤
1.Talker注册
2.Listener注册
3.ROS Master进行信息匹配
4.Listener发送连接请求
5.Talker确认连接请求
6.Listener尝试与Talker建立网络连接
7.Talker向Listener发布数据
服务通信机制
描述: 服务通信机制,与话题的通信相比,其减少了Listener与Talker之间的RPC通信
通讯图
步骤
1.Talker注册
2.Listener注册
3.ROS Master进行信息匹配
4.Listener与Talker建立网络连接
5.Talker向Listener发布服务应答数据
话题与服务的区别
概括
1. 话题是ROS中基于发布/订阅模型的异步通信模式,这种方式将信息的产生和使用双方解耦,常用于不断更新的、含有较少逻辑处理的数据通信
2. 服务多用于处理ROS中的同步通信,采用客户端/服务器模型,常用于数据量较小但有强逻辑处理的数据交换。
参数管理机制
描述:参数类似于ROS中的全局变量,由ROS Master进行管理,其通信机制较为简单,不涉及TCP/UDP的通信
通讯图
步骤
1.Talker设置变量
2.Listener查询参数值
3.ROS Master向Listener发送参数值
ROS基本操作
控制小乌龟运动
安装包
sudo apt-get install ros-kinetic-turtlesim
运行ROS Master
roscore
运行turtlesim仿真器
rosrun turtlesim turtlesim_node
运行键盘控制节点
rosrun turtlesim turtle_teleop_key
工作空间
创建工作空间
$ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/src $ catkin_init_workspace
编译工作空间
$ cd ~/catkin_ws/ $ catkin_make
添加环境变量
临时(当前shell有效)
$ source devel/setup.bash
永久
echo"source /WORKSPACE/devel/setup.bash" >> ~/.bashrc
查看环境变量是否生效
$ echo $ROS_PACKAGE_PATH
功能包
描述
package.xml文件提供了功能包的元信息,也就是描述功能包属性的信息
CMakeLists. txt文件记录了功能包的编译规则
ROS不允许在某个功能包中嵌套其他功能包,多个功能包必须平行放置在代码空间中
创建命令
$ catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
设置环境变量
$ cd ~/catkin_ws $ catkin_make $ source ~/catkin_ws/devel/setup.bash
话题实现
创建Publisher
创建Subscriber
编译功能包
运行
服务实现
创建server
创建client
编译功能包
运行
本章内容
1. 工作空间和功能包的创建
2. 集成开发环境的搭建
3. 话题和服务的实现方法
4. ROS中的命名空间及解析方法
5. ROS分布式通信的方法
ROS常用组件
launch启动文件
通过XML文件实现 多节点的配置和启动
简单launch结构
<launch> <node pkg="turtlesim" name="sim1" type="turtlesim_node"/> <node pkg="turtlesim" name="sim2" type="turtlesim_node"/> </launch>
根元素
launch文件中的根元素采用<launch>标签定义,文件中的其他内容都必须包含在这个标签中
<launch> … </launch>
节点
常用属性
<node pkg="package-name" type="executable-name" name="node-name" />
pkg: 定义节点所在的功能包名称
type:定义节点的可执行文件名称
这两个属性等同于在终端中使用rosrun命令执行节点时的输入参数
name:属性用来定义节点运行的名称,将覆盖节点中init()赋予节点的名称
其他属性
output = "screen"
将节点的标准输出打印到终端屏幕,默认输出为日志文档
ns = "namespace"
命名空间,为节点内的相对名称添加命名空间前缀
args = "arguments"
节点需要的输入参数
参数设置
<param>
<param name="output_frame" value="odom"/>
运行launch文件后,output_frame这个parameter的值就设置为odom,并且加载到ROS参数服务器上了
<rosparam>
<rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml" command="load" ns="local_costmap" />
<rosparam>可以帮助我们将一个YAML格式文件中的参数全部加载到ROS参数服务器中,需要设置command属性为“load”,还可以选择设置命名空间“ns”
<arg>
argument是另外一个概念,类似于launch文件内部的局部变量,仅限于launch文件使用,便于launch文件的重构,与ROS节点内部的实现没有关系
语法
<arg name="arg-name" default= "arg-value"/>
例子
<param name="foo" value="$(arg arg-name)" /> <node name="node" pkg="package" type="type " args="$(arg arg-name)" />
重映射机制
重映射的机制,简单来说就是取别名
<remap from="/turtlebot/cmd_vel" to="/cmd_vel"/>
将/ turtlebot /cmd_vel重映射为/cmd_vel
嵌套复用
在复杂的系统中,launch文件往往有很多,这些launch文件之间也会存在依赖关系。如果要直接复用一个已有launch文件中的内容,可以使用<include>标签包含其他launch文件,这与C语言中的include几乎是一样的
<include file="$(dirname)/other.launch" />
运行launch
roslaunch learning_launch turtlesim_parameter_config.launch
TF坐标变换
管理机器人系统中繁 杂的坐标系变换关系
tf_monitor
打印TF树中所有坐标系的发布状态
$ tf_monitor $ tf_monitor <source_frame> <target_target>
tf_echo
tf_echo工具的功能是查看指定坐标系之间的变换关系
$ tf_echo <source_frame> <target_frame>
static_transform_publisher
发布两个坐标系之间的静态坐标变换,这两个坐标系不发生相对位置变化
$ static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms $ static_transform_publisher x y z qx qy qz qw frame_id child_frame_id period_in_ms
view_frames
可视化的调试工具,可以生成pdf文件,显示整棵TF树的信息
$ rosrun tf view_frames
Qt工具箱
提供多种机器人开发的可视化工具, 如日志输出、计算图可视化、数据绘图、参数动态配置等功能
安装Qt工具
sudo apt-get install ros-melodic-rqt sudo apt-get install ros-melodic-rqt-common-plugins
子主题
子主题
rviz三维可视化平台
实现机器人开发过程中多种数据的可视化显示
gazebo仿真环境
创建仿真环境并实现带有物理属性的机器人仿真
rosbag数据记录与回放
记录并回放ROS系统中运行时的所有话题信息
平台搭建
机器人组成
子主题
子主题
主题
主题
机器人建模与仿真
URDF
描述
URDF(Unified Robot Description Format,统一机器人描述格式)是ROS中一个非常重要的机器人模型描述格式
ROS同时也提供URDF文件的C++解析器,可以解析URDF文件中使用XML格式描述的机器人模型。
XML标签
<link>标签
用于描述机器人某个刚体部分的外观和物理属性, 包括尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞参数(collision properties)等
link结构图
语法
<link name="<link name>"> <inertial> . . . . . . </inertial> <visual> . . . . . . </visual> <collision> . . . . . . </collision> </link>
<visual>标签用于描述机器人link部分的外观参数,<inertial>标签用于描述link的惯性参数,而<collision>标签用于描述link的碰撞属性
<joint>标签
<joint>标签用于描述机器人关节的运动学和动力学属性,包括关节运动的位置和速度限制
分类
语法
<joint name="<name of the joint>"> <parent link="parent_link"/> <child link="child_link"/> <calibration .... /> <dynamics damping ..../> <limit effort .... /> .... </joint>
● <calibration>:关节的参考位置,用来校准关节的绝对位置。 ● <dynamics>:用于描述关节的物理属性,例如阻尼值、物理静摩擦力等,经常在动力学仿真中用到。 ● <limit>:用于描述运动的一些极限值,包括关节运动的上下限位置、速度限制、力矩限制等。 ● <mimic>:用于描述该关节与已有关节的关系。 ● <safety_controller>:用于描述安全控制器参数。
<robot>标签
描述
<robot>是完整机器人模型的最顶层标签,<link>和<joint>标签都必须包含在<robot>标签内。
语法
<robot name="<name of the robot>"> <link> ....... </link> <link> ....... </link> <joint> ....... </joint> <joint> ....... </joint> </robot>
<gazebo>标签
描述
用于描述机器人模型在Gazebo中仿真所需要的参数,包括机器人材料的属性、Gazebo插件等
语法
<gazebo reference="link_1"> <material>Gazebo/Black</material> </gazebo>
主题
主题
中心主题
理论基础
SLAM描述
机器人在未知的环境中从一个未知位置开始移动,移动过程中根据位置估计和地图进行自身定位,同时建造增量式地图,实现机器人的自主定位和导航
常见传感器
激光雷达
优点:精度高,响应快,数据量小
缺点:成本高
摄像头
单目摄像头
这种方案的传感器简单,适用性强,但是实现的复杂度较高,而且单目摄像头在静止状态下无法测量距离,只有在运动状态下才能根据三角测量等原理感知距离
双目摄像头
这种方案无论是在运动状态下还是在静止状态下,都可以感知距离信息,但是两个摄像头的标定较为复杂,大量的图像数据也会导致运算量较大
RGB-D摄像头
可以像摄像头一样获取环境的RGB图像信息,也可以通过红外结构光、Time-of-Flight等原理获取每个像素的深度信息
优点:丰富的数据,成本较低
缺点:测量视野窄、盲区大、噪声大
主题
主题