你好,我是愛吃魚香ROS的小魚。上一節我們介紹了MicroROS和Agent的安裝,本節我們開始正式編寫代碼,接入ROS2。
硬件開發平臺
為方便學習,本教程配套的硬件是小魚自制的MicroROS學習板,同時該板可以作為下一章節搭建實體移動機器人的主控板以及后續制作機械臂的驅動板使用。
板載資源圖如下:
該主控板可以在小魚的店鋪直接購買,性價比接地氣,點擊左下角閱讀原文直達魚香小鋪。
一、新建工程添加依賴
1.1 新建工程
新建example10_hello_microros
工程,這里需要更改下工程的位置,默認目錄是在文檔目錄下,小魚在測試時發現目錄定位上有bug,所以建議直接放到主目錄或其下目錄,小魚這里直接放到主目錄。
1.2 添加依賴
打開platform.ini
,接著我們添加MicroROS的依賴。
[env:featheresp32]
platform = espressif32
board = featheresp32
framework = arduino
lib_deps =
https://gitee.com/ohhuo/micro_ros_platformio.git
這里使用的地址并不是MicroROS官方倉庫,而是小魚經過修改后的國內倉庫地址,里面放置了小魚編譯好后可以直接使用的microros靜態庫,并對倉庫中需要梯子的地址進行了替換。
二、編寫代碼-第一個節點
開始編寫代碼,因為Micro-ROS遵循RCLC-API,所以這里小魚通過一個最簡單的例程介紹如何新建一個節點。
#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);
// 設置通過串口進行MicroROS通信
set_microros_serial_transports(Serial);
// 延時一段時間,等待設置完成
delay(2000);
// 初始化內存分配器
allocator = rcl_get_default_allocator();
// 創建初始化選項
rclc_support_init(&support, 0, NULL, &allocator);
// 創建節點 hello_microros
rclc_node_init_default(&node, "hello_microros", "", &support);
// 創建執行器
rclc_executor_init(&executor, &support.context, 1, &allocator);
}
void loop()
{
delay(100);
// 循環處理數據
rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100));
}
上面代碼并不復雜,小魚已經將注釋寫上,強烈建議你跟著代碼敲一遍,不要直接復制粘貼。
相比在上位機中開發ROS,這里多了幾步
設置通信協議,因為可以通過多種方式連接,所以需要進行提前設置
初始化內存分配器,在微控制器上資源受限,內存的管理要很細致
創建初始化選項,用于初始化rcl并創建一些需要用到的數據結構體
關于rclc的api小魚并沒有找到文檔,不過源碼的頭文件依然非常清晰,直接按著Ctrl點擊某個函數即可跳轉(不行的,重啟下Vscode)。
比如關于rclc_support_init 的源碼及參數介紹。
/**
* 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);
三、運行測試
連接開發板,編譯下載,如果遇到端口被占用,多半是你的microros_agent沒有關閉,Ctrl+C打斷運行再次嘗試。
接著打開Agent
然而并沒有什么反應,重新點擊一次RST即可看到有數據發送和接收過來了。
接著打開新的終端,輸入指令
ros2 node list
ros2 node info /hello_microros
可以看到,我們的第一個節點成功運行起來了。
四、總結
本節我們成功的在微控制器平臺上將MicroROS節點運行起來了,下一節我們開始正式進行ROS2通信的學習。
-
微控制器
+關注
關注
48文章
7552瀏覽量
151423 -
Micro
+關注
關注
2文章
262瀏覽量
34843 -
學習板
+關注
關注
0文章
44瀏覽量
12167 -
機械臂
+關注
關注
12文章
515瀏覽量
24587 -
ROS
+關注
關注
1文章
278瀏覽量
17009
發布評論請先 登錄
相關推薦
評論