參考:https://github.com/micro-ROS/micro_ros_arduino
https://blog.csdn.net/ZhangRelay/article/details/101394537
- micro_ros可以理解為一個運(yùn)行在嵌入式平臺的輕量級ros,其好處是建立了一套上位機(jī)平臺(主要運(yùn)行ubuntu+ros)與下位機(jī)平臺(MCU)的通訊機(jī)制,包括串口、UDP、wifi等,省去了我們編寫通訊協(xié)議的煩惱。
- 這套通訊機(jī)制最大的好處是可以將下位機(jī)平臺(MCU)當(dāng)作ros中的一個Node,實(shí)現(xiàn)topic的發(fā)布、訂閱,以及service、action等等??梢哉f是無縫兼容ros。
- 個人粗淺的理解,ros最大的方便就是提供了一個基于Node的分布式通訊機(jī)制。
本文所用安裝環(huán)境:
0. micro_ros與micro_ros_arduino的安裝
參考我之前寫的一篇記錄https://zhuanlan.zhihu.com/p/540924221
特別注意:
- 2GB內(nèi)存的旭日x3派開啟swap,否則micro_ros_agent的build過程容易內(nèi)存不足;
- 網(wǎng)絡(luò)環(huán)境務(wù)必能夠通暢無阻的訪問github,否則大概率失?。?/strong>
1. 下位機(jī)配置
1.1 arduino支持包安裝
我這里使用的下位機(jī)是M5stack Atom Lite,其核心是esp32,但我用arduino框架進(jìn)行開發(fā)。
理論上,所有支持arduino開發(fā)的嵌入式平臺應(yīng)該都可以。
注意:務(wù)必安裝自己嵌入式平臺對應(yīng)的arduino支持包。
正確安裝M5stack支持包后,在開發(fā)板管理中應(yīng)該出現(xiàn)M5 stack相關(guān)的信息。

