Ubuntu20.04安装ROS-Noetic
一、ROS基础概述
1、操作系统安装
ROS目前只能在基于Unix的平台上运行,因此我们使用Ubuntu来作为ROS的系统。这里我们安装了Ubuntu20.04
和ROS Noetic Ninjemys
。本机和虚拟机安装详见以下文章,选其中一种即可
笔记本安装 Windows10 和 Ubuntu20.04 双系统
2、ROS Noetic安装
官网ROS Noetic安装教程参考:https://wiki.ros.org/cn/noetic/Installation/Ubuntu
1、配置系统软件源
打开“软件更新”,进入到“Ubuntu软件“页面,允许universe、restricted、multiverse三项,源换成国内源即可。
2、添加ROS软件源
1 | sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' |
3、设置密钥
1 | sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 |
4、安装ROS
1 | #更新apt索引包 |
5、设置环境
1 | echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc |
6、小海龟测试
终端输入roscore
可以查看安装好的ros的发行版名称为noetic和版本号;ctrl+Alt+t
再次打开一个新的终端,输入rosrun turtlesim turtlesim_node
,即会出现小海龟的仿真界面;再次打开新终端,输入rosrun turtlesim turtle_teleop_key
,即可控制小海龟移动了。
二、核心概念
1、ROS介绍
ROS (Robot Operating System, 机器人操作系统) 提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。
ROS中文官网:https://wiki.ros.org/cn
2、ROS核心概念
节点与节点管理器
-
节点(Node)—— 执行单元
执行具体任务的进程、独立运行的可执行文件;不同节点可使用不同的编程语言,可分布式运行在不同的主机;节点在系统中的名称必须是唯一的。 -
节点管理器 (ROS Master)—— 控制中心
为节点提供命名和注册服务;跟踪和记录话题/服务通信,辅助节点相互查找、 建立连接;提供参数服务器,节点使用此服务器存储和检索 运行时的参数。
话题通信
-
话题(Topic)—— 异步通信机制
节点间用来传输数据的重要总线;使用发布(Publisher)/订阅(Subscriber)模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一。 -
消息(Message)——话题数据
话题的具体数据称为消息(Message),使用.msg文件定义;消息用来描述话题当中具体的数据类型,在ROS中,有些消息已经被预定义了,比如雷达、图像等,也可以自定义消息。
服务通信
- 服务(Service)—— 同步通信机制
使用客户端(Service)/服务器(Client)模型,客户端发送请求数据,服务器完成 处理后返回应答数据。使用.src文件定义。
话题与服务区别
话题 | 服务 | |
---|---|---|
同步性 | 异步 | 同步 |
通信模型 | 发布/订阅 | 服务器/客户端 |
底层协议 | ROSTCP/ROSUDP | ROSTCP/ROSUDP |
反馈机制 | 无 | 有 |
缓冲区 | 有 | 无 |
实时性 | 弱 | 强 |
节点关系 | 多对多 | 一对多(一个server) |
适用场景 | 数据传输 | 逻辑处理 |
参数
- 参数(Parameter)—— 全局共享字典
可通过网络访问的共享、多变量字典;节点使用此服务器来存储和检索运行时的参数;适合存储静态、非二进制的配置参数,不适合存储动态配置的数据。
文件系统
-
功能包(Package): ROS软件中的基本单元,包含节点源码、配置文件、数据定义等。
-
功能包清单(Package manifest):记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等。
-
元功能包(Meta Packages):组织多个用于同一目的功能包。
3、ROS常用命令行工具
1 | #分别在四个终端打开运行 |
rosnode节点命令
1 | #查看活动节点 |
rostopic话题命令
1 | #以10Hz的频率发布话题移动海龟,这里命令用双击tab补全后修改 |
rosmsg消息命令
1 | #查看消息 |
rosservice服务命令
1 | #打印可用服务 |
rosbag命令
1 | #保存所有步骤,-O代表保存的压缩包路径 |
另外还有rosparam、rossrv等命令
三、编程基础
1、工作空间创建
工作空间(workspace)是一个存放工程开发相关文件的文件夹。
- src:代码空间(Source Space)
- build:编译空间(Build Space)
- devel:开发空间(Development Space)
- install:安装空间(Install Space)
1、创建工作空间catkin_ws
1 | #创建目录 |
**2、编译工作空间 **
1 | #需要在整个工作目录下编译 |
3、设置环境变量
1 | echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc |
4、创建功能包
1 | #std_msgs:包含常见消息类型 |
package.xml
是功能包的描述文件,CMakeLists.txt
定义编译规则,编译出的文件在devel
目录下的include文件夹(头文件)和lib文件夹(可执行文件)
5、编译功能包
1 | cd ~/catkin_ws |
2、Topic话题通信
下载功能包
1 | #下面的服务功能都需要依赖以下功能包 |
1、发布者publisher编程实现
指发布程序代码给海龟仿真器,控制海龟运动
1、编写发布者代码
发布者流程
- 初始化ROS节点;
- 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型;
- 创建消息数据;
- 按照一定频率循环发布消息。
以下两种语言二选一即可
1 | /** |
python文件需要确保文件拥有可执行权限,这里我把python文件都放在了scripts文件夹下,在此打开终端,运行chmod +x *.py
1 | #!/usr/bin/env python3 |
2、定义编译规则
仅C++代码需要定义编译规则,python代码可直接运行
1 | #打开功能包的CMakeLists.txt文件,在build下添加以下规则 |
3、编译
仅C++代码需要编译,python代码可直接运行
1 | #要在工作空间下编译 |
4、运行
运行成功后海龟按照发布者的程序进行运动
1 | #首先刷新一下环境变量,放入本地环境变量了也可以不刷新 |
2、订阅者subscriber编程实现
流程步骤与发布者相似,订阅者可以监听海龟的位置信息变化并打印在屏幕
订阅者流程
- 初始化ROS节点;
- 订阅需要的话题;
- 循环等待话题消息,接收到消息后进入回调函数;
- 在回调函数中完成消息处理。
C++订阅代码
1 | /** |
python订阅代码
1 | #!/usr/bin/env python3 |
3、自定义话题通信
ROS Master作为节点管理者,负责节点之间的通信连接,一旦发布者和消息者之间连通后,master关机后两者仍可通信,但无法更改对象
在learning_topic
文件夹下创建msg
文件夹,在里面创建Person.msg
文件(注意一定要叫msg
文件夹,在CMakeLists.txt
规则有写),定义话题消息
1 | string name |
在功能包的package.xml
文件下添加依赖
1 | <build_depend>message_generation</build_depend> |
在CMakeLists.txt
文件下添加编译规则,C++和python都需要。找到对应的配置文件下添加编译选项
1 | find_package(catkin REQUIRED COMPONENTS |
最后编译生成相关依赖
1 | cd ~/catkin_ws |
1、C++文件
C++文件放置在功能包learning_topic下的src文件夹
发布者
1 | /** |
订阅者
1 | /** |
在CMakeLists.txt
文件下的build下添加编译规则
1 | add_executable(person_publisher src/person_publisher.cpp) |
编译与运行
1 | cd ~/catkin_ws |
2、python文件
py文件都放置在功能包learning_topic下的scripts文件夹
发布者
1 | #!/usr/bin/env python3 |
订阅者
1 | #!/usr/bin/env python3 |
运行
1 | #获得可执行权限 |
3、Service服务通信
下载功能包
1 | cd ~/catkin_ws/src |
1、客户端Client编程实现
C++代码
1 | /** |
在CMakeLists.txt
增加编译规则
1 | add_executable(turtle_spawn src/turtle_spawn.cpp) |
运行
1 | cd ~/catkin_ws |
python代码
1 | #!/usr/bin/env python3 |
运行
1 | cd ~/catkin_ws |
2、服务端Service编程实现
C++代码
1 | /** |
python代码
1 | #!/usr/bin/env python3 |
其他操作和客户端相似,海龟启动后通过rosservice call /turtle_command
命令改变海龟运动状态
3、自定义数据服务
自定义请求和应答内容,通过请求进行控制
在learning_service
文件夹下创建srv
文件夹,在里面创建Person.srv
文件(注意一定要叫srv文件夹,在CMakeLists.txt
规则有写),定义数据。三杠上方代表Request参数,下方代表Response参数
1 | string name |
在功能包的package.xml
文件下添加依赖
1 | <build_depend>message_generation</build_depend> |
在CMakeLists.txt
文件下添加编译规则,C++和python都需要。找到对应的配置文件下添加编译选项
1 | find_package(catkin REQUIRED COMPONENTS |
最后编译生成相关依赖
1 | cd ~/catkin_ws |
1、C++文件
服务器
1 | /** |
客户端
1 | /** |
在CMakeLists.txt
文件下的build下添加编译规则
1 | add_executable(person_server src/person_server.cpp) |
编译运行
1 | cd ~/catkin_ws |
2、python文件
服务器
1 | #!/usr/bin/env python3 |
客户端
1 | #!/usr/bin/env python3 |
运行
1 | #获得可执行权限 |
4、全局参数使用与编程
下载功能包
1 | cd ~/catkin_ws/src |
rosparam基本命令
1 | #列出当前多有参数 |
1、C++文件
和前面一样,需要添加编译规则
1 | /** |
添加编译规则
1 | add_executable(parameter_config src/parameter_config.cpp) |
运行
1 | cd ~/catkin_ws |
2、python文件
1 | #!/usr/bin/env python3 |
运行
1 | cd ~/catkin_ws |
四、ROS常用组件
1、ROS坐标变换
1、简单介绍与使用
1 | #这里因为ubuntu20没有python命令,所以我复制了/usr/bin中的python3变成python |
2、广播与监听编程实现
如何实现一个tf广播器
- 定义TF广播器(TransformBroadcaster)
- 创建坐标变换值;
- 发布坐标变换(sendTransform)
如何实现一个TF监听器
- 定义TF监听器;(TransformListener)
- 查找坐标变换;(waitFor Transform、lookupTransform)
1 | cd ~/catkin_ws/src |
这里有点问题
2、launch启动文件
传统启动节点的方法:每启动一个节点都要打开一个新的终端运行一个新的命令,当系统中的节点数量许多时,显然是很不方便的,而且命令的输入也可能会发生错误。
launch启动文件的引入:可以同时启动多个节点,并且可以自动启动ROS Master节点管理器以及实现每个节点的各种配置,为多个节点的操作提供很大的便利。
1、基本介绍
< launch >
launch文件中的根元素采用< launch >标签定义,里面包含所有节点的启动配置内容
< node >
启动节点
1 | <node pkg="turtlesim" name="sim1" type="turtlesim_node"/> |
-
pkg:节点所在的功能包名称
-
type:节点的可执行文件名称
-
name:节点运行时的名称
-
output, respawn, required, ns, args
< param > / < rosparam > 参数
设置ROS系统运行中的参数,存储在参数服务器中。
1 | <param name="output_frame" value="odom"/> |
- name:参数名
- value:参数值
加载参数文件中的多个参数:
1 | <rosparam file="params.yaml" command="load" ns="params" /> |
< arg > 参数
launch文件内部的局部变量,仅限于launch文件使用
1 | <arg name="arg-name" default="arg-value" /> |
- name:参数名
- value:参数值
==param设置的参数是存储在ROS参数服务器中的,而arg设置的参数仅限于launch文件中==
< remap > 重映射
重映射ROS计算图资源的命名。
1 | <remap from="/turtlebot/cmd_vel" to="/cmd_vel"/> |
- from:原命名
- to:映射之后的命名
< include > 嵌套
包含其他launch文件,类似C语言中的头文件包含。
1 | <include file="$(dirname)/other.launch" /> |
- file:包含的其他launch文件路径
2、launch简单示例
首先创建功能包,在里面创建launch文件夹,一般launch都放在里面(可自定义文件夹名)
1 | cd ~/catkin_ws/src |
简单订阅者发布者
名为simple.launch
1 | <launch> |
1 | #需要编译才能识别 |
config的launch文件
在config/param.yml
文件下
1 | A: 123 |
turtlesim_parameter_config.launch
文件
1 | <launch> |
运行,可以看见节点参数的不同,不同位置显示的参数位置也不同
1 | #回到工作空间目录运行 |
remap使用
1 | <launch> |
3、可视化工具
rqt_console:日志输出工具
rqt_graph:计算图可视化工具
rqt_plot:数据绘图工具
rqt_image_view:图像渲染工具
Rviz:三维可视化工具
GazeBo:三维物理仿真平台
五、学习资料
ROS: https://www.ros.org
ROS Wiki: http://wiki.ros.org
ROSCon 2012~2019:https://roscon.ros.org
ROS Robots: https://robots.ros.org
Ubuntu Wiki: https://wiki.ubuntu.org.cn
古月居:http://www.guyuehome.com
古月居泡泡:https://www.guyuehome.com/Bubble
古月学院:https://class.guyuehome.com
如何学习ROS:
https://mp.weixin.qq.com/s/uYvGuiG-TlOalWUynR2Nzg
一起从零手写URDF模型:
https://class.guyuehome.com/detail/p5eleea4fe1e5c_lgm126Xn/6
如何从Solidworks导出URDF模型
https://class.guyuehome.com/detail/p5e32dce7906e0_6TqS7BwX/6
如何在Gazebo中实现移动机器人仿真:
https://class.guyuehome.com/detail/p_5eb2366befe4aE4rbNmXt/6
Movelt可视化配置及仿真指南
https://class.guyuehome.com/detail/p_5e71966b3fdfd_g4DpRGg9/6