本文是 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/ 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 包[2]提供了更多的包容性,為非官方支援的語言提供了 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[3] 項目中的
RosSharpRosBridgeClient
包。但是這個庫是給 Unity 項目用的,使用的 .NET Framework,整個開源項目都是面對 Unity 工程的。
這裡就不用這個包了,既然 Websocket 服務已經啟動了,直接用 .NET 7 的
System.Net.WebSockets
寫個簡單 Demo 示範一下。
前面我們在安裝測試時介紹了消息釋出者和接收者的 Demo,現在我們隻啟動消息發送者,然後使用 .NET 來接收釋出的消息。
1.首先啟動
talker
:
ros2 run demo_nodes_cpp talker
2.啟動後可以使用下面的指令檢視 talker 節點釋出的主題:
ros2 topic list
記住這個主題後面要用,當然針對 talker 這個 Demo 都是一樣的,都是釋出的
/chatter
話題。
檢視 topic
可以在 talker 啟動前後執行這個指令就會看到 /chatter
話題是啟動後增加的新的。
3.建立 .NET 控制台項目:
dotnet new console -o RosDotNet
4.修改
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
5.運作:
執行程式我們可以看到在控制台接收到了
talker
釋出的消息。
檢視 topic
ROS 有什麼優勢
最後,經過這幾天的了解,我将其總結如下:
1.簡化各個系統間的協同控制,不用重複造輪子2.完善的工具鍊支援:元件 ,接口,工具一應俱全3.易于調試,Bag File 和日志記錄,便于測試、教育訓練和品質保證4.學習資源豐富且支援仿真,易于學習和測試5.支援接入的裝置廣泛,不用擔心授權費用和單一供應商6.社群生态良好,專家衆多,有很多各行各業的解決方案,7.廣泛應用于機器人行業中,很多科研機構和世界 500 強企業都在使用8.開源免費,商業友好
感興趣的同學,可以一起學習起來了。
References
[1]
Rosbridge 包: http://wiki.ros.org/rosbridge_suite
[2]
ros-sharp: https://github.com/siemens/ros-sharp