ROS入门之核心概念和系统安装
ROS简介
ROS(robot operating system)是一个开源的机器人操作系统,最早起源于2007年斯坦福大学willow garage的个人项目。ROS提供机器人硬件抽象描述,底层驱动,节点间的消息传递,程序包管理等功能,用于构建一个完整的机器人系统。ROS系统主要由node, topic,service等结构构成。
ROS每两年更新一个大版本,每个版本对应一个ubuntu版本,如图所示:其中kinetic版本对应ubuntu16, melodic对应ubuntu18(最新版本为2020年5月发布的noetic)。ROS目前已经发展到ROS 2版本,但是ROS 2并不是对ROS 1的取代,而是对ROS 1的进一步完善,目前主流应用还是基于ROS 1版本构建。目前,ROS相关的资料也非常多,主要参考ROS wiki即可解决大部分问题。
ROS melodic安装(ubuntu 18)
ROS的安装过程在ros的wiki上写的非常清楚,按照步骤执行就可以,这里简要贴一下命令。
# 设置ROS软件源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) 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 install ros-melodic-desktop-full
# 初始化rosdep
sudo rosdep init
rosdep update
# 设置环境变量
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
# 安装rosinstall
sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential
这里初始化rosdep这一步中,rosdep update命令经常由于网络问题无法正常执行(修改host无效),将会影响到后续的操作,可以通过修改20-default.list文件使用gitee备份源来解决问题,具体操作见链接。
安装完成之后,执行一下roscore
测试一下安装是否成功,效果如图:
核心概念
ROS的核心概念主要有 Node, Topic, Service和ROS Master,下面先分别对每个概念进行解释。
Node
ROS 中每个执行具体任务的单元都成为一个Node,一个Node通常为一个可执行文件,不同的节点可以用不同的语言编写,也可以运行在不同机器上,但是每个Node的名称必须唯一。
Topic
Topic是节点之间传输消息的一种多对多的方式。在Topic模型中,消息的发送者被称为Publisher,接受者被称为Subscriber,Publisher将消息发送到Topic中,然后Subscriber订阅这个Topic来收取消息,这个过程是异步进行的,比较类似于操作系统中的消费者和生产者的模型,Topic就充当了buffer的角色。Publisher发布消息时需要遵守一定的规则,其发出的消息结构需要提前在.msg格式的文件中进行定义。这三者的关系如图所示:
Service
Service是C/S架构的同步消息通信模型,传递消息时,首先由client对server发出请求,当server处理完成后,再给client返回数据,这个过程是同步进行的,一个server可以被多个client请求。和Topic类似,service模型在通信时传递的消息结构也是提前定义好的,需要在.srv文件中进行声明。service示意图如图所示:
ROS Master
ROS Master是整个ROS系统的控制中心,所有的node节点都需要注册到ROS Master中才能正常在整个系统中使用。ROS Master负责连接所有Topic/Service之间的通信,同时还提供一个参数服务器,可以在运行时提供一些参数。ROS Master示意图如图所示:
文件系统
ROS的工作空间一般为~/catkin_ws(自行创建),一般包括build, devel, install, src和param.yaml文件。build 文件夹下主要存放编译过程中的中间文件,和普通cmake编译中的build文件夹功能类似;devel文件夹中存放有编译出来的可执行文件以及对应几大主流shell系统的环境变量更新命令。install文件夹下主要存放用于install的命令脚本,src存放所有功能包,param.yaml中配置ROS系统的参数,ROS系统启动时将读取这个文件。
源代码就放在catkin_ws/src目录下。src目录下每个文件夹都是一个功能包(使用命令创建功能包),每个功能包里一般包括源代码(src和script),Package manifest,消息/服务定义文件,如图所示:
多个功能包又可以组成一个元功能包,最终构成一个完整的ROS 系统。
基础命令
创建workspace
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
# 初始化工作空间
catkin_init_workspace
ROS的程序编译使用catkin编译系统,每次都会编译整个workspace,编译命令为catkin_make
,编译需要在workspace根目录执行。
cd ~/catkin_ws/
catkin_make
编译完成之后,要想使用刚刚编译成功的package,需要对bash的环境进行更新,执行命令:
source devel/setup.bash
创建功能包
功能包一般都放在catkin_ws/src目录下,使用catkin_create_pkg 命令进行创建。
cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs rospy roscpp
catkin_create_pkg 命令格式为:catkin_create_pkg <package名称> [功能包所需依赖..]
需要注意,同一工作空间下,不允许存在同名的功能包。
其他常用命令
roscore
启动ROS Master
rostopic
rostopic 命令可跟不同参数,最常用命令为rostopic list
,用于查看当前ROS Master中存在的所有topic;rostopic pub
可以向指定的topic中发布数据,例如向turtlesim中发布数据改变turtle的位置,在发布数据时,当确定需要发布的topic后,可以双击“tab”键自动补全消息格式:

rosservice
和rostopic命令类似,可以用于操作service相关的内容。
其中,rosservice list
用于查看当前ROS Master中所有service的名称;rosservice call
可以调用某个特定的service,如图所示:
图中命令调用 /spawn服务,产生了一个新的turtle。
rosnode
主要使用rosnode list
命令查看当然ROS Master中存在的所有node。
rosparam
rosparam命令主要用于对ROS Master中的参数进行各种操作
rosmsg
和rossrv
rosmsg和rossrv主要用于显示ROS Master中所有消息类型,同时可以查看某个消息的具体结构。