利用ros實現單片機通訊(轉載)

我覺得如果使用這個人的micro_ros通信協議,就不用再去Ubuntu或者Windows上面自己寫驅動程序了,

利用micro_ros實現esp32與ros2的通訊

Tianci

Tianci

?

天津大學 工學博士

參考:https://github.com/micro-ROS/micro_ros_arduino

https://blog.csdn.net/ZhangRelay/article/details/101394537


  • micro_ros可以理解為一個運行在嵌入式平臺的輕量級ros,其好處是建立了一套上位機平臺(主要運行ubuntu+ros)與下位機平臺(MCU)的通訊機制,包括串口、UDP、wifi等,省去了我們編寫通訊協議的煩惱。
  • 這套通訊機制最大的好處是可以將下位機平臺(MCU)當作ros中的一個Node,實現topic的發布、訂閱,以及service、action等等。可以說是無縫兼容ros。
  • 個人粗淺的理解,ros最大的方便就是提供了一個基于Node的分布式通訊機制。

本文所用安裝環境:

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

0. micro_ros與micro_ros_arduino的安裝

參考我之前寫的一篇記錄micro_ros配置記錄 - 知乎

特別注意:

  • 2GB內存的旭日x3派開啟swap,否則micro_ros_agent的build過程容易內存不足;
  • 網絡環境務必能夠通暢無阻的訪問github,否則大概率失敗!

1. 下位機配置

1.1 arduino支持包安裝

我這里使用的下位機是M5stack Atom Lite,其核心是esp32,但我用arduino框架進行開發。

理論上,所有支持arduino開發的嵌入式平臺應該都可以。

注意:務必安裝自己嵌入式平臺對應的arduino支持包。

正確安裝M5stack支持包后,在開發板管理中應該出現M5 stack相關的信息。

image-20220716210240849

1.2 下位機代碼

