目录
前言
本文讲述ROS的入门级教程,介绍ROS的安装,ROS程序的主体架构、核心概念、已有程序的编译与使用、常用的调试工具和一些指令。
提示:系统配置:ubuntu18.04 + ROS Melodic
一、ROS简介与安装
Robot Operating System (ROS) 机器人操作系统的官方定义:
ROS 是面向机器人的开源的元操作系统(meta-operating system),它能够提供与传统操作系统类似的诸多功能,如硬件抽象、底层设备控制、常用功能实现、进程间消息传递和程序包管理等。此外,它还提供相关工具和库,用于获取、编辑、编译代码,以及在多台计算机上运行程序,实现分布式计算。
第一代ROS仅支持安装于ubuntu系统,第二代ROS2也支持windows等系统。ROS的版本受制于系统版本,如ubuntu18.04仅支持ROS Melodic,ubuntu20.04仅支持ROS Noetic。以下是具体安装步骤:
1.安装ubuntu系统,具体步骤略,以下以ubuntu18.04为例。
2.安装ROS(Melodic)
2.1安装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 sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
2.2设置公钥,继续在终端输入:
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
2.3更新最新可用软件包列表,继续在终端输入:
sudo apt update
2.4安装ROS,继续在终端输入,建议安装完整版:
sudo apt install ros-melodic-desktop-full
2.5初始化 rosdep,继续在终端输入,这里使用不知名高手的方法有效规避墙:
sudo rosdepc init
rosdepc update
2.6设置环境,继续在终端输入:
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
3.测试,运行小海龟和rviz
3.1.1打开终端输入
roscore
3.1.2再打开一个终端输入
rosrun turtlesim turtlesim_node
3.1.3出现了一个小海龟,再打开一个终端输入
rosrun turtlesim turtle_teleop_key
让光标在第三个打开的终端中闪烁,此时就可以通过方向键控制小乌龟移动了
3.2.1运行rviz
打开终端输入
rosocre
3.2.2再打开一个终端输入
rosrun rviz rviz (或者rviz)
出现这个画面说明rviz等组件安装成功
4.退出ROS程序(进程)
将光标放入对应终端内,按Ctrl+C,适用于几乎所有ROS程序
二、ROS文件系统
ROS 文件系统的主要目的是使创建的工程集中化,同时提供足够的灵活性使依赖关系分散化。
Catkin 是 ROS定制的编译构建系统,对CMake的扩展。总之,Catkin就是用来编译ROS程序的。Catkin工作空间,就是一个文件夹。,组织和管理功能包的文件夹,以catkin工具编译。对它的创建,克隆修改之类的,都在这个文件夹中完成。
Build:里面放的是c_make和catkin的缓存信息和中间文件。
Devel:存放目标文件,比如:头文件,动态链接库,静态链接库,可执行文件。
Src:是我们真正写代码的地方。我们只需要专注于src就可以了。
Package 是catkin编译的基本单元。Catkin编译的对象就是一个一个的package。Catkin在编译的时候是在src目录下,以递归形式查找每一个package,所以也可以将多个package放在一个folder下面。
三、ROS核心概念
1.节点
节点(Node)是ROS程序的运行实例(可执行文件的实例化),也可以理解为几乎相互独立的程序,不同节点实现不同功能,节点通过ROS节点管理器(Master)注册信息,并且多个节点可同时运行。(另一角度定义,ROS 程序的运行实例,即一个进程,称为节点。)
2.话题
话题(Topic)是节点之间通讯的桥梁,节点将消息发布到话题,同时也可以订阅话题以接收消息。
3.通讯机制
ROS通讯采用分布式网络结构,使用基于TCP(俗称3次握手)的通信方式,实现模块间点对点的连接。其通讯方式有以下几种。
3.1基于话题(Topic)的通信
①Talker(节点1)向Master(节点管理器)注册发布者的信息,包含发布消息的话题名(此处为"bar",地址为"1234"),Master会将其储存到注册列表,等待接受此话题的Listener(节点2)。
②Listener向Master注册接收者的信息,包含订阅的话题名"bar"。
③Master根据Listener订阅的话题在注册列表寻找与之匹配的话题。如果没有找到匹配的发布者,则等待发布者的加入,如果找到可以与之匹配的发布者信息,则向Listener发送Talker的地址信息"1234"。
④⑤⑥Listener接收到Talker的地址信息,就尝试向Talker发送连接许可,当Talker与Listener互相确认信息后就建立连接(3次握手)。
⑦等连接成功后,Talker才向Listener发送消息(地址为"2345")。可以发现,话题在两节点通讯之间用于相互验证身份,起到桥梁作用。
需要注意的是,这两个节点可以以任意顺序开始、结束,不会导致任何错误,他们是相互独立的。
3.2基于服务(Service)的通信
服务调用(service calls)是ROS另一种通信方法。它与话题通信的区别是:服务允许Client(节点1:客户端)发送请求(request)到Server(节点2:服务器) 并获得一个响应(response),服务调用是双向的,且实现的是一对一的通信;对于话题,消息发布的节点不知道是否有其他节点订阅了这个消息,而订阅的节点也不知道是否有其他节点会发布这个消息,且同一个话题可以有很多个发布者和订阅者。
服务的描述定义了ROS中需求和响应的数据结构,同消息类型一样,服务数据类型也是由一系列域构成的。唯一的区别就在于服务数据类型分为两部分,分别表示请求和响应。
3.3基于参数(Parameter)的通信
通过使用参数服务器(parameter server)来维护变量集的值,包括整数、浮点数、字符串以及其他数据类型。参数服务器允许节点主动查询所需参数的值它们适用于配置那些不会随时间频繁变更的信息。
四、ROS的编译与简单使用
(这里只讲述如何使用别人开发的ROS功能包,暂不讲述如何自己开发)
1.创建一个workspace(工作空间)
打开终端依次执行:
#在/home/你的用户名目录/目录下,新建一个文件夹
mkdir -p ~/catkin_ws/src
#进入到 ~/catkin_ws/src目录下
cd ~/catkin_ws/src
#初始化workspace,执行完该命令后,src目录下会多出一个 CMakeLists.txt 文件。
catkin_init_workspace
2.编译package,生成可执行文件
#返回到上层目录
cd ~/catkin_ws/
#编译,执行完该命令后,发现工作空间catkin_ws中有三个目录: build devel src,其中,src是我们创建工作空间时创建的目录,另外两个是执行完 catkin_make 后生成的。
catkin_make
3.运行ROS节点
#将对应的工作空间的路径加入环境变量ROS_PACKAGE_PATH中。
source devel/setup.bash
#运行package功能包的node节点
rosrun package_name node_name
五、调试工具
1.Rviz和Gazebo
Rviz是一款3D可视化工具,强调把已有的数据可视化显示。
Gazebo是3D物理仿真平台,强调的是创建一个虚拟的仿真环境。
Rviz需要已有的数据,而Gazebo可以创造数据。
我们可以在Gazebo中创建一个机器人世界,不仅可以仿真机器人的运动功能,还可以仿真机器人的传感器数据,而这些数据就可以放到Rviz中显示,所以使用gazebo的时候,经常也会和rviz配合使用。
2.rqt工具
①rqt_graph:查看节点之间的发布-订阅关系。
②rqt_plot:实时显示一个发布到某个话题上的数据变化图形。
3.rosbag
包文件由 ROS 生成,可用于保存话题(Topic)和服务(Service)等传输的信息,采用 *.bag 文件格式。通常用于实验数据的记录和算法调试。
①录制
#如果要记录所有的topic,则可以直接使用-a来记录
rosbag record -a
#如果仅记录某些感兴趣的topic的话,这可以使用下面这个命令样式来进行记录
rosbag record <topic_name> <topic_name>....
#如果要指定录制文件名字的话,则使用-O/-o参数
rosbag record -O bagname.bag <topic_name> <topic_name>... #为文件命名
rosbag record -o bagname <topic_name> <topic_name>... #为文件名字做前缀#其他录制命令如下
rosbag record --duration=30 /topic_name #持续30s录制,还可以指定m,h,和--split类似
rosbag record --split --size=1024 /topic_name1 #空间达到1024M后分文件存储
rosbag record --split --duration=30 /topic_name1 #持续时间到30s后分文件存储
rosbag record --split --duration=5m /topic_name1 #持续时间到5m后分文件存储
rosbag record --split --duration=2h /topic_name1#持续时间到2h后分文件存储
rosbag record -l 1000 /topic_name1 # 录制该主题1000个消息限制
②查看
当录制好bag以后,可以利用info
参数来查看bag的相关信息
rosbag info filename.bag
③播放
#当录制好bag以后,可以利用play参数让bag播放,回放bag中的topic
rosbag play <bagfile>
#如果想改变消息的发布速率,可以用下面的命令,-r 后面的数字对应播放速率
rosbag play -r 2 <bagfile>
#利用参数-l则可实验循环播放
rosbag play -l <bagfile>
#如果只播放感兴趣的 topic ,则用命令
rosbag play bag_name.bag --topics /topic_name1 /topic_name2
#开始播放立刻暂停,按空格继续
rosbag play --pause bag_name.bag
#指定播放起始点
rosbag play bag_name.bag -s 5 #从5s的地方开始播放
#指定播放时长
rosbag play bag_name.bag -u 250 #播放250s信息
#发布时钟,默认
/clock
话题是没有消息的rosbag play --clock bag_name.bag #默认/clock的话题频率100hz
rosbag play --clock --hz 200 bag_name.bag #指定/clock的时钟为200hz
④其他
#rosbag 重新索引是一个命令行工具,用于修复破损的袋文件如果某个包由于任何原因没有清洁地关闭,则索引信息可能已损坏。使用此工具重新读取消息数据并重新生成索引。
rosbag reindex old.bag
#重新录制rostopic filter
#过滤单个
topic
#生成的tf.bag仅包含/tf这一个topic
rosbag filter input.bag only-tf.bag "topic == '/tf'"
#生成的output.bag包含‘/velodyne_point_cloud、/visensor/imu、/visensor/left/image_raw‘这三个topic
rosbag filter input.bag output.bag "topic == '/velodyne_point_cloud' or topic =='/visensor/imu' or topic == '/visensor/left/image_raw'"
#根据时间过滤:
rosbag filter input.bag output.bag "t.to_sec() <= 1284703931.86"
六、常用指令
1.常用的文件系统命令实践
rospack find turtlesim
rosstack find ros_comm
rosls turtlesim
roscd turtlesim
pwd # 显示当前所在目录
cd | cd ~ | cd - | cd .. # 目录跳转
ls | ll # 列出目录和文件
ps -ef # 以完整格式显示所有进程信息
kill <pid> # 杀死指定进程
grep -rn 'publish' ./ # 递归搜索当前目录下包含#"publish"字符串的文件
2.节点(Nodes)相关的命令
rosrun <package-name> <executable-name>
rosnode help
rosnode list
rosnode info <node1> <node2> …
rosnode machine <machine-name>
rosnode ping <node-name>
rosnode kill <node-name>
rosnode cleanup
3.Topic 相关的命令
rostopic help
rostopic list
rostopic echo <topic-name> # eg. /turtle1/pose
rostopic hz <topic-name> # eg. /turtle1/pose
rostopic bw <topic-name> # eg. /turtle1/pose
rostopic info <topic-name> # eg. /turtle1/cmd_vel
rostopic type <topic-name> # eg. /turtle1/cmd_vel
rostopic find <message-type-name>
4.Message 相关的命令
rosmsg help
rosmsg list
rosmsg info <message-type> # eg. turtlesim/Pose# 显示指定软件包中定义的所有消息
rosmsg package <package-name># 显示定义了消息的所有软件包
rosmsg packages
5.Service 相关的命令
rosservice help
rosservice list
rosnode info <node-name> # eg. /turtlesim
rosservice node <service-name> # eg. /clear
rosservice info <service-name> # eg. /clear
rossrv info <service-type-name>
rosservice call <service-name> [args …]
eg. rosservice call /clear # 清除运行轨迹
6.参数服务器相关的命令
rosparam help
rosparam list
rosparam get <param-name> # eg. background_b
rosparam set <param-name> <value>
rosservice call /clear #使背景色生效
总结
本篇介绍了ROS基本入门操作,只涉及ROS的安装和使用已有的程序,暂未考虑开发。