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

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

    关注

    4984

    文章

    18300

    浏览量

    288870
  • AI
    AI
    +关注

    关注

    87

    文章

    26487

    浏览量

    264150
  • 人工智能
    +关注

    关注

    1777

    文章

    43920

    浏览量

    230846
收藏 人收藏

    评论

    相关推荐

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

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

    esp32外置flash的大小

    ESP32是一款功能强大的微控制器,广泛应用于物联网和嵌入式设备领域。虽然ESP32内置了一定的闪存空间,但有时候我们可能需要更大的储存空间来存储更多的数据或者程序。因此,一些厂商推出了外置
    的头像 发表于 01-09 11:24 1337次阅读

    ESP32-PICO系列技术规格书

    ESP32-PICO 系列是基于 ESP32 芯片 的系统级封装 (SiP) 产品。ESP32-PICO 系列产品包括 ESP32-PICO-D4、
    发表于 12-12 16:56 0次下载
    <b class='flag-5'>ESP32</b>-PICO系列技术规格书

    【悟空H3开发板免费体验】基于ROS系统的全向轮小车

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

    esp32s3使用多串口

    esp32s3使用多串口 我按照别人博客中设置串口2,串口打印有问题,因为没有看到esp32s3 多串口,就总结了一下自己的经验 下图为esp32的引脚图 下图为esp32s3的引脚
    的头像 发表于 11-06 11:29 1519次阅读
    <b class='flag-5'>esp32</b>s3使用多串口

    ESP32学习笔记:双核

    今天我们来说说ESP32 for Arduino 的双核。
    的头像 发表于 07-15 16:16 3079次阅读
    <b class='flag-5'>ESP32</b>学习笔记:双核

    ESP32-C2 8684 AT固件

    ESP32-C2模组 ESP8684芯片 智能家居设备开发模组
    的头像 发表于 07-03 13:41 559次阅读
    <b class='flag-5'>ESP32</b>-C2  8684  AT固件

    ESP32ESP32通过Internet进行通信

    电子发烧友网站提供《ESP32ESP32通过Internet进行通信.zip》资料免费下载
    发表于 06-15 09:58 2次下载
    <b class='flag-5'>ESP32</b>到<b class='flag-5'>ESP32</b>通过Internet进行通信

    基于ESP32+MicroPython实现联网并进行UDP通信

    使用 esp32 开发程序,非常重要的功能就是使用 wifi,下面我们就讲一下 esp32 连接 wifi 的方法。
    的头像 发表于 06-13 17:05 3998次阅读
    基于<b class='flag-5'>ESP32</b>+MicroPython<b class='flag-5'>实现</b>联网并进行UDP通信

    基于ESP32的WiFi温度传感器网络的实现

    电子发烧友网站提供《基于ESP32的WiFi温度传感器网络的实现.zip》资料免费下载
    发表于 06-13 11:01 0次下载
    基于<b class='flag-5'>ESP32</b>的WiFi温度传感器网络的<b class='flag-5'>实现</b>

    [esp32教程] 5、UART使用

    基于Ubuntu下,利用esp-idf进行esp32开发的教程
    的头像 发表于 06-13 09:04 4430次阅读
    [<b class='flag-5'>esp32</b>教程] 5、UART使用

    [esp32教程] 4、LEDC使用

    基于Ubuntu下,利用esp-idf进行esp32开发的教程
    的头像 发表于 06-03 09:39 3159次阅读
    [<b class='flag-5'>esp32</b>教程] 4、LEDC使用

    ​使用旭日X3实现手势检测

    本篇博客通过旭日X3搭载手势识别算法,实现实时检测,同时测试其运行性能。
    的头像 发表于 06-02 17:36 576次阅读
    ​使用<b class='flag-5'>旭日</b><b class='flag-5'>X3</b>派<b class='flag-5'>实现</b>手势检测

    [esp32教程]3、利用idf.py创建组件

    [esp32教程]3、利用idf.py创建组件
    的头像 发表于 05-05 09:05 1485次阅读

    [esp32教程]2、按键中断

    基于Ubuntu,利用esp-idf进行esp32的教学
    的头像 发表于 05-05 09:04 2251次阅读
    [<b class='flag-5'>esp32</b>教程]2、按键中断