Arduino開(kāi)發(fā)板經(jīng)常用于制作一些小型的機(jī)器人,并具有簡(jiǎn)單的邏輯定義控制。但是,由于板載計(jì)算能力和軟件有限,開(kāi)發(fā)人員常常無(wú)法升級(jí)到更復(fù)雜的機(jī)器人。通常,隨著開(kāi)發(fā)人員變得越來(lái)越有經(jīng)驗(yàn),他們會(huì)尋專用于機(jī)器人的軟件,因?yàn)锳rduino僅提供部分控件。
在本篇文章中,我們主要介紹了中間件軟件框架Robot Operating System(ROS),并引導(dǎo)您通過(guò)Arduino設(shè)置和使用ROS來(lái)創(chuàng)建更智能的機(jī)器人系統(tǒng)。
什么是ROS?
機(jī)器人操作系統(tǒng)(ROS)是最流行和使用最廣泛的機(jī)器人中間件軟件框架之一。這是一個(gè)開(kāi)放源代碼平臺(tái),可幫助創(chuàng)客和開(kāi)發(fā)人員在無(wú)需重新發(fā)明輪子的情況下開(kāi)始使用機(jī)器人軟件。 ROS提供了一種標(biāo)準(zhǔn)的通信體系結(jié)構(gòu),用于無(wú)縫集成、使用、開(kāi)發(fā)和部署機(jī)器人系統(tǒng)的不同組件,包括控制、感知、計(jì)劃等。這是一個(gè)與語(yǔ)言無(wú)關(guān)的平臺(tái),無(wú)論部署在何處,都可以為不同的計(jì)算機(jī)提供跨平臺(tái)的通信支持。
Arduino可能是最常用的開(kāi)源微控制器開(kāi)發(fā)板,它提供了易于使用的軟件-硬件界面以及不斷擴(kuò)展的用戶社區(qū)。 Arduino幾乎與所有數(shù)字和模擬電路以及支持串行通信接口(如SPI、I2C和UART)的外部設(shè)備兼容。
基于ROS的軟件框架運(yùn)行高級(jí)算法和流程,例如機(jī)器人模型的推理、過(guò)濾、運(yùn)動(dòng)策略生成、控制器算法等。安裝在機(jī)器人上的Arduino控制器用于執(zhí)行低級(jí)/嵌入式控制和傳感。它包括、電動(dòng)機(jī)控制、溫度和超聲傳感器、IMU和車輪編碼器以及其他設(shè)備。
ROS-Arduino交互管道
ROS與Arduino之間的通信
ROS通信模塊基于自定義的TCPROS協(xié)議進(jìn)行操作,使用兩種方式:多對(duì)多發(fā)布者-訂閱者方法和點(diǎn)對(duì)點(diǎn)更快服務(wù)方法。本篇文章使用發(fā)布者/訂閱者在Arduino開(kāi)發(fā)板和機(jī)器上運(yùn)行的ROS之間進(jìn)行通信。
rosserial ROS軟件包使用Arduino的通用異步接收器/發(fā)送器(UART)通信,并將開(kāi)發(fā)板轉(zhuǎn)換為ROS節(jié)點(diǎn),該節(jié)點(diǎn)可以發(fā)布ROS消息,也可以訂閱消息。 Arduino ROS節(jié)點(diǎn)發(fā)布者可以從板上將數(shù)據(jù)(從傳感器或機(jī)器人狀態(tài))發(fā)送到運(yùn)行ROS的機(jī)器,而Arduino ROS節(jié)點(diǎn)訂閱者可以從機(jī)器獲取指令。 ros_lib Arduino庫(kù)使Arduino開(kāi)發(fā)板能夠與ROS通信。
建立基礎(chǔ)架構(gòu)
軟體設(shè)置
1. 在計(jì)算機(jī)(筆記本電腦/ PC)上安裝ROS。此處提供詳細(xì)步驟。注意:這可以在Linux機(jī)器上運(yùn)行的ROS 1。
2. 在計(jì)算機(jī)上安裝rosserial(發(fā)行版可以是kinetic/indigo/melodic)。
sudo apt-get install ros-《distro》-rosserial
sudo apt-get install ros-《distro》-rosserial-arduino
3. 根據(jù)此處提到的說(shuō)明在計(jì)算機(jī)上安裝Arduino IDE。
4. 在IDE中安裝ros_lib軟件包。
a. 安裝軟件包的最簡(jiǎn)單方法是使用Arduino IDE。導(dǎo)航到IDE中的Sketch 》 Include Library 》 Manage Library,然后搜索rosserial軟件包
下拉菜單搜索新的Arduino軟件包
b. Arduino IDE將所有外部庫(kù)存儲(chǔ)在?/ Arduino / libraries文件夾位置下。它將這些庫(kù)加載到開(kāi)發(fā)環(huán)境中,并且可以在IDE中看到。安裝后,可以在下拉列表中看到Rosserial Arduino庫(kù)。
外部庫(kù)顯示在列表中
C. 安裝后,應(yīng)該在IDE中看到示例草圖。
庫(kù)中的可用示例草圖
硬件設(shè)置
我們使用簡(jiǎn)單的設(shè)置將Arduino開(kāi)發(fā)板用作發(fā)布者和訂閱者。
1. 發(fā)布者:一個(gè)按鈕連接到Arduino開(kāi)發(fā)板上,并且被切換以通過(guò)ROS將數(shù)字高/低信號(hào)發(fā)送到機(jī)器。該消息顯示在機(jī)器的終端中。
2. 訂閱者:一個(gè)LED連接到Arduino開(kāi)發(fā)板上,并使用通過(guò)終端從ROS用戶那里獲得的指令來(lái)打開(kāi)/關(guān)閉LED。
硬件連接
代碼和說(shuō)明
Arduino代碼
#include 《ros.h》
#include 《std_msgs/String.h》
#include 《std_msgs/UInt16.h》
#define BUTTON 8
#define LED 13
ros::NodeHandle node_handle;
std_msgs::String button_msg;
std_msgs::UInt16 led_msg;
void subscriberCallback(const std_msgs::UInt16& led_msg) {
if (led_msg.data == 1) {
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}
ros::Publisher button_publisher(“button_press”, &button_msg);
ros::Subscriber《std_msgs::UInt16》 led_subscriber(“toggle_led”, &subscriberCallback);
void setup()
{
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);
node_handle.initNode();
node_handle.advertise(button_publisher);
node_handle.subscribe(led_subscriber);
}
void loop()
{
if (digitalRead(BUTTON) == HIGH) {
button_msg.data = “Pressed”;
} else {
button_msg.data = “NOT pressed”;
}
button_publisher.publish( &button_msg );
node_handle.spinOnce();
delay(100);
}
說(shuō)明
該代碼導(dǎo)入了ros_lib庫(kù)和std_msgs :: String和std_msgs :: UInt16的標(biāo)準(zhǔn)ROS消息。聲明了用于存儲(chǔ)ROS數(shù)據(jù)類型和Arduino板引腳的變量。
該代碼聲明了一個(gè)名為button_publisher的發(fā)布者,該發(fā)布者將std_msgs :: String數(shù)據(jù)類型的button_msg發(fā)布到button_press主題。同樣,名為led_subscriber的訂閱者訂閱了toggle_led主題,該主題獲取std_msgs :: UInt6數(shù)據(jù)類型。
聲明ROS節(jié)點(diǎn)句柄,然后在setup()方法中對(duì)其進(jìn)行初始化。節(jié)點(diǎn)句柄為發(fā)布者做廣告,并訂閱該主題。
SubscriberCallback()是在Arduino訂閱者節(jié)點(diǎn)上接收數(shù)據(jù)時(shí)調(diào)用的方法。回調(diào)方法檢查ROS主題數(shù)據(jù)是否為HIGH,并相應(yīng)地切換連接的LED。
最后,loop()方法運(yùn)行一個(gè)無(wú)限循環(huán),并從按鈕中讀取信息并將其發(fā)布到ROS。節(jié)點(diǎn)句柄調(diào)用spinOnce()來(lái)處理通信。
程序執(zhí)行
通過(guò)USB電纜將Arduino Uno開(kāi)發(fā)板連接到筆記本電腦,并確認(rèn)該板出現(xiàn)在Arduino IDE的可用串行端口列表中。編譯代碼,選擇板子類型并將其上傳到開(kāi)發(fā)板。
上載代碼后,在機(jī)器的終端上執(zhí)行以下命令。
1. 啟動(dòng)ROS Master-roscore
2. 在計(jì)算機(jī)上運(yùn)行rosserial客戶端-rosrun rosserial_python serial_node.py / dev / tty 《USB#或ACM#》
3. 在運(yùn)行時(shí)確定ttyUSB或ttyACM的串行端口。可以從Arduino IDE或使用dmesg | grep tty找到確切的端口號(hào)。
4. 讀取是否按Arduino板上的按鈕返回的已發(fā)布數(shù)據(jù)-rostopic echo button_press
5. 發(fā)布數(shù)據(jù)以切換Arduino上連接的LED-rostopic pub toggle_led std_msgs / UInt16“ data:0”數(shù)據(jù)為“ 0”關(guān)閉LED,“ 1”打開(kāi)LED。
使用多個(gè)終端選項(xiàng)卡執(zhí)行指令并在同一屏幕上觀察響應(yīng)
rosserial提供了一個(gè)非常標(biāo)準(zhǔn)的平臺(tái),允許創(chuàng)客和開(kāi)發(fā)人員在Arduino和ROS之間無(wú)縫連接。它可以使用兩種非常著名和有用的技術(shù)來(lái)探索機(jī)器人技術(shù)的新機(jī)遇。這種方法允許以非常低的成本為機(jī)器人系統(tǒng)提供分布式計(jì)算、集中控制、控制抽象以及其他一些好處。
編輯:hfy
-
機(jī)器人
+關(guān)注
關(guān)注
213文章
29748瀏覽量
212941 -
Arduino
+關(guān)注
關(guān)注
190文章
6498瀏覽量
192207
發(fā)布評(píng)論請(qǐng)先 登錄
詳細(xì)介紹機(jī)場(chǎng)智能指路機(jī)器人的工作原理
【「# ROS 2智能機(jī)器人開(kāi)發(fā)實(shí)踐」閱讀體驗(yàn)】視覺(jué)實(shí)現(xiàn)的基礎(chǔ)算法的應(yīng)用
【「# ROS 2智能機(jī)器人開(kāi)發(fā)實(shí)踐」閱讀體驗(yàn)】機(jī)器人入門的引路書
【「# ROS 2智能機(jī)器人開(kāi)發(fā)實(shí)踐」閱讀體驗(yàn)】+ROS2應(yīng)用案例
【「# ROS 2智能機(jī)器人開(kāi)發(fā)實(shí)踐」閱讀體驗(yàn)】+內(nèi)容初識(shí)
研華科技加速智能自主系統(tǒng)與機(jī)器人應(yīng)用發(fā)展
名單公布!【書籍評(píng)測(cè)活動(dòng)NO.58】ROS 2智能機(jī)器人開(kāi)發(fā)實(shí)踐
【「具身智能機(jī)器人系統(tǒng)」閱讀體驗(yàn)】2.具身智能機(jī)器人的基礎(chǔ)模塊
《具身智能機(jī)器人系統(tǒng)》第10-13章閱讀心得之具身智能機(jī)器人計(jì)算挑戰(zhàn)
【「具身智能機(jī)器人系統(tǒng)」閱讀體驗(yàn)】+兩本互為支持的書
【「具身智能機(jī)器人系統(tǒng)」閱讀體驗(yàn)】2.具身智能機(jī)器人大模型
【「具身智能機(jī)器人系統(tǒng)」閱讀體驗(yàn)】1.初步理解具身智能
【「具身智能機(jī)器人系統(tǒng)」閱讀體驗(yàn)】+初品的體驗(yàn)
《具身智能機(jī)器人系統(tǒng)》第1-6章閱讀心得之具身智能機(jī)器人系統(tǒng)背景知識(shí)與基礎(chǔ)模塊
ROSCon China 2024 | RDK第一本教材來(lái)了!地瓜機(jī)器人與古月居發(fā)布新書《ROS 2智能機(jī)器人開(kāi)發(fā)實(shí)踐》

評(píng)論