1.2 下位機(jī)代碼
#include ?#include #include #include #include #include ?#include //changed!?rcl_publisher_t publisher;geometry_msgs__msg__Twist msg; //changed!-->modify msg type rclc_executor_t executor;rclc_support_t support;rcl_allocator_t allocator;rcl_node_t node;rcl_timer_t timer;?#define LED_PIN 27 //changed!-->Modify M5 stack Atom Lite LED pin?#define RCCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){error_loop();}}#define RCSOFTCHECK(fn) { rcl_ret_t temp_rc = fn; if((temp_rc != RCL_RET_OK)){}}?void error_loop(){ while(1){ digitalWrite(LED_PIN, !digitalRead(LED_PIN)); delay(100); }}?void timer_callback(rcl_timer_t * timer, int64_t last_call_time){ RCLC_UNUSED(last_call_time); if (timer != NULL) { RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL)); static int cnt = 0; msg.linear.x = 0.2; //const linear.x msg.angular.z = 1.0 - 0.001*cnt; //variable angular.z cnt++; }}?void setup() { set_microros_transports();? pinMode(LED_PIN, OUTPUT); digitalWrite(LED_PIN, HIGH); ? delay(2000);? allocator = rcl_get_default_allocator();? //create init_options RCCHECK(rclc_support_init(&support, 0, NULL, &allocator));? // create node RCCHECK(rclc_node_init_default(&node, "micro_ros_arduino_node", "", &support));? // create publisher RCCHECK(rclc_publisher_init_default( &publisher, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(geometry_msgs, msg, Twist), "turtle1/cmd_vel")); //changed!-->modify topic name? // create timer, const unsigned int timer_timeout = 1000; RCCHECK(rclc_timer_init_default( &timer, &support, RCL_MS_TO_NS(timer_timeout), timer_callback));? // create executor RCCHECK(rclc_executor_init(&executor, &support.context, 1, &allocator)); RCCHECK(rclc_executor_add_timer(&executor, &timer));? // changed!-->msg initialization msg.linear.x=0; msg.linear.y=0; msg.linear.z=0; msg.angular.x=0; msg.angular.y=0; msg.angular.z=0;}?void loop() { delay(100); RCSOFTCHECK(rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100)));}
1.3 代碼解析
- 代碼基于micro_ros_arduino的示例代碼micro-ros_publisher,對其進(jìn)行簡單修改。
- ros2中turtle接收的msg類型為twist,所以首先添加twist頭文件,并定義msg類型為twist
#include //changed!geometry_msgs__msg__Twist msg; //changed!-->modify msg type
- 將msg中的變量初始化為0
// changed!-->msg initialization msg.linear.x=0; msg.linear.y=0; msg.linear.z=0; msg.angular.x=0; msg.angular.y=0; msg.angular.z=0;
- 修改發(fā)布的topic的名字,修改為turtle1/cmd_vel。
- 這一topic name要與ros2中turtlesim接收的topic name一致
// create publisher RCCHECK(rclc_publisher_init_default( &publisher, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(geometry_msgs, msg, Twist), "turtle1/cmd_vel")); //changed!-->modify topic name
- 在定時器回調(diào)函數(shù)中對線速度和角速度進(jìn)行處理
- 線速度恒定,角速度變化
void timer_callback(rcl_timer_t * timer, int64_t last_call_time){ RCLC_UNUSED(last_call_time); if (timer != NULL) { RCSOFTCHECK(rcl_publish(&publisher, &msg, NULL)); static int cnt = 0; msg.linear.x = 0.2; //const linear.x msg.angular.z = 1.0 - 0.001*cnt; //variable angular.z cnt++; }}
- 修改LED燈的管腳號(非必須)
2. 上位機(jī)配置
將下位機(jī)代碼燒錄后,將下位機(jī)通過串口連接上位機(jī),這里我使用usb串口的方式連接。

為了顯示turtle的運(yùn)動,旭日x3派需要連接hdmi或者遠(yuǎn)程VNC,我使用的后者。
新建終端,source一下ros2,再source一下micro_ros。
source /opt/tros/setup.bash #或者 source /opt/ros/foxy/setup.bashcd /microros_ws/ #進(jìn)入micro_ros的工作空間source install/setup.bash #source一下,也可以將這些命令添加到 /.bashrc
- 首先提升串口讀寫權(quán)限(確保自己的串口是ttyUSB0,因硬件而異)
sudo chmod -R 777 /dev/ttyUSB0
- 開啟micro_agent
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0
- 按下下位機(jī)的復(fù)位鍵(特別注意,需要按下復(fù)位鍵)

- 重新開啟一個終端,打開turtlesim_node
ros2 run turtlesim turtlesim_node
- 此時可以看到turtle在運(yùn)動了

3. 其他
- publisher示例代碼的話題發(fā)布頻率默認(rèn)為1Hz,可以進(jìn)行調(diào)整,10Hz沒問題。但是想要100Hz往上就不行了
- 需要更高的話題發(fā)布頻率需要使用rclc_publisher_init_best_effort代替rclc_publisher_init_default
- 但是best_effort的pub也需要best_effort的sub,所以當(dāng)使用best_effort發(fā)布twist時,turtle不會運(yùn)動,因為沒有使用best_effort的sub來接收。關(guān)于這個可以參考:https://docs.ros.org/en/rolling/Concepts/About-Quality-of-Service-Settings.html#qos-compatibilities
本文轉(zhuǎn)自地平線開發(fā)者社區(qū)
原作者:Tianci
原鏈接:https://developer.horizon.ai/forumDetail/98129540173361336
-
嵌入式
+關(guān)注
關(guān)注
5152文章
19675瀏覽量
317606 -
AI
+關(guān)注
關(guān)注
88文章
35164瀏覽量
279991 -
人工智能
+關(guān)注
關(guān)注
1807文章
49028瀏覽量
249553
發(fā)布評論請先 登錄
基于ESP32C3的智能小車設(shè)計

樂鑫ESP32-C5全面進(jìn)入量產(chǎn)
ESP32運(yùn)行網(wǎng)頁服務(wù)器 (Web-Server)-入門篇

原來ESP32竟可《一“芯”兩用》既做人體檢測傳感器也做Wi-Fi數(shù)據(jù)傳輸

【AI技術(shù)支持】ESP32-S3模組EspBleOTA搜索不到ble_ota例程的藍(lán)牙問題處理

ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U技術(shù)規(guī)格書
《DNESP32S3使用指南-IDF版_V1.6》第三章 ESP32-S3基礎(chǔ)知識
基于ESP32-C3FN4為核心自主研發(fā)的Wi-Fi+BT模塊-RF-WM-ESP32B1

評論