ROS程序设计系列 - 1.ROS介绍
1. 源由
目前,在最有路径计算和SLAM(Simultaneous Localization and Mapping)地图重建方面,ROS系统提供的生态最为完善。
因此,很多机器人方面的研发人员使用最多的就是ROS(Robot Operating System)系统。
另外,前面我们了解了无人机路径计算算法:
- Linux 35.5 + JetPack v5.1.3@FC-Planner编译安装
- Linux 35.5 + JetPack v5.1.3@ego-planner-swarm编译安装
- Linux 35.5 + JetPack v5.1.3@ ego-planner编译安装
- Linux 35.5 + JetPack v5.1.3@RACER编译安装
- Linux 35.5 + JetPack v5.1.3@FUEL编译安装
- Linux 35.5 + JetPack v5.1.3@FUEL编译安装
目前还是基于ROS,尚未对ROS2进行移植,我相信在一段时间内,估计也不可能快速的切换到ROS2.
除此之外,我们还有Ardupilot Rover/Copter的应用(今后可能还有Boat/Submarine等)
因此,我们将学习和整理下ROS系统的架构和基本编程应用。
2. ROS介绍
从概念定义上,个人觉得ROS可以定义为一个中间件(middleware)。
其底层仍然是Linux系统,但是ROS应用编程采用的是ROS API,封装了很多标准ROS包,这些包不仅仅简单功能API,还有很多动态管理服务,因此中间件的说法更为合适。
在 ROS(Robot Operating System)中,中间件起到了关键作用,用于节点之间的通信和数据交换。ROS 中的中间件通常指的是通信框架,主要包括以下几个关键组件:
-
ROS Master:ROS Master 是整个 ROS 网络的核心,它负责节点注册、查找和管理。每个 ROS 网络中都需要一个 Master,它可以记录节点的信息,并帮助节点找到彼此。Master 并不参与实际数据的传输,而只是提供节点间的联系信息。
-
节点(Nodes):节点是 ROS 中的基本执行单位,每个节点是一个独立的进程,负责特定的功能。节点可以通过发布和订阅(publish/subscribe)机制、服务(service)和动作(action)等方式进行通信。
-
话题(Topics):话题是节点之间进行异步通信的渠道。一个节点可以发布消息到某个话题,其他节点可以订阅这个话题以接收消息。话题适用于需要频繁更新的数据流,比如传感器数据。
-
消息(Messages):消息是 ROS 中节点之间传递的数据结构。ROS 提供了一套标准消息类型,开发者也可以自定义消息类型。
-
服务(Services):服务提供了一种同步通信方式,适用于需要请求-响应模式的场景。一个节点可以定义一个服务,其他节点可以通过调用该服务来请求特定的操作并等待响应。
-
动作(Actions):动作是一种增强的服务机制,适用于需要长时间运行并且需要反馈的任务。动作可以提供任务执行的进度和中途取消的能力。
ROS 中的中间件通常基于发布-订阅模式(Publish-Subscribe Pattern)和客户端-服务器模式(Client-Server Pattern),这使得 ROS 能够灵活、高效地处理机器人系统中的各种通信需求。
ROS 1 中,默认使用的是基于 TCP 的通信协议(TCPROS),也可以使用 UDP(UDPROS)来实现低延迟的通信。在 ROS 2 中,采用了数据分发服务(DDS)作为默认的中间件,这提供了更好的实时性、可扩展性和安全性。DDS 是一种工业标准的中间件协议,广泛应用于分布式实时系统。
3. 关键要点
3.1 中间件组成
- 2007年斯坦福人工智能实验室开始投入
- 2013年OSRF组织接管项目
- 当前已经成为机器人行业不成文的一个标准平台
3.2 功能特性
- 消息解耦
- 分布式部署
- 多语言支持
- 轻量化组件
- 开源代码
3.3 消息分发
3.3.1 ROS Master
ROS Master 是整个 ROS 网络的核心,它负责节点注册、查找和管理。
命令:
$ roscore
3.3.2 ROS Node
节点是 ROS 中的基本执行单位,每个节点是一个独立的进程,负责特定的功能。
命令:
$ rosrun package_name node_name
$ rosnode list
$ rosnode info node_name
3.3.3 ROS Topic
话题是节点之间进行异步通信的渠道。
命令:
$ rostopic list
$ rostopic echo /topic
$ rostopic info /topic
3.3.4 ROS Message
消息是 ROS 中节点之间传递的数据结构。
命令:
$ rostopic type /topic
$ rostopic pub /topic type data
3.4 tutorial示例
以Linux 35.5 + ros-noetic@Jetson Orin Nano为例:
- 安装示例程序
$ sudo apt-get install ros-noetic-roscpp-tutorials
- 运行roscore
$ roscore
... logging to /home/daniel/.ros/log/fe950290-2b71-11ef-b45c-200b7460c5b7/roslaunch-nvidia-8506.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://nvidia:45373/
ros_comm version 1.16.0
SUMMARY
========
PARAMETERS
* /rosdistro: noetic
* /rosversion: 1.16.0
NODES
WARNING: IP addresses 0.0.0.0 for local hostname 'nvidia' do not appear to match
any local IP address (127.0.0.1,192.168.1.19,172.17.0.1). Your ROS nodes may fail to communicate.
Please use ROS_IP to set the correct IP address to use.
auto-starting new master
process[master]: started with pid [8524]
ROS_MASTER_URI=http://nvidia:11311/
setting /run_id to fe950290-2b71-11ef-b45c-200b7460c5b7
process[rosout-1]: started with pid [8544]
started core service [/rosout]
- 运行talker程序
$ rosrun roscpp_tutorials talker
[ INFO] [1718495429.976510980]: hello world 0
[ INFO] [1718495430.076535932]: hello world 1
[ INFO] [1718495430.176508181]: hello world 2
[ INFO] [1718495430.276509423]: hello world