你好,我是愛(ài)吃魚(yú)香ROS的小魚(yú)。本節(jié)我們正式進(jìn)入到MicroROS的核心通信部分的學(xué)習(xí)中來(lái),本節(jié)我們將通過(guò)話(huà)題訂閱,實(shí)現(xiàn)通過(guò)話(huà)題控制LED的亮滅。
硬件開(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)買(mǎi),性?xún)r(jià)比接地氣,點(diǎn)擊左下角閱讀原文直達(dá)魚(yú)香小鋪。
一、新建工程添加依賴(lài)
新建example11_microros_topic_sub
工程
修改platformio.ini
添加依賴(lài)
; 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
二、編寫(xiě)代碼-實(shí)現(xiàn)訂閱
編輯main.cpp,代碼如下,注釋小魚(yú)已經(jīng)添加到代碼中來(lái)了
#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;
// 聲明話(huà)題訂閱者
rcl_subscription_t subscriber;
// 聲明消息文件
std_msgs__msg__Int32 sub_msg;
// 定義話(huà)題接收回調(diào)函數(shù)
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);
// 設(shè)置通過(guò)串口進(jìn)行MicroROS通信
set_microros_serial_transports(Serial);
// 延時(shí)時(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) 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");
// 創(chuàng)建執(zhí)行器
rclc_executor_init(&executor, &support.context, 1, &allocator);
// 為執(zhí)行器添加一個(gè)訂閱者
rclc_executor_add_subscription(&executor, &subscriber, &sub_msg, &callback_subscription_, ON_NEW_DATA);
// 初始化LED
pinMode(2, OUTPUT);
}
void loop()
{
delay(100);
// 循環(huán)處理數(shù)據(jù)
rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100));
}
三、代碼注解
相比之前的節(jié)點(diǎn)代碼這里主要多了這幾行
?#include
添加消息類(lèi)型頭文件
?rcl_subscription_t subscriber;
聲明話(huà)題訂閱者
?std_msgs__msg__Int32 sub_msg;
聲明消息文件,這一點(diǎn)和上位機(jī)不同,因?yàn)閮?nèi)存緊缺,所以提前定義
?void callback_subscription_(const void *msgin)
接收到數(shù)據(jù)的回調(diào)函數(shù)
?rclc_subscription_init_default
初始化話(huà)題訂閱者
?rclc_executor_add_subscription(&executor, &subscriber, &sub_msg, &callback_subscription_, ON_NEW_DATA);
,為執(zhí)行器添加一個(gè)訂閱者
四、下載測(cè)試
4.1 編譯下載
連接開(kāi)發(fā)板,編譯下載。
4.2 啟動(dòng)Agent
接著打開(kāi)終端啟動(dòng)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
點(diǎn)擊下RST按鈕,重啟開(kāi)發(fā)板,正常可以看到下圖內(nèi)容
4.3 查看是否連通
接著打開(kāi)終端查看節(jié)點(diǎn)和話(huà)題
ros2 node list
ros2 topic list
4.4 測(cè)試控制
關(guān)閉LED
ros2 topic pub /led_control std_msgs/msg/Int32 "{data: 0}" --once
打開(kāi)LED
ros2 topic pub /led_control std_msgs/msg/Int32 "{data: 1}" --once
五、總結(jié)
本節(jié)我們通過(guò)話(huà)題訂閱,實(shí)現(xiàn)對(duì)開(kāi)發(fā)板上LED的控制,下一節(jié)我們將嘗試讀取開(kāi)發(fā)板上的VM引腳電壓,并將其通過(guò)話(huà)題發(fā)布到上位機(jī)中。
-
led
+關(guān)注
關(guān)注
240文章
23063瀏覽量
657067 -
機(jī)器人
+關(guān)注
關(guān)注
210文章
28103瀏覽量
205853 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
4897瀏覽量
97060 -
學(xué)習(xí)板
+關(guān)注
關(guān)注
0文章
42瀏覽量
12149 -
ROS
+關(guān)注
關(guān)注
1文章
276瀏覽量
16942
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論