#include <micro_ros_arduino.h>#include <stdio.h>
#include <rcl/rcl.h>
#include <rcl/error_handling.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>#include <geometry_msgs/msg/twist.h>  //changed!rcl_publisher_t publisher;
geometry_msgs__msg__Twist msg; //changed!-->modify msg type <twist__struct.h>
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.xmsg.angular.z = 1.0 - 0.001*cnt;               //variable angular.zcnt++;}
}void setup() {set_microros_transports();pinMode(LED_PIN, OUTPUT);digitalWrite(LED_PIN, HIGH);  delay(2000);allocator = rcl_get_default_allocator();//create init_optionsRCCHECK(rclc_support_init(&support, 0, NULL, &allocator));// create nodeRCCHECK(rclc_node_init_default(&node, "micro_ros_arduino_node", "", &support));// create publisherRCCHECK(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 executorRCCHECK(rclc_executor_init(&executor, &support.context, 1, &allocator));RCCHECK(rclc_executor_add_timer(&executor, &timer));// changed!-->msg initializationmsg.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,對其進行簡單修改。
  • ros2中turtle接收的msg類型為twist,所以首先添加twist頭文件,并定義msg類型為twist
 #include <geometry_msgs/msg/twist.h>  //changed!    geometry_msgs__msg__Twist msg; //changed!-->modify msg type <twist__struct.h>
  • 將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;
  • 修改發布的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
  • 在定時器回調函數中對線速度和角速度進行處理
  • 線速度恒定,角速度變化
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. 上位機配置

將下位機代碼燒錄后,將下位機通過串口連接上位機,這里我使用usb串口的方式連接。

微信圖片_20220717085646

為了顯示turtle的運動,旭日x3派需要連接hdmi或者遠程VNC,我使用的后者。

新建終端,source一下ros2,再source一下micro_ros。

source /opt/tros/setup.bash   #或者 source /opt/ros/foxy/setup.bash
cd /microros_ws/              #進入micro_ros的工作空間
source install/setup.bash     #source一下,也可以將這些命令添加到 /.bashrc
  • 首先提升串口讀寫權限(確保自己的串口是ttyUSB0,因硬件而異)
sudo chmod -R 777 /dev/ttyUSB0
  • 開啟micro_agent
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0
  • 按下下位機的復位鍵(特別注意,需要按下復位鍵)

image-20220717084958430

  • 重新開啟一個終端,打開turtlesim_node
ros2 run turtlesim turtlesim_node
  • 此時可以看到turtle在運動了

image-20220717085058875

3. 其他

  • publisher示例代碼的話題發布頻率默認為1Hz,可以進行調整,10Hz沒問題。但是想要100Hz往上就不行了
  • 需要更高的話題發布頻率需要使用rclc_publisher_init_best_effort代替rclc_publisher_init_default
  • 但是best_effort的pub也需要best_effort的sub,所以當使用best_effort發布twist時,turtle不會運動,因為沒有使用best_effort的sub來接收。關于這個可以參考:https://docs.ros.org/en/rolling/Concepts/About-Quality-of-Service-Settings.html#qos-compatibilities

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/160217.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/160217.shtml
英文地址,請注明出處:http://en.pswp.cn/news/160217.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

B站app作品列表sign

之前寫過一篇pc的:B站pc端w_rid逆向 最近pc端老是作妖,更新的太頻繁了, 于是決定干一下app, pc端有個w_rid加密,app端也有個類似的sign 人狠話不多,直接上成果吧: # -*- coding: UTF-8 -*- import hashlib import time import requests import json from urllib.parse…

C語言好好題(一維數組)

兩天沒有更新了&#xff0c;貼紙們&#xff0c;有沒有想我呀。&#x1f604;&#x1f604;&#x1f604; 好了&#xff0c;就寒暄到這里吧&#xff0c;下面請看題&#xff1a; 有序序列判斷 輸入一個整數序列&#xff0c;判斷是否是有序序列&#xff0c;有序&#xff0c;指序列…

騰訊云輕量4核8G12M帶寬服務器租用價格和S5實例報價

騰訊云4核8G服務器優惠價格表&#xff0c;云服務器CVM標準型S5實例4核8G配置價格15個月1437.3元&#xff0c;5年6490.44元&#xff0c;輕量應用服務器4核8G12M帶寬一年446元、529元15個月&#xff0c;阿騰云atengyun.com分享騰訊云4核8G服務器詳細配置、優惠價格及限制條件&…

C++(模板進階)

目錄 前言&#xff1a; 本章學習目標&#xff1a; 1.非類型模版參數 1.1使用方法 1.2注意事項 1.3 實際引用 2.模版特化 2.1概念 2.2函數模板特化 2.3類模板特化 2.3.1全特化 2.3.2偏特化 3.模版分離編譯 ?編輯 3.1失敗原因 ?編輯 3.2解決方案 4 總結 前言&…

【C++】類和對象——構造函數和析構函數

今天要學習兩個特殊的函數&#xff0c;分別是構造函數和析構函數&#xff0c;它們究竟有什么用呢&#xff1f; 比如說&#xff0c;我們先寫一個簡單的日期的類 class Date { public:void Init() {_year 1;_month 1;_day 1;}void Print() {cout << _year << &qu…

Sentinel 分布式系統

Sentinel 是一種分布式系統的流量防衛兵和熔斷器&#xff0c;由阿里巴巴開發并開源。它的主要目標是保護分布式系統中的穩定性和可用性&#xff0c;防止因高并發或異常流量而導致的系統崩潰。下面是 Sentinel 的原理和使用教程的概要&#xff1a; Sentinel 的原理&#xff1a;…

如何去開發一個springboot starter

如何去開發一個springboot starter 我們在平時用 Java 開發的時候&#xff0c;在 pom.xml 文件中引入一個依賴就可以很方便的使用了&#xff0c;但是你們知道這是如何實現的嗎。 現在我們就來解決這一個問題&#xff01; 創建 SpringBoot 項目 首先我們要做的就是把你想要給別…

css3

基礎 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>style</title><!-- link&#xff08;外部樣式&#xff09;和style&#xff08;內部樣式&#xff09;優先級相同&#xff0c;重復寫會覆蓋 --><link re…

面試題-9

1.如何封裝一個組件 1.使用Vue.extend()創建一個組件 2.使用Vue.components()方法注冊組件 3.如果子組件需要數據,可以在props中接收定義 4.子組件修改好數據,要把數據傳遞給父組件&#xff0c;可以用emit()方法 原則: 把功能拆開 盡量讓組件原子化,一個組件做一件事情 …

centos7安裝MySQL—以MySQL5.7.30為例

centos7安裝MySQL—以MySQL5.7.30為例 本文以MySQL5.7.30為例。 官網下載 進入MySQL官網&#xff1a;https://www.mysql.com/ 點擊DOWNLOADS 點擊鏈接&#xff1b; 點擊如上鏈接&#xff1a; 選擇對應版本&#xff1a; 點擊下載。 安裝 將下載后的安裝包上傳到/usr/local下…

CTF靶場搭建及Web賽題制作與終端docker環境部署

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 寫在前面 ╔═══════════════════════════════════════════════════…

使用ChatGPT創建Makefile構建系統:使用Make運行Docker

使用ChatGPT創建Makefile構建系統&#xff1a;使用Make運行Docker 芯語芯愿&#xff08;知乎/紛傳/CSDN/&#xff09;&#xff1b;小石頭的芯語芯愿&#xff08;微信公眾號&#xff09; 開發高效現代的構建系統對于滿足開發周期需求至關重要。原先&#xff0c;嵌入式開發者一…

Unity 場景烘培 ——LensFlare鏡頭光暈(三)

提示&#xff1a;文章有錯誤的地方&#xff0c;還望諸位大神指出&#xff01; 文章目錄 前言一、鏡頭光暈 (Lens Flares)是什么&#xff1f;二、使用Lens Flares組件總結 前言 一般情況下都會忽略的東西&#xff0c;鏡頭光暈。理論上不加鏡頭光暈&#xff0c;也不會有什么影響…

vue3的兩個提示[Vue warn]: 關于組件渲染和函數外部使用

1. [Vue warn]: inject() can only be used inside setup() or functional components. 這個消息是提示我們&#xff0c;需要將引入的方法作為一個變量使用。以vue-store為例&#xff0c;如果我們按照如下的方式使用&#xff1a; import UseUserStore from ../../store/module…

數據治理之考評環節

考評的流程&#xff08;批處理&#xff09; 周期調度&#xff0c;每天一次&#xff1a;采集hive, hdfs元數據存放到mysql中的dga庫的metainfo表手動通過管理頁面補充輔助信息指標考評 讀取要考評的表的元數據及輔助信息讀取要考評的指標對每張表的每個指標逐個進行考評保存考評…

RabbitMQ快速入門(簡單收發消息)

文章目錄 前言一、數據隔離1.用戶管理2.virtual host 二、控制臺收發1.交換機2.隊列3.綁定 三、編程式收發1.依賴和配置2.收發信息 總結 前言 1.了解數據隔離 2.RabbitMQ控制臺收發信息 3.SpringBoot整合RabbitMQ收發信息 一、數據隔離 1.用戶管理 點擊Admin選項卡&#xff0…

mmdet全教程

官方給的文檔一言難盡&#xff0c;網上的教程又沒有從大綱到源碼的完整解讀&#xff0c;計劃年后開個系列記錄一下

依賴庫:Ceres-solver-2.0.0安裝

依賴庫&#xff1a;Ceres-solver-2.0.0安裝 前言安裝ceres-solver-2.0.0驗證 前言 Ceres Solver是谷歌開源的C非線性優化庫&#xff0c;能夠解決有約束或無約束條件下的非線性最小二乘問題。2010年之后大量的運用在谷歌的產品開發中&#xff0c;尤其在谷歌開源的cartographer中…