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

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

    关注

    5186

    文章

    20156

    浏览量

    328977
  • AI
    AI
    +关注

    关注

    89

    文章

    38162

    浏览量

    296846
  • 人工智能
    +关注

    关注

    1813

    文章

    49750

    浏览量

    261619
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    VSCode + ESP-IDF环境下给ESP32-S3项目添加头文件

    VSCode + ESP-IDF环境下给ESP32-S3项目添加头文件
    的头像 发表于 11-28 07:27 754次阅读

    #ESP32S3野牛小智

    ESP32
    丙丁先生
    发布于 :2025年11月25日 08:34:06

    乐鑫科技ESP32-S3开发板配单色LED,竟能玩出这么多花样!代码开源,速来白嫖!

    从闪烁到呼吸,从流水到追逐,一文掌握所有LED特效技巧本文将带领大家从零开始,使用ESP32-S3开发板实现多种单色LED效果控制。无论你是刚入门的小白,还是有一定经验的开发者,都能轻松复刻这些炫酷
    的头像 发表于 10-23 18:02 1698次阅读
    乐鑫科技<b class='flag-5'>ESP32-S3</b>开发板配单色LED,竟能玩出这么多花样!代码开源,速来白嫖!

    如何使用menuconfig添加配置micro-ros软件包?

    请问有没有最新的rtthread移植micro-ros移植使用教程,使用menuconfig添加配置micro-ros软件包?
    发表于 09-25 06:37

    ESP32ESP-NOW通讯踩坑记

    1、背景前段时间看到乐鑫推出了一种很有意思的Wi-Fi通讯协议,它允许设备在无连接的时候进行直接通讯。乐鑫对它的概述如下:“ESP-NOW是一种由乐鑫公司定义的无连接Wi-Fi通信协议。在ES
    的头像 发表于 09-13 10:03 1798次阅读
    <b class='flag-5'>ESP32</b>的<b class='flag-5'>ESP</b>-NOW<b class='flag-5'>通讯</b>踩坑记

    ESP32-S3的MicroPython开发环境搭建

    本文通过搭建Thonny IDE开发环境,了解了如何给ESP32-S3烧录MircoPython固件和MircoPython应用程序。
    的头像 发表于 09-11 16:02 947次阅读
    <b class='flag-5'>ESP32-S3</b>的MicroPython开发环境搭建

    乐鑫ESP32-S3专为AIoT设计,强化边缘AI应用方向

    的向量指令(vectorinstructions)。AI开发者们通过使用这些向量指令,可以实现高性能的图像识别、语音唤醒和识别等应用。   ESP32-S3是一款低功耗的MCU系统级芯片(SoC),支持
    的头像 发表于 09-09 09:20 6947次阅读
    乐鑫<b class='flag-5'>ESP32-S3</b>专为AIoT设计,强化边缘AI应用方向

    奇瑞风云X3系列双车上市

    8月16日,奇瑞汽车旗下风云品牌全新方盒子产品序列——风云X3与风云X3 PLUS正式宣告上市。风云X3系列基于iCAR 03系列焕新升级而来,在造型设计、动力性能、智能科技、功能配置及工艺品质等维度
    的头像 发表于 08-19 11:48 843次阅读

    ESP32-运行网页服务器(Web Server)-实用篇

    在前一篇文章《ESP32-运行网页服务器(WebServer)-入门篇》,我们介绍了ESP32运行网页服务器(WebServer)的原理,然后我们基于ESP32实现了一个demo代码;
    的头像 发表于 07-28 18:05 2848次阅读
    <b class='flag-5'>ESP32</b>-运行网页服务器(Web Server)-实用篇

    ESP32开发板元件资料

    ESP32开发板元件
    发表于 07-21 14:47 14次下载

    基于ESP32C3的智能小车设计

    你有没有想过,从零开始亲手制作一辆坚固耐用的遥控越野车?今天,小编就带你走进一个融合机械、电子与物联网的精彩DIY项目——一款由 Seeed Studio XIAO ESP32C3 强力驱动的 3D打印4x4 RC漫游车!
    的头像 发表于 06-04 11:11 1749次阅读
    基于<b class='flag-5'>ESP32C3</b>的智能小车设计

    ESP32运行网页服务器 (Web-Server)-入门篇

    什么是ESP32WebServer?ESP32WebServer是在ESP32微控制器上运行的一个嵌入式网页服务器。它能够处理HTTP请求并作出响应,使用户可以通过网络浏览器与设备进行通讯
    的头像 发表于 03-09 14:24 6512次阅读
    <b class='flag-5'>ESP32</b>运行网页服务器 (Web-Server)-入门篇

    esp32如何接入豆包

    要在 ESP32 上接入豆包工具,本质上是让 ESP32 设备与豆包的 API 进行通信,以获取相关服务
    的头像 发表于 02-05 13:40 2859次阅读
    <b class='flag-5'>esp32</b>如何接入豆包

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

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

    【AI技术支持】ESP32-S3模组EspBleOTA搜索不到ble_ota例程的蓝牙问题处理

    启明云端/01问题描述在智能标识牌上使用ESP32-S3-WROOM-1U模组,ESP-IDF版本为idf5.0.2时,客户在ESP32-S3模组烧录运行
    的头像 发表于 12-13 18:06 2885次阅读
    【AI技术支持】<b class='flag-5'>ESP32-S3</b>模组EspBleOTA搜索不到ble_ota例程的蓝牙问题处理