你好,我是愛(ài)吃魚(yú)香ROS的小魚(yú)。上一節(jié)我們介紹了MicroROS和Agent的安裝,本節(jié)我們開(kāi)始正式編寫(xiě)代碼,接入ROS2。
硬件開(kāi)發(fā)平臺(tái)
為方便學(xué)習(xí),本教程配套的硬件是小魚(yú)自制的MicroROS學(xué)習(xí)板,同時(shí)該板可以作為下一章節(jié)搭建實(shí)體移動(dòng)機(jī)器人的主控板以及后續(xù)制作機(jī)械臂的驅(qū)動(dòng)板使用。
板載資源圖如下:
該主控板可以在小魚(yú)的店鋪直接購(gòu)買,性價(jià)比接地氣,點(diǎn)擊左下角閱讀原文直達(dá)魚(yú)香小鋪。
一、新建工程添加依賴
1.1 新建工程
新建example10_hello_microros
工程,這里需要更改下工程的位置,默認(rèn)目錄是在文檔目錄下,小魚(yú)在測(cè)試時(shí)發(fā)現(xiàn)目錄定位上有bug,所以建議直接放到主目錄或其下目錄,小魚(yú)這里直接放到主目錄。
1.2 添加依賴
打開(kāi)platform.ini
,接著我們添加MicroROS的依賴。
[env:featheresp32]
platform = espressif32
board = featheresp32
framework = arduino
lib_deps =
https://gitee.com/ohhuo/micro_ros_platformio.git
這里使用的地址并不是MicroROS官方倉(cāng)庫(kù),而是小魚(yú)經(jīng)過(guò)修改后的國(guó)內(nèi)倉(cāng)庫(kù)地址,里面放置了小魚(yú)編譯好后可以直接使用的microros靜態(tài)庫(kù),并對(duì)倉(cāng)庫(kù)中需要梯子的地址進(jìn)行了替換。
二、編寫(xiě)代碼-第一個(gè)節(jié)點(diǎn)
開(kāi)始編寫(xiě)代碼,因?yàn)镸icro-ROS遵循RCLC-API,所以這里小魚(yú)通過(guò)一個(gè)最簡(jiǎn)單的例程介紹如何新建一個(gè)節(jié)點(diǎn)。
#include < Arduino.h >
#include < micro_ros_platformio.h >
#include < rcl/rcl.h >
#include < rclc/rclc.h >
#include < rclc/executor.h >
rclc_executor_t executor;
rclc_support_t support;
rcl_allocator_t allocator;
rcl_node_t node;
void setup()
{
Serial.begin(115200);
// 設(shè)置通過(guò)串口進(jìn)行MicroROS通信
set_microros_serial_transports(Serial);
// 延時(shí)一段時(shí)間,等待設(shè)置完成
delay(2000);
// 初始化內(nèi)存分配器
allocator = rcl_get_default_allocator();
// 創(chuàng)建初始化選項(xiàng)
rclc_support_init(&support, 0, NULL, &allocator);
// 創(chuàng)建節(jié)點(diǎn) hello_microros
rclc_node_init_default(&node, "hello_microros", "", &support);
// 創(chuàng)建執(zhí)行器
rclc_executor_init(&executor, &support.context, 1, &allocator);
}
void loop()
{
delay(100);
// 循環(huán)處理數(shù)據(jù)
rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100));
}
上面代碼并不復(fù)雜,小魚(yú)已經(jīng)將注釋寫(xiě)上,強(qiáng)烈建議你跟著代碼敲一遍,不要直接復(fù)制粘貼。
相比在上位機(jī)中開(kāi)發(fā)ROS,這里多了幾步
設(shè)置通信協(xié)議,因?yàn)榭梢酝ㄟ^(guò)多種方式連接,所以需要進(jìn)行提前設(shè)置
初始化內(nèi)存分配器,在微控制器上資源受限,內(nèi)存的管理要很細(xì)致
創(chuàng)建初始化選項(xiàng),用于初始化rcl并創(chuàng)建一些需要用到的數(shù)據(jù)結(jié)構(gòu)體
關(guān)于rclc的api小魚(yú)并沒(méi)有找到文檔,不過(guò)源碼的頭文件依然非常清晰,直接按著Ctrl點(diǎn)擊某個(gè)函數(shù)即可跳轉(zhuǎn)(不行的,重啟下Vscode)。
比如關(guān)于rclc_support_init 的源碼及參數(shù)介紹。
/**
* Initializes rcl and creates some support data structures.
* Initializes clock as RCL_STEADY_TIME.
* * < hr >
* Attribute | Adherence
* ------------------ | -------------
* Allocates Memory | Yes (in RCL)
* Thread-Safe | No
* Uses Atomics | No
* Lock-Free | Yes
*
* param[inout] support a zero-initialized rclc_support_t
* param[in] argc number of args of main
* param[in] argv array of arguments of main
* param[in] allocator allocator for allocating memory
* return `RCL_RET_OK` if RCL was initialized successfully
* return `RCL_RET_INVALID_ARGUMENT` if any null pointer as argument
* return `RCL_RET_ERROR` in case of failure
*/
RCLC_PUBLIC
rcl_ret_t
rclc_support_init(
rclc_support_t * support,
int argc,
char const * const * argv,
rcl_allocator_t * allocator);
三、運(yùn)行測(cè)試
連接開(kāi)發(fā)板,編譯下載,如果遇到端口被占用,多半是你的microros_agent沒(méi)有關(guān)閉,Ctrl+C打斷運(yùn)行再次嘗試。
接著打開(kāi)Agent
然而并沒(méi)有什么反應(yīng),重新點(diǎn)擊一次RST即可看到有數(shù)據(jù)發(fā)送和接收過(guò)來(lái)了。
接著打開(kāi)新的終端,輸入指令
ros2 node list
ros2 node info /hello_microros
可以看到,我們的第一個(gè)節(jié)點(diǎn)成功運(yùn)行起來(lái)了。
四、總結(jié)
本節(jié)我們成功的在微控制器平臺(tái)上將MicroROS節(jié)點(diǎn)運(yùn)行起來(lái)了,下一節(jié)我們開(kāi)始正式進(jìn)行ROS2通信的學(xué)習(xí)。
-
微控制器
+關(guān)注
關(guān)注
48文章
7953瀏覽量
155066 -
Micro
+關(guān)注
關(guān)注
2文章
270瀏覽量
35782 -
學(xué)習(xí)板
+關(guān)注
關(guān)注
0文章
47瀏覽量
12375 -
機(jī)械臂
+關(guān)注
關(guān)注
13文章
554瀏覽量
25396 -
ROS
+關(guān)注
關(guān)注
1文章
288瀏覽量
17746
發(fā)布評(píng)論請(qǐng)先 登錄

評(píng)論