什么是 ROS
ROS(Robot Operating System,机器人操作系统,下文简称“ROS”)是一组软件库和工具的组合,可以帮助构建机器人应用程序。从驱动程序到最先进的算法,以及强大的开发工具,ROS 满足设计一个机器人项目所需要的一切东西,并且这些都是开源的。
ROS 有两个版本 ROS1 和 ROS2:
- ROS Noetic Ninjemys 是针对 Ubuntu 20.04 (Focal) 版本的最新 ROS 1 LTS 版本,将支持到 2025 年 5 月
- Humble Hawksbill 是最新的长期支持 ROS 2 版本。支持 Ubuntu 22.04 和 Windows 10,支持日期 2022 年 5 月 - 2027 年 5 月
相关介绍
为什么说建造一个机器人非常困难,因为你需要考虑的东西非常多。电机、传感器、软件和电池,等等,各种软硬件之间需要无缝的协同配合才能完成你的指令任务。
ROS 是一个从研究到原型设计,一直到部署和生产你都可以使用的开发工具包,它定义了用于构建机器人的组件、接口和工具,帮你简化了整个机器人开发项目的过程。
大多数的机器人运动控制系统都是由驱动器、传感器、控制器或机器人的大脑三部分组成。ROS 帮助开发人员快速构建这些组件,然后使用其话题消息通讯让 ROS 工具轻松的连接它们。在测试,教学和质量保证场景下,可以使用 ROS 的 Bag 文件或日志记录来记录这些通讯消息。
同时,这些消息可以发送到各种可视化和远程操作工具平台中,实现“数字孪生”,也就是说我们也可以通过仿真的方式,轻松的应对测试和教学场景下的使用。
在外围硬件的支持上,ROS 几乎可以和任何组件一起协同工作,只要有提供接口都可以接入进来。它也提供了许多常见的硬件接入,比如相机、激光雷达和电机控制器等,ROS 的模块化架构允许开发人员自行构建,而无需担心外围的硬件的提供商单一或是需要许可费的问题。
使用 ROS 这个通用的开发架构工具,可以让我们更专注于解决实际的业务问题,而不是去重复的创造新的轮子。
ROS 社区也非常庞大,有很多成熟的解决方案。也在不断攻克更多的机器人市场,包括农业、工厂物流、自动驾驶、服务型机器人、餐饮机器人、重工业、无人机、行星探索等等。
在 Ubuntu 22.04 中安装 ROS2
ROS是一个复杂的软件,需要与操作系统库密切的配合,因此建议使用官方推荐的操作系统进行安装使用,否则你可能需要其他非常多的额外的操作才能正常安装使用。这里介绍当前最新的 ROS2 版本 Humble Hawksbill 的安装:
1. 确认字符集
确保默认字符集为 UTF-8 ,可以使用 locale
后检查输出是否含有 UTF-8
,中英皆可。
若未含有 UTF-8
则可进行如下操作:
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
然后再次检查。
2. 添加国内源
添加 ROS 2 GPG(已使用 gitee 上放置的 key ):
sudo apt update && sudo apt install curl gnupg lsb-release
sudo curl -sSL https://gitee.com/sang93/ros_learn/raw/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
添加清华镜像的 ROS2 软件仓库,并更新索引:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
3. 安装 ROS2 包
初学可以使用 Desktop 版 ros-humble-desktop
包含:ROS, RViz, demo 样例 和 教程。
sudo apt install ros-humble-desktop
Desktop 版的东西还挺多,大概需要 2.5G 空间,这个安装过程需要一段时间,做些其他事情安心等待。
在正式部署使用时可以使用基础核心版本
sudo apt install ros-humble-ros-base
另有开发工具可以安装:用于构建 ROS 包的编译器和其他工具
sudo apt install ros-dev-tools
若安装出现错误:无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。该问题大概率是系统有更新没有处理,先将系统升级完成后再次尝试安装。升级介绍可查看此篇文章: 《Ubuntu 桌面系统升级》
4. 环境测试
安装完成后,我们就可以尝试简单的测试示例了。刚刚安装的 ros-humble-desktop
中含有测试的示例,我们直接运行即可。
在终端中运行 c++ 的 talker
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker
然后新开一个终端执行 Python 的 listener
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_py listener
以下就是运行截图,你可以看到发送和接收的消息日志,也可以尝试 Ctrl + C
关闭任意一个终端查看会发生结果。
如果觉得执行配置环境的脚本,比较麻烦,可以直接加入 ~/.bashrc
:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
这样就可不必每次执行环境配置了。
5. 经典小乌龟
讲了 ROS 安装的话,不讲经典的小乌龟控制,就总感觉少了些什么,接下来看如何使用 Turtlesim,其是一个用于学习 ROS 2 的轻量级模拟器,使用下面的命令可以启动它:
ros2 run turtlesim turtlesim_node
启动之后你就可以看到一个小乌龟啦,接着在一个新的终端中输入下面的命令就可以启动一个小乌龟的控制节点:
ros2 run turtlesim turtle_teleop_key
然后记得将鼠标放在这个控制台上保持这个命令行窗体激活,就可以通过方向键控制小乌龟移动了。
注意:前面需要安装桌面版,若未安装桌面版,可单独安装使用命令安装 Turtlesim:
sudo apt install ros-humble-turtlesim
如何使用 .NET 开发
ROS 的开发主要使用的是 C++ 和 Python,在 ROS 的问答社区,对于 C# 支持的呼声可以追溯到十几年前,当然也会有其他的解决方案,毕竟 C++ 还可以包装。
Rosbridge 安装和服务启动
不过官方有一个 Rosbridge 包提供了更多的包容性,为非官方支持的语言提供了 JSON API 到 ROS 功能的桥梁。
首先需要安装 Rosbridge,因为其不是默认安装的组件包:
sudo apt-get install ros-humble-rosbridge-suite
然后启动服务:
ros2 launch rosbridge_server rosbridge_websocket_launch.xml
启动 Rosbridge Server 会看到有一个 Websocket 服务监听本机的 9090 端口。
.NET 调用
在 GitHub 已经存在多个相关的包装好的 .NET 库,这里推荐 ros-sharp 项目中的 RosSharpRosBridgeClient
包。但是这个库是给 Unity 项目用的,使用的 .NET Framework,整个开源项目都是面对 Unity 工程的。
这里就不用这个包了,既然 Websocket 服务已经启动了,直接用 .NET 7 的 System.Net.WebSockets
写个简单 Demo 演示一下。
前面我们在安装测试时介绍了消息发布者和接收者的 Demo,现在我们只启动消息发送者,然后使用 .NET 来接收发布的消息。
- 首先启动
talker
:
ros2 run demo_nodes_cpp talker
- 启动后可以使用下面的命令查看 talker 节点发布的主题:
ros2 topic list
记住这个主题后面要用,当然针对 talker 这个 Demo 都是一样的,都是发布的 /chatter
话题。
可以在 talker 启动前后执行这个命令就会看到
/chatter
话题是启动后增加的新的。
- 创建 .NET 控制台项目:
dotnet new console -o RosDotNet
- 修改
Program.cs
:
using System.Net.WebSockets;
using System.Text;
using System.Text.Json;
class Program
{
static async Task Main(string[] args)
{
Uri webSocketUri = new("ws://localhost:9090");
using SocketsHttpHandler handler = new();
using ClientWebSocket ws = new();
// 连接
await ws.ConnectAsync(webSocketUri, default);
// 构造发送的 Json 内容 订阅主题
var replyMess = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(new{
op= "subscribe",
topic = "/chatter",
type = "std_msgs/String"
}));
// 发送
await ws.SendAsync(new ArraySegment<byte>(replyMess), WebSocketMessageType.Text, true, default);
// 接收一次消息
var bytes = new byte[1024];
var result = await ws.ReceiveAsync(bytes, default);
string res = Encoding.UTF8.GetString(bytes, 0, result.Count);
Console.WriteLine(res);
// 关闭退出
await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Client closed", default);
}
}
这里说明一下,因为我是在 WSL 环境下安装的 ROS2 ,所以在 Windows 电脑是可以使用 localhost 访问,实际操作修改为 ROS 的 IP 即可。
发送的 Json 内容是订阅 /chatter
主题:
{ "op": "subscribe",
(optional) "id": <string>,
"topic": <string>,
(optional) "type": <string>,
(optional) "throttle_rate": <int>,
(optional) "queue_length": <int>,
(optional) "fragment_size": <int>,
(optional) "compression": <string>
}
格式是根据 ROS 协议文档编写的,查阅 Rosbridge Suite 的文档可前往:https://github.com/RobotWebTools/rosbridge_suite/blob/ros2/ROSBRIDGE_PROTOCOL.md
注意:必须指定消息的 type 否则服务端会报错无法成功订阅: subscribe: Cannot infer topic type for topic /talker as it is not yet advertised.
Demo 地址:https://github.com/sangyuxiaowu/RosDotNetWsDemo
- 运行:
执行程序我们可以看到在控制台接收到了 talker
发布的消息。
ROS 有什么优势
最后,经过这几天的了解,我将其总结如下:
- 简化各个系统间的协同控制,不用重复造轮子
- 完善的工具链支持:组件 ,接口,工具一应俱全
- 易于调试,Bag File 和日志记录,便于测试、培训和质量保证
- 学习资源丰富且支持仿真,易于学习和测试
- 支持接入的设备广泛,不用担心授权费用和单一供应商
- 社区生态良好,专家众多,有很多各行各业的解决方案,
- 广泛应用于机器人行业中,很多科研机构和世界 500 强企业都在使用
- 开源免费,商业友好
感兴趣的同学,可以一起学习起来了。