0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用micro_ros实现esp32与旭日x3派的通讯

地瓜机器人 2022-07-20 14:24 次阅读

参考: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的安装

参考我之前写的一篇记录https://zhuanlan.zhihu.com/p/540924221

特别注意:

  • 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 ​#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,对其进行简单修改。
  • 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;

  • 修改发布的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.bashcd /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

本文转自地平线开发者社区

原作者:Tianci

原链接:https://developer.horizon.ai/forumDetail/98129540173361336

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5086

    文章

    19142

    浏览量

    305987
  • AI
    AI
    +关注

    关注

    87

    文章

    31044

    浏览量

    269393
  • 人工智能
    +关注

    关注

    1792

    文章

    47380

    浏览量

    238887
收藏 人收藏

    评论

    相关推荐

    原来ESP32竟可《一“芯”两用》既做人体检测传感器也做Wi-Fi数据传输

    如何使用ESP32来做人体检测传感器,对我来说还是挺新鲜的事儿,对你来说是否有也一样呢?接下来我会重点来展开说说如何通过ESP32实现,这里我用的的是ESP32C3模组;0、前言之前
    的头像 发表于 12-18 18:12 778次阅读
    原来<b class='flag-5'>ESP32</b>竟可《一“芯”两用》既做人体检测传感器也做Wi-Fi数据传输

    ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U技术规格书

    电子发烧友网站提供《ESP32-S3-WROOM-1/ESP32-S3-WROOM-1U技术规格书.pdf》资料免费下载
    发表于 12-07 15:30 1次下载

    esp8266和esp32区别是什么

    以下是关于ESP8266和ESP32的主要区别: 处理器和架构 : ESP8266 :使用一个Tensilica L106 80MHz的处理器,属于Xtensa架构。 ESP32 :使
    的头像 发表于 08-19 18:16 5542次阅读

    esp32用什么软件编程

    ESP32是一款由乐鑫(Espressif)推出的低功耗、高性能的Wi-Fi和蓝牙双模微控制器,广泛应用于物联网、智能家居、智能穿戴等领域。要对ESP32进行编程,需要选择合适的编程软件和开发环境
    的头像 发表于 08-19 17:24 3709次阅读

    ESP32-WROOM-32E、ESP32-WROOM-32D、ESP32-WROOM-32U 有什么区别?ESP32-WROOM-32 后缀字母代表的意思是?

    ESP32-D0WD-V3,板载天线。 ESP32-WROOM-32E、ESP32-WROOM-32D、ESP32-WROOM-32U是乐鑫(Espressif Systems)推出
    的头像 发表于 07-17 10:09 1w次阅读
    <b class='flag-5'>ESP32</b>-WROOM-32E、<b class='flag-5'>ESP32</b>-WROOM-32D、<b class='flag-5'>ESP32</b>-WROOM-32U  有什么区别?<b class='flag-5'>ESP32</b>-WROOM-32 后缀字母代表的意思是?

    请问ESP32S3 USB-OTG支持什么类型多大容量的Micro SD卡?

    ESP32-S3=USB-OTG支持什么类型多大容量的Micro SD卡?
    发表于 07-01 07:09

    请问esp32c3可以做蓝牙mesh网关吗?

    esp32c3可以做蓝牙mesh网关吗?我现在用2个esp32c3做蓝牙mesh,另外一个esp32c3做网关,能互相通讯,这个是否可以实现
    发表于 06-13 07:13

    ESP32-C3的USB Serial/JTAG Controller能作为通讯串口使用吗?

    我这边使用的是ESP8685(我理解跟ESP32C3在这方面是一样的). IDF是5.0版本. 我这边期望是: 我平时调试log与烧录通过默认的硬件串口实现. 与电脑上位机的通讯通过
    发表于 06-11 07:04

    分享6个实用的ESP32-S3物联网项目:从智能设备到安全创新

    的实时安全摄像头等。 项目一、MutantW V2 - DIY ESP32-S3 智能手表 硬件和软件组件: 硬件清单 1x ESP32-
    的头像 发表于 05-17 10:15 814次阅读

    用悟空全志H3开发板做一个基于ROS系统的全向轮小车

    H3ROS系统的协同工作,我们能够远程操控小车,实时获取行驶里程数据,并在复杂的环境中灵活导航。 在接下来的视频中,我将详细展示这款全向轮小车的详细设计和性能表现,以及如何利用悟空
    发表于 05-06 11:15

    充电桩选型对比:ESP32-S3模组和ESP32-C3模组谁更合适

    随着新能源电车的普及,全国各地和海外都开始加紧安装充电桩,运城到2025年年底,实现充电桩城镇居住小区全覆盖,截至今年3月底,泉州市新增充电桩居民报装1.68万户。启明云端是国内领先的物联网通讯产品
    的头像 发表于 04-30 08:04 6572次阅读
    充电桩选型对比:<b class='flag-5'>ESP32-S3</b>模组和<b class='flag-5'>ESP32-C3</b>模组谁更合适

    ESP32-H2-MINI-1x模组 低功耗兼容Matter

    贸泽电子即日起开售Espressif Systems的ESP32-H2-MINI-1x模组。ESP32-H2-MINI-1x模组是功能强大的通用低功耗蓝牙和IEEE 802.15.4组合模组,经优化兼容Matter。
    的头像 发表于 04-17 10:22 697次阅读
    <b class='flag-5'>ESP32-H2-MINI-1x</b>模组 低功耗兼容Matter

    ESP32­S3技术参考手册

    电子发烧友网站提供《ESP32­S3技术参考手册.pdf》资料免费下载
    发表于 03-29 14:01 15次下载

    ESP32-C3在智能充电桩上的应用,性价比爆棚!

    ESP32-C3在智能充电桩上的应用,性价比爆棚!
    的头像 发表于 01-20 08:03 880次阅读
    <b class='flag-5'>ESP32-C3</b>在智能充电桩上的应用,性价比爆棚!

    ESP32-C2在小魔方遥控器的应用

    我们经常提起的ESP32-C3ESP32-S3ESP32-C2感觉话题度没有那么多,但其应用上不可小觑。今天小启就跟大家讲讲ESP32-C2在小魔方遥控器的应用。1射频性能拉满,成
    的头像 发表于 01-13 08:03 859次阅读
    <b class='flag-5'>ESP32</b>-C2在小魔方遥控器的应用