利用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.rhkb.cn/news/201289.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

04 后端增删改查【小白入门SpringBoot + Vue3】

项目笔记&#xff0c;教学视频来源于B站青戈 https://www.bilibili.com/video/BV1H14y1S7YV 保证前面的都功能都实现后&#xff0c;接着往下走。 查 分页 接下来&#xff0c;实现前端页面分页功能。 前端分页组件 打开elementplus官网&#xff0c;找到合适的分页组件&…

软件测试工具常用的都有哪些

软件测试工具是用于辅助软件测试的软件工具&#xff0c;可以帮助测试人员执行测试用例、记录测试结果、跟踪缺陷状态等&#xff0c;提高测试效率和质量。以下是一些常见的软件测试工具&#xff1a; 一、AutoRunner自动化测试工具 AutoRunner(简称AR&#xff09;是国内自主研发…

python使用selenium webDriver时 报错

可能原因和解决&#xff1a; 1. python 解释器 ----> 设置 2. 浏览器版本 与 浏览器驱动版本不一致 ----> 安装同一版本的 (下载chromedriver | 谷歌驱动更高版本的测试版) 参考&#xff1a;Python使用Selenium WebDriver的入门介绍及安装教程-CSDN博客 Selenium安…

企业网盘哪家好?值得信赖的品牌推荐

企业网盘可谓是当下热门的企业服务之一&#xff0c;市面上也出现了非常多企业网盘工具。那么&#xff0c;企业网盘哪家好&#xff1f;哪个品牌更值得信赖呢&#xff1f; 企业网盘哪家好&#xff1f; Zoho Workdrive企业网盘一定榜上有名&#xff0c;Zoho Workdrive企业网盘是著…

IDEA JRebel安装使用教程

1、下载插件 版本列表&#xff1a;https://plugins.jetbrains.com/plugin/4441-jrebel-and-xrebel/versions 下载&#xff1a;JRebel and XRebel 2022.4.1 这里下载2022.4.1版本&#xff0c;因为后续新版本获取凭证会比较麻烦。下载完成会是一个压缩包。 2、安装 选择第一步…

微软Copilot即将对大陆开放,一起来看看都有什么好用的功能

微软发布了Copilot&#xff0c;12月1日起对大陆用户开放&#xff0c;以下是Copilot的11个新功能&#xff0c;你一定不想错过&#xff1a;1. PowerPoint&#xff1a; 将Word文档转换为演示文稿。从文件中快速创建演示文稿。通过关键幻灯片总结冗长的演示文稿。使用提示添加新的…

2024贵州大学计算机考研分析

24计算机考研|上岸指南 贵州大学 贵州大学计算机科学与技术学院&#xff08;贵州大学省级示范性软件学院&#xff09;位于贵州省贵阳市花溪区贵州大学东校区。 计算机科学与技术学院&#xff08;软件学院&#xff09;自1972年创办计算机软件本科专业开始&#xff0c;至今已有…

cadence layout lvs时出现error

Error&#xff1a;Schematic export failed or was cancelled.Please consult the transcript in the viewer window. 解决办法同下&#xff1a; cadence layout lvs时出现error-CSDN博客

Unity 头顶图文字性能优化

如图&#xff1a;常规的排版&#xff0c;会有很多Batches。这是优化后的Batches只有3。 常用解决方案&#xff1a; 1、创建两个Canvas&#xff0c;一个放所有文本Text&#xff0c;一个放所有Image。但这里有会有两个问题&#xff1a;一旦文字夹在两个Image中间&#xff0c;还有…

掌握Katalon Studio 导入 swagger 接口文档,接口测试效率提升100%

katalon studio大家都已经不陌生了&#xff0c;是一款现在非常主流的自动化测试工具&#xff0c;包括了web、api、APP&#xff0c;甚至PC应用程序都可以使用它来完成自动化测试。 swagger是一款RESTFUL接口的文档在线自动生成软件&#xff0c;swagger是一个规范和完整的框架&a…

智能座舱架构与芯片 - (2) 架构篇

一、定义 1.1 智能座舱定义 按照百度百科的定义&#xff0c;智能座舱&#xff08;intelligent cabin&#xff09;旨在集成多种IT和人工智能技术&#xff0c;打造全新的车内一体化数字平台&#xff0c;为驾驶员提供智能体验&#xff0c;促进行车安全。目前国内外已经有很多研究…

算法刷题-动态规划-1

算法刷题-动态规划-1 不同路径不同路径||方法一&#xff1a;方法二 第N个泰波那契数递归写法滚动数组 三步问题递归操作滚动数组 使用最小画法爬楼梯递归 解码方法方法一方法二&#xff1a;&#xff08;大佬讲解&#xff09; 不同路径 //机器人不同的路径进入到指定的地点 publ…

SpringBoot : ch06 整合 web (一)

前言 SpringBoot作为一款优秀的框架&#xff0c;不仅提供了快速开发的能力&#xff0c;同时也提供了丰富的文档和示例&#xff0c;让开发者更加容易上手。在本博客中&#xff0c;我们将介绍如何使用SpringBoot来整合Web应用程序的相关技术&#xff0c;并通过实例代码来演示如何…

“图纸保密大作战:上海迅软DSE解决方案守护机械公司核心资料

机械行业是我国重要的工业制造行业之一&#xff0c;相关企业在发展中往往需要用到ERP、PDM、PLM等系统来对产品信息进行管理&#xff0c;其中便涉及到大量文档和图纸等重要数据。然而随着业务的快速发展和数字化转型&#xff0c;机械行业也面临着如数据泄露、外来袭击攻击、内部…

华为obs上传下载-Java版 2023-11-23

弄了半天&#xff0c;老师帮弄成功了&#xff0c;经过同意&#xff0c;分享到网上&#xff0c;希望能帮助更多人&#xff0c;至于怎么弄的&#xff0c;我也不知道。 创建idea项目后&#xff0c;项目结构&#xff0c;对应文件没有的创一个 pom.xm 注意改Java版本&#xff0c;我…

AIGC前沿技术与数字创新应用合作交流和论坛发布活动圆满落幕

2023年11月17日下午&#xff0c;AIGC前沿技术与数字创新应用合作交流和论坛发布活动在北京市海淀区牡丹科技楼B座B1报告厅成功举办。 在这个以技术为驱动力的时代&#xff0c;AIGC等这些前沿技术正以惊人的速度改变着我们的生活和产业格局。利用新兴技术和数字化工具来解决问题…

vite vue3配置eslint和prettier以及sass

准备 教程 安装eslint 官网 vue-eslint ts-eslint 安装eslint yarn add eslint -D生成配置文件 npx eslint --init安装其他插件 yarn add -D eslint-plugin-import eslint-plugin-vue eslint-plugin-node eslint-plugin-prettier eslint-config-prettier eslint-plugin…

【性能测试】稳定性/并发压力测试的TPS计算+5W并发场景设计...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、稳定性测试TPS…

【MySQL】索引与事务

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《MySQL》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&a…

局域网内Ubuntu上搭建Git服务器

1.在局域网内选定一台Ubuntu电脑作为Git服务端&#xff1a; (1).新建用户如为fbc&#xff0c;执行如下命令&#xff1a;需设置密码&#xff0c;此为fbc sudo adduser fbc (2).切换到fbc用户&#xff1a;需密码&#xff0c;此前设置为fbc su fbc (3).建一个空目录作为仓…