一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

利用micro_ros實(shí)現(xiàn)esp32與旭日x3派的通訊

地瓜機(jī)器人 ? 2022-07-20 14:24 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

參考: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)境:

  • 上位機(jī):旭日x3派 (ros2 foxy+ubuntu 20.04)
  • 下位機(jī):M5stack Atom Lite(esp32 core)

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)的信息。

image-20220716210240849

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串口的方式連接。

微信圖片_20220717085646

為了顯示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ù)位鍵)
image-20220717084958430

  • 重新開啟一個終端,打開turtlesim_node

ros2 run turtlesim turtlesim_node

  • 此時可以看到turtle在運(yùn)動了
image-20220717085058875

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

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19675

    瀏覽量

    317606
  • AI
    AI
    +關(guān)注

    關(guān)注

    88

    文章

    35164

    瀏覽量

    279991
  • 人工智能
    +關(guān)注

    關(guān)注

    1807

    文章

    49028

    瀏覽量

    249553
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于ESP32C3的智能小車設(shè)計

    你有沒有想過,從零開始親手制作一輛堅固耐用的遙控越野車?今天,小編就帶你走進(jìn)一個融合機(jī)械、電子與物聯(lián)網(wǎng)的精彩DIY項目——一款由 Seeed Studio XIAO ESP32C3 強(qiáng)力驅(qū)動的 3D打印4x4 RC漫游車!
    的頭像 發(fā)表于 06-04 11:11 ?848次閱讀
    基于<b class='flag-5'>ESP32C3</b>的智能小車設(shè)計

    ESP32-CAM帶OV2640攝像頭視頻顯示

    本文介紹了如何在Arduino IDE上開發(fā)實(shí)現(xiàn)ESP32-CAM模塊獲取實(shí)時圖像視頻
    的頭像 發(fā)表于 05-23 10:47 ?552次閱讀
    <b class='flag-5'>ESP32</b>-CAM帶OV2640攝像頭視頻顯示

    樂鑫ESP32-C5全面進(jìn)入量產(chǎn)

    樂鑫信息科技 (688018.SH) 宣布,ESP32-C5 現(xiàn)已全面進(jìn)入量產(chǎn)。
    的頭像 發(fā)表于 05-06 16:50 ?601次閱讀

    ESP32運(yùn)行網(wǎng)頁服務(wù)器 (Web-Server)-入門篇

    什么是ESP32WebServer?ESP32WebServer是在ESP32微控制器上運(yùn)行的一個嵌入式網(wǎng)頁服務(wù)器。它能夠處理HTTP請求并作出響應(yīng),使用戶可以通過網(wǎng)絡(luò)瀏覽器與設(shè)備進(jìn)行通訊
    的頭像 發(fā)表于 03-09 14:24 ?4311次閱讀
    <b class='flag-5'>ESP32</b>運(yùn)行網(wǎng)頁服務(wù)器 (Web-Server)-入門篇

    esp32如何接入豆包

    要在 ESP32 上接入豆包工具,本質(zhì)上是讓 ESP32 設(shè)備與豆包的 API 進(jìn)行通信,以獲取相關(guān)服務(wù)
    的頭像 發(fā)表于 02-05 13:40 ?1974次閱讀
    <b class='flag-5'>esp32</b>如何接入豆包

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

    如何使用ESP32來做人體檢測傳感器,對我來說還是挺新鮮的事兒,對你來說是否有也一樣呢?接下來我會重點(diǎn)來展開說說如何通過ESP32實(shí)現(xiàn),這里我用的的是ESP32C3模組;0、前言之前
    的頭像 發(fā)表于 12-18 18:12 ?3945次閱讀
    原來<b class='flag-5'>ESP32</b>竟可《一“芯”兩用》既做人體檢測傳感器也做Wi-Fi數(shù)據(jù)傳輸

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

    啟明云端/01問題描述在智能標(biāo)識牌上使用ESP32-S3-WROOM-1U模組,ESP-IDF版本為idf5.0.2時,客戶在ESP32-S3模組燒錄運(yùn)行
    的頭像 發(fā)表于 12-13 18:06 ?1576次閱讀
    【AI技術(shù)支持】<b class='flag-5'>ESP32-S3</b>模組EspBleOTA搜索不到ble_ota例程的藍(lán)牙問題處理

    ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U技術(shù)規(guī)格書

    電子發(fā)燒友網(wǎng)站提供《ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U技術(shù)規(guī)格書.pdf》資料免費(fèi)下載
    發(fā)表于 12-07 15:30 ?11次下載

    《DNESP32S3使用指南-IDF版_V1.6》第三章 ESP32-S3基礎(chǔ)知識

    ,如下圖所示。圖3.4.1 ESP32-S3系列芯片命名規(guī)則從上圖可以看到,F(xiàn)表示內(nèi)置FLASH;H/N表示FLASH溫度(H:高溫,N:常溫);x表示內(nèi)置FLASH大?。∕B);R表示內(nèi)置PSRAM
    發(fā)表于 11-22 09:43

    【AI技術(shù)支持】ESP32-C3-Lyra播放音頻無法控制音量及異聲問題處理

    【AI技術(shù)支持】ESP32-C3-Lyra播放音頻無法控制音量及異聲問題處理
    的頭像 發(fā)表于 11-22 01:01 ?1615次閱讀
    【AI技術(shù)支持】<b class='flag-5'>ESP32-C3</b>-Lyra播放音頻無法控制音量及異聲問題處理

    基于ESP32-C3FN4為核心自主研發(fā)的Wi-Fi+BT模塊-RF-WM-ESP32B1

    WI-FI模組 - RF-WM-ESP32B1是基于ESP32-C3FN4為核心自主研發(fā)的Wi-Fi+BT模塊,支持IEEE 802.11b/g/n (2.4 GHz Wi-Fi)和低功耗藍(lán)牙5.0,可廣泛用于各種消費(fèi)類電子、手機(jī)外設(shè)產(chǎn)品等。
    的頭像 發(fā)表于 11-07 09:45 ?661次閱讀
    基于<b class='flag-5'>ESP32-C3</b>FN4為核心自主研發(fā)的Wi-Fi+BT模塊-RF-WM-<b class='flag-5'>ESP32</b>B1

    esp32上使用chatGPT做一些有意思的事情

    ChatGPT獲得響應(yīng),我們需要進(jìn)行以下步驟:1、在OpenAI網(wǎng)站上注冊,并在ESP32上安裝必要的庫。 2、在OpenAI API上創(chuàng)建一個新項目并生成一個API密鑰。 3、使用API密鑰來驗證
    的頭像 發(fā)表于 10-18 10:04 ?1069次閱讀

    esp32esp8266代碼共用嗎

    本文將介紹ESP32ESP8266兩款流行的微控制器在代碼共用性方面的可能性與差異性。 一、引言 隨著物聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,越來越多的智能設(shè)備開始進(jìn)入我們的生活。其中,ESP32ESP
    的頭像 發(fā)表于 08-19 18:23 ?2344次閱讀

    esp8266和esp32區(qū)別是什么

    以下是關(guān)于ESP8266和ESP32的主要區(qū)別: 處理器和架構(gòu) : ESP8266 :使用一個Tensilica L106 80MHz的處理器,屬于Xtensa架構(gòu)。 ESP32 :使
    的頭像 發(fā)表于 08-19 18:16 ?7347次閱讀

    esp32用什么軟件編程

    ESP32是一款由樂鑫(Espressif)推出的低功耗、高性能的Wi-Fi和藍(lán)牙雙模微控制器,廣泛應(yīng)用于物聯(lián)網(wǎng)、智能家居、智能穿戴等領(lǐng)域。要對ESP32進(jìn)行編程,需要選擇合適的編程軟件和開發(fā)環(huán)境
    的頭像 發(fā)表于 08-19 17:24 ?6997次閱讀