ROS2 机器人操作系统入门和安装以及如何使用 .NET 进行开发

news2025/8/10 5:39:39

本文是 ROS2 入门的第一课,简单介绍了 ROS 系统,并演示了 ROS2 系统在 Ubuntu 22.04 中的安装(使用 gitee 和清华源)以及其中错误的解决。最后对其优势进行总结,为什么选择 ROS。最后介绍简单 Demo 和如何使用 .NET 接入的其中一种方式。

什么是 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 文件或日志记录来记录这些通讯消息。

Bag

同时,这些消息可以发送到各种可视化和远程操作工具平台中,实现“数字孪生”,也就是说我们也可以通过仿真的方式,轻松的应对测试和教学场景下的使用。

数字孪生

在外围硬件的支持上,ROS 几乎可以和任何组件一起协同工作,只要有提供接口都可以接入进来。它也提供了许多常见的硬件接入,比如相机、激光雷达和电机控制器等,ROS 的模块化架构允许开发人员自行构建,而无需担心外围的硬件的提供商单一或是需要许可费的问题。

接入

使用 ROS 这个通用的开发架构工具,可以让我们更专注于解决实际的业务问题,而不是去重复的创造新的轮子。

ROS 社区也非常庞大,有很多成熟的解决方案。也在不断攻克更多的机器人市场,包括农业、工厂物流、自动驾驶、服务型机器人、餐饮机器人、重工业、无人机、行星探索等等。

行业

在 Ubuntu 22.04 中安装 ROS2

ROS是一个复杂的软件,需要与操作系统库密切的配合,因此建议使用官方推荐的操作系统进行安装使用,否则你可能需要其他非常多的额外的操作才能正常安装使用。这里介绍当前最新的 ROS2 版本 Humble Hawksbill 的安装:

1. 确认字符集

确保默认字符集为 UTF-8 ,可以使用 locale 后检查输出是否含有 UTF-8,中英皆可。

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 关闭任意一个终端查看会发生结果。

运行demo

如果觉得执行配置环境的脚本,比较麻烦,可以直接加入 ~/.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

安装 Rosbridge

然后启动服务:

ros2 launch rosbridge_server rosbridge_websocket_launch.xml

启动 Rosbridge

启动 Rosbridge Server 会看到有一个 Websocket 服务监听本机的 9090 端口。

.NET 调用

在 GitHub 已经存在多个相关的包装好的 .NET 库,这里推荐 ros-sharp 项目中的 RosSharpRosBridgeClient 包。但是这个库是给 Unity 项目用的,使用的 .NET Framework,整个开源项目都是面对 Unity 工程的。

这里就不用这个包了,既然 Websocket 服务已经启动了,直接用 .NET 7 的 System.Net.WebSockets 写个简单 Demo 演示一下。

前面我们在安装测试时介绍了消息发布者和接收者的 Demo,现在我们只启动消息发送者,然后使用 .NET 来接收发布的消息。

  1. 首先启动 talker
ros2 run demo_nodes_cpp talker
  1. 启动后可以使用下面的命令查看 talker 节点发布的主题:
ros2 topic list

记住这个主题后面要用,当然针对 talker 这个 Demo 都是一样的,都是发布的 /chatter 话题。

查看 topic

可以在 talker 启动前后执行这个命令就会看到 /chatter 话题是启动后增加的新的。

  1. 创建 .NET 控制台项目:
dotnet new console -o RosDotNet
  1. 修改 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

  1. 运行:

执行程序我们可以看到在控制台接收到了 talker 发布的消息。

查看 topic

ROS 有什么优势

最后,经过这几天的了解,我将其总结如下:

  1. 简化各个系统间的协同控制,不用重复造轮子
  2. 完善的工具链支持:组件 ,接口,工具一应俱全
  3. 易于调试,Bag File 和日志记录,便于测试、培训和质量保证
  4. 学习资源丰富且支持仿真,易于学习和测试
  5. 支持接入的设备广泛,不用担心授权费用和单一供应商
  6. 社区生态良好,专家众多,有很多各行各业的解决方案,
  7. 广泛应用于机器人行业中,很多科研机构和世界 500 强企业都在使用
  8. 开源免费,商业友好

感兴趣的同学,可以一起学习起来了。

喜欢这篇文章的朋友可以点赞,评论加收藏三连起来啦,点波关注不迷路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33938.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ThingsBoard源码解析-规则引擎

描述 规则引擎是Thingsboard的核心部分&#xff0c;基于Actor编程模型&#xff0c;类似事件驱动&#xff1b; 每个actor都有自己的消息队列&#xff08;mailBox&#xff09;保存接收到的消息 actor可以创建actor actor可以将消息转发给其他actor 分析 Actor模型实现 系统…

戴尔科技集团通过多云数据保护和安全创新增强网络弹性

中国北京——2022年11月18日 Dell PowerProtect Data Manager软件更新和新一代备份一体机可帮助客户提高运维安全和网络弹性 戴尔多云数据保护解决方案利用内置的安全运维功能加速采用零信任原则 2022年全球数据保护指数(GDPI)调查结果公布 戴尔科技集团(NYSE:Dell)扩大其在数据…

OA系统,有效提升企业办公效率落实执行力

企业管理的成功将最终取决于企业的执行情况&#xff0c;只要有良好的经营管理&#xff0c;管理系统&#xff0c;一个好的领导者&#xff0c;充分调动员工的积极性&#xff0c;将能最大限度的管理执行力。 OA协同办公系统提供了工作流和协同工作互补结合。工作流程严格规定了工作…

