你好,我是愛吃魚香ROS的小魚。本節我們正式進入到MicroROS的核心通信部分的學習中來,本節我們將通過話題訂閱,實現通過話題控制LED的亮滅。
硬件開發平臺
為方便學習,本教程配套的硬件是小魚自制的MicroROS學習板,同時該板可以作為下一章節搭建實體移動機器人的主控板以及后續制作機械臂的驅動板使用。
板載資源圖如下:
該主控板可以在小魚的店鋪直接購買,性價比接地氣,點擊左下角閱讀原文直達魚香小鋪。
一、新建工程添加依賴
新建example11_microros_topic_sub
工程
修改platformio.ini
添加依賴
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:featheresp32]
platform = espressif32
board = featheresp32
framework = arduino
lib_deps =
https://gitee.com/ohhuo/micro_ros_platformio.git
二、編寫代碼-實現訂閱
編輯main.cpp,代碼如下,注釋小魚已經添加到代碼中來了
#include < Arduino.h >
#include < micro_ros_platformio.h >
#include < rcl/rcl.h >
#include < rclc/rclc.h >
#include < rclc/executor.h >
#include < std_msgs/msg/int32.h >
rclc_executor_t executor;
rclc_support_t support;
rcl_allocator_t allocator;
rcl_node_t node;
// 聲明話題訂閱者
rcl_subscription_t subscriber;
// 聲明消息文件
std_msgs__msg__Int32 sub_msg;
// 定義話題接收回調函數
void callback_subscription_(const void *msgin)
{
const std_msgs__msg__Int32 *msg = (const std_msgs__msg__Int32 *)msgin;
if (msg- >data == 0)
{
digitalWrite(2, HIGH);
}
else
{
digitalWrite(2, LOW);
}
}
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);
// 創建節點 topic_sub_test
rclc_node_init_default(&node, "topic_sub_test", "", &support);
// 訂閱者初始化
rclc_subscription_init_default(
&subscriber,
&node,
ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32),
"led_control");
// 創建執行器
rclc_executor_init(&executor, &support.context, 1, &allocator);
// 為執行器添加一個訂閱者
rclc_executor_add_subscription(&executor, &subscriber, &sub_msg, &callback_subscription_, ON_NEW_DATA);
// 初始化LED
pinMode(2, OUTPUT);
}
void loop()
{
delay(100);
// 循環處理數據
rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100));
}
三、代碼注解
相比之前的節點代碼這里主要多了這幾行
?#include
添加消息類型頭文件
?rcl_subscription_t subscriber;
聲明話題訂閱者
?std_msgs__msg__Int32 sub_msg;
聲明消息文件,這一點和上位機不同,因為內存緊缺,所以提前定義
?void callback_subscription_(const void *msgin)
接收到數據的回調函數
?rclc_subscription_init_default
初始化話題訂閱者
?rclc_executor_add_subscription(&executor, &subscriber, &sub_msg, &callback_subscription_, ON_NEW_DATA);
,為執行器添加一個訂閱者
四、下載測試
4.1 編譯下載
連接開發板,編譯下載。
4.2 啟動Agent
接著打開終端啟動agent
sudo docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO serial --dev /dev/ttyUSB0 -v
點擊下RST按鈕,重啟開發板,正常可以看到下圖內容
4.3 查看是否連通
接著打開終端查看節點和話題
ros2 node list
ros2 topic list
4.4 測試控制
關閉LED
ros2 topic pub /led_control std_msgs/msg/Int32 "{data: 0}" --once
打開LED
ros2 topic pub /led_control std_msgs/msg/Int32 "{data: 1}" --once
五、總結
本節我們通過話題訂閱,實現對開發板上LED的控制,下一節我們將嘗試讀取開發板上的VM引腳電壓,并將其通過話題發布到上位機中。
-
led
+關注
關注
242文章
23362瀏覽量
663227 -
機器人
+關注
關注
211文章
28646瀏覽量
208429 -
開發板
+關注
關注
25文章
5121瀏覽量
98210 -
學習板
+關注
關注
0文章
45瀏覽量
12196 -
ROS
+關注
關注
1文章
280瀏覽量
17100
發布評論請先 登錄
相關推薦
基于OpenHarmony開發板上測試Native C++應用開發
【FireBeetle 2 ESP32-S3開發板體驗】串口控制LED
代碼控制開發板LED:STM32跑馬燈試驗
分析ARM開發板哪家好
HC6800-ES V2.0開發板的介紹及使用資料說明
![HC6800-ES V2.0<b class='flag-5'>開發板</b>的介紹及使用資料說明](https://file.elecfans.com/web1/M00/8C/C9/pIYBAFyZyj2AAtX0AAf0FZznYUs493.png)
如何使用代碼控制開發板
【時擎科技AT1000開發板試用體驗】時擎科技AT1000 DEV開發板 – 燒錄工具
![【時擎科技AT1000<b class='flag-5'>開發板</b>試用體驗】時擎科技AT1000 DEV<b class='flag-5'>開發板</b> – 燒錄工具](https://file.elecfans.com/web2/M00/53/32/poYBAGLQDhmAR6hHAAIOfatIEJM368.jpg)
S3C2440開發板上實現按鍵點亮LED驅動開發的詳細過程
![S3C2440<b class='flag-5'>開發板</b><b class='flag-5'>上</b><b class='flag-5'>實現</b>按鍵點亮<b class='flag-5'>LED</b>驅動<b class='flag-5'>開發</b>的詳細過程](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論