PCB铺铜的优点与缺点

PCB设计铺铜是电路板设计的一个非常重要的环节。 什么是PCB铺铜&#xff0c;就是将PCB上无布线区域闲置的空间用固体铜填充。铺铜的意义在于减小地线阻抗&#xff0c;提高抗干扰能力;降低压降&#xff0c;提高电源效率&#xff0c;与地线相连&#xff0c;还可以减小环路面积。 …

基于蛙跳算法求解简单调度问题附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

python与Electron联合编程记录之九(Electron与Flask联合编程实现)

前面铺垫了这么多&#xff0c;这一节就要真正的实现Electron与python联合编程。这一节我通过加法器这个简单的例子来演示如何真正实现Electron和Flask联合编程。 1、安装Axios包 在终端工具选项卡中输入如下命令安装Axios包: npm i --save-dev axios2、项目结构 项目结构如下…

C语言源代码系列-管理系统之家庭财务小管家

往期文章分享点击跳转>《导航贴》- Unity手册&#xff0c;系统实战学习点击跳转>《导航贴》- Android手册&#xff0c;重温移动开发 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过…

COLMAP输出的文件类型(bin, txt)

默认情况下&#xff0c;COLMAP使用二进制文件格式(bin&#xff0c;机器可读&#xff0c;速度速)来存储稀疏模型。此外&#xff0c;COLMAP也可以将稀疏模型存储为文本文件(txt&#xff0c;人类可读&#xff0c;速度慢)。在这两种情况下&#xff0c;模型导出的信息被分为关于相机…

【吴恩达机器学习笔记】三、矩阵

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

Cygwin安装

Cygwin是一个在Windows平台上运行的类UNIX模拟环境&#xff0c;在其提供的命令行界面中完美地兼容了Windows和Linux的命令行指令&#xff0c;安装和使用教程很容易百度到&#xff0c;可从官网下载安装包&#xff1a;Cygwin官网。安装步骤如下所示&#xff0c;也可自行百度安装方…

web网页设计实例作业HTML+CSS+JavaScript蔬菜水果商城购物设计

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

测试工程师们需要认真思考的几个问题

一、如何保证合适的测试用例覆盖率 测试是一个经济学的概念&#xff0c;不计成本的测试最终会受到市场的惩罚和用户的抛弃。所以为了体现这种明智&#xff0c;测试用例设计所追求的目标不是100%覆盖&#xff0c;而应该是均匀覆盖。让测试用例均匀覆盖功能点的理念&#xff0c;其…

Buildroot 开发

转载&#xff1a;https://wiki.t-firefly.com/AIO-3288C/buildroot_develop.html Buildroot 开发 Buildroot 是 Linux 平台上一个构建嵌入式 Linux 系统的框架。整个 Buildroot 是由 Makefile(*.mk) 脚本和 Kconfig(Config.in) 配置文件构成的。你可以和编译 Linux 内核一样&am…

PreScan快速入门到精通第三十八讲基于车道线识别传感器的车道偏离算法Demo讲解

车道偏离系统介绍: 什么是车道偏离警告? 车道偏离警告是一种先进的驾驶辅助系统(ADAS),在许多较新的车辆中发现。它在司机无意离开自己的车道时发出声音、视觉或者通过方向盘振动,甚至安全带预紧的方式给与驾驶员警告。 当汽车意外地离开道路时,就会发生车祸--而且可能…

户外运动耳机如何选择、最优秀的五款户外运动耳机推荐

有些人花时间在户外纯粹是为了听听大自然的声音。其他人可能不想在没有娱乐或鼓舞人心的音频选择的情况下跑步、徒步、散步或骑自行车。找到适合锻炼的耳机相当简单&#xff0c;就像健身耳机一样&#xff0c;您会希望这些耳机能够舒适、安全地贴合您的耳朵&#xff0c;这样它们…

hadoop集群安装(四):安装hadoop集群

文章目录说明分享环境节点规划如下安装hadoop上传安装包配置hadoop配置说明默认配置自定义配置修改配置修改core-site.xml修改hdfs-site.xml修改yarn-site.xml修改mapred-site.xml同步配置添加环境变量并同步启动hadoop配置workers文件格式化集群启动HDFS启动yarn验证验证hdfs验…

Design Compiler工具学习笔记(6)

目录 引言 知识储备 实际操作 设计源码 仿真源码 VCS执行仿真 DC 综合 引言 本篇继续学习 DC的基本使用。本篇主要学习 DC 综合之后的效果分析&#xff0c;重点在时序分析。 前文链接&#xff1a; Design Compiler工具学习笔记&#xff08;1&#xff09; Design Comp…

【华为上机真题 2022】字符串比较

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

Document-level Event Extraction via Parallel Prediction Networks论文解读

Document-level Event Extraction via Parallel Prediction Networks paper&#xff1a;Document-level Event Extraction via Parallel Prediction Networks - ACL Anthology code&#xff1a;HangYang-NLP/DE-PPN (github.com) 期刊/会议&#xff1a;ACL2021 摘要 当在整…

你认为低代码能够完全取代程序猿吗?

前言 最近在接入低代码平台&#xff0c;忙着把功能塞进去&#xff0c;没有时间思考&#x1f914;我们公司也在寻找低代码可以发力的点&#xff0c;所以我做完第一批小白鼠去试验了&#xff0c;我的想法是从一个问题带大家思考&#xff0c;从大方面来讲低代码的作用、应用场景&…