首页 > 其他分享 >Docker && Microros && PlatformIO 配置经验留存

Docker && Microros && PlatformIO 配置经验留存

时间:2024-08-08 16:25:31浏览次数:19  
标签:PlatformIO timer Microros && executor microros docker 安装 rclc

1. 背景:

无意中看到了小鱼(鱼香ROS)的文章

硬件环境:Ubuntu22.04  && ESP32-WROOM-32

想在ESP32 WROOM 32 上实现microros的功能:

实现上位机(跑ROS2)通过topic直接控制CAN报文的功能;

目前进度:实现了环境的配置(PlatformIO && docker && Microros);初步跑通了Microros的订阅与发送(24.08.08);

2. 踩坑道路:

(1)安装PlatformIO

安装该软件(IDE)的时候大部分情况下用的是鱼香ROS的一键安装

wget http://fishros.com/install -O fishros && . fishros

一键安装更新-安装STM32&ESP32开发终极IDE_microros stm32 platformio-CSDN博客

确实很强 !!! 但是遇到了问题:安装完成之后在VScode中还是打不开PlatformIO

一直是waiting的。。。。。。。

解决方式(大概是这样):

1. 在ubuntu home目录下会有一个.platformio的隐藏文件 将其卸载之后 通过VScode重新安装一下(或者就是小鱼的一键安装)有点忘记了。。。

2. 还有其他的方式就是:挂梯子 连手机wifi等 CSDN上很多

(2)microros的安装

这一步不是太确定:我记得之前在ubuntu20.04上的时候直接安装就可以使用了 具体就是:

First micro-ROS Application on Linux | micro-ROS

然后跟着教程走就好了

但是到了ubuntu22.04之后使用官网的步骤进行配置就一直会报错DDS。。。

执行:

ros2 run micro_ros_setup build_agent.sh

报错:

确实是没搞明白。。。(希望有大佬指点)

(3)docker的安装与使用

由于上一步骤microros安装的失败以及无法解决--只能使用docker来跑microros了

大致教程还是小鱼的一键安装

wget http://fishros.com/install -O fishros && . fishros

但是还有一个问题。。。我连不上docker... 困扰了一周多

解决方式:

首先通过一键安装安装上docker (PS:好像有这一步也失败的 但是我用了梯子所以成功了)

安装完成之后在 etc/docker/daemon.json 添加docker镜像代理

分享两个好用点的:

{"registry-mirrors": ["https://dhub.kubesre.xyz"]}
{"registry-mirrors": ["https://dhub.kubesre.xyz"]}

还有阿里云镜像的:但是我用起来不行(可以试下;每个人网络不一样)

还是不行的话。。。咸鱼搜docker

到这一步为止我们应该成功安装了docker 此时 我们就要用到:

sudo docker run -it --rm -v /dev:/dev -v /dev/shm:/dev/shm --privileged --net=host microros/micro-ros-agent:$ROS_DISTRO serial --dev /dev/ttyUSB0 -v6

具体可以看下这个:

【ROS2机器人入门到实战】Micro-ROS介绍与服务安装_microros-CSDN博客

受到你的docker镜像源的影响:这边的拉取可能会很慢!!

但是只要没有显示重试 就挂着 我记得我挂了半小时。。。

到这一步为止 应该安装完成了 docker microros platformio

那么我们就可以开始代码的开发了:

首先新建工程:添加microros库的链接(用小鱼的):

[env:featheresp32]
platform = espressif32
board = featheresp32
framework = arduino
lib_deps = 
	https://gitee.com/ohhuo/micro_ros_platformio.git
    miwagner/ESP32CAN @ ^0.0.1

示例代码:(自己写的比较差就引用了)

#include <Arduino.h>
#include <micro_ros_platformio.h>

#include <rcl/rcl.h>
#include <rclc/rclc.h>
#include <rclc/executor.h>
// 添加头文件
#include <std_msgs/msg/float32.h>

rclc_executor_t executor;
rclc_support_t support;
rcl_allocator_t allocator;
rcl_node_t node;
rcl_timer_t timer;

// 声明话题发布者
rcl_publisher_t publisher;
// 声明消息文件
std_msgs__msg__Float32 pub_msg;

// 定义定时器接收回调函数
void timer_callback(rcl_timer_t *timer, int64_t last_call_time)
{
  RCLC_UNUSED(last_call_time);
  if (timer != NULL)
  {
    rcl_publish(&publisher, &pub_msg, NULL);
  }
}

void setup()
{
  Serial.begin(115200);
  // 设置通过串口进行MicroROS通信
  set_microros_serial_transports(Serial);
  // 延时时一段时间,等待设置完成
  delay(2000);
  // 初始化内存分配器
  allocator = rcl_get_default_allocator();
  // 创建初始化选项
  rclc_support_init(&support, 0, NULL, &allocator);
  // 创建节点 topic_sub_test
  rclc_node_init_default(&node, "topic_pub_test", "", &support);
  // 订阅者初始化
  rclc_publisher_init_default(
      &publisher,
      &node,
      ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Float32),
      "battery_voltage");

  // 创建定时器,200ms发一次
  const unsigned int timer_timeout = 200;
  rclc_timer_init_default(
      &timer,
      &support,
      RCL_MS_TO_NS(timer_timeout),
      timer_callback);

  // 创建执行器
  rclc_executor_init(&executor, &support.context, 1, &allocator);
  // 给执行器添加定时器
  rclc_executor_add_timer(&executor, &timer);
  // 初始化ADC
  pinMode(34, INPUT);
  analogSetAttenuation(ADC_11db);
}

void loop()
{
  delay(100);
  // 循环处理数据
  rclc_executor_spin_some(&executor, RCL_MS_TO_NS(100));
  // 通过ADC获取电压值
  int analogValue = analogRead(34);                     // 读取原始值0-4096
  int analogVolts = analogReadMilliVolts(34);           // 读取模拟电压,单位毫伏
  float realVolts = 5.02 * ((float)analogVolts * 1e-3); // 计算实际电压值
  pub_msg.data = realVolts;
}

需要注意的是:

大部分的逻辑与ROS2类似

但是在执行器这部分有些不一样(困扰了一会儿。。。)

  // 创建执行器
  rclc_executor_init(&executor, &support.context, 1, &allocator);
  // 给执行器添加定时器
  rclc_executor_add_timer(&executor, &timer);

这里的执行器有一个参数“1”--具体含义是指执行器只会执行下面的1条命令 这部分需要按需修改一下

然后就是连接开发板 下载

终端启动:

接下来ros2 topic list 应该就可以看到topic 了

未完。。。代更新 (24.08.08)

标签:PlatformIO,timer,Microros,&&,executor,microros,docker,安装,rclc
From: https://blog.csdn.net/qq_44936797/article/details/141028550

相关文章

  • platformio 添加github的库
    platformio添加github的库在PlatformIO中添加GitHub上的库,你需要在项目的platformio.ini文件中使用库的GitHubURL。以下是添加库的步骤:打开你的PlatformIO项目的platformio.ini文件。在[env:default]部分或者特定的环境部分下,使用lib_deps指令添加GitHub上的库......
  • STM32开发环境配置记录——关于PlatformIO + VSCode + CubeMX的集成环境配置
    前言​ 为什么配置这样的一个环境呢?鄙人受够了Keil5那个简陋的工作环境了,实在是用不下去,调试上很容易跟CubeMX的代码产生不协调导致调试——发布代码不一致造成的一系列问题。CubeIDE虽说不错,但是它的代码辅助功能和构建系统实在不敢恭维,经常出现Makefile未同步导致符号定义冲突,......
  • ros-slam-microros-发布里程计odom
    获得了里程计数据后,下一步就是将里程计通过MicroROS话题发布到ROS2系统中。一、了解接口在ROS2已有的消息接口中:nav_msgs/msg/Odometry用于表示里程计数据,该接口内容如下:ros2interfaceshownav_msgs/msg/Odometry---#Thisrepresentsanestimateofapositio......
  • ros - slam - microros - 里程计原理-速度积分
    前面两节中我们完成机器人底盘正逆解的计算,我们通过机器人的运动学逆解完成了机器人实时的角速度和线速度的测量,那我们能不能利用对线速度和角速度的积分,计算机器人当前的位置呢?答案肯定是可以的,那么本节我们就来编写代码实现机器人的里程计。  二、编写代码先修改Kinematics......
  • ros - slam - microros - 两轮差速模型运动学 - 运动学逆解
    上一节我们推导并在代码中实现了运动学正解,本节我们来学习下运动学逆解,实现给定线速度和角速度,计算出轮子达到怎样的转速才能达到这个速度。 一、逆解推导我们直接用正解结果进行求逆解即可。 二、编写代码继续在上一节中的代码Kinematics.cpp中完善即可。voidKinematics......
  • esp32-s3+GC9A01基于vs code+PlatformIO+ardunio框架+Squareline UI 移植
    文章目录前言一、SquarelineStudio是什么?二、使用步骤1.创建测试的UI2.工程导出3.工程移植总结前言本节描述了使用SquarelineStudio创建简单UI,导出文件后如何与LVGL集成并在PlatformIO环境中进行编译和下载过程。环境如下:platform=espressif32board=esp32-s......
  • ros - slam - microros - 两轮差速模型运动学 - 运动学正解
    上一节了解了两轮差速运动学,本节我们线进一步的了解两轮差速正运动学的推导过程,并利用两轮差速运动学正解,来完成对小车的实时速度计算。 一、正运动学解推导两轮差速机器人是一种常见的移动机器人类型,由两个轮子和一个中心点组成。我们可以通过控制每个轮子的转速来实现移动,并......
  • ros - slam - microros - 两轮差速模型运动学介绍
    本节我们来了解下两轮差速运动学。一、两轮差速运动学模型两轮差速模型指机器人底盘由两个驱动轮和若干支撑轮构成的底盘模型,像turtlebot和开源机器人fishbot都是两轮差速模型。 两轮差速模型通过两个驱动轮可以通过不同转速和转向,使得机器人的达到某个特定的角速度和线速度......
  • ros -slam - microros- PID控制器实现
    上一节我们通过编码器完成了对机器人单个轮子的速度测量,完成了电机速度闭环控制的重要一步-反馈。 有了反馈,接着我们需要设计一个控制器来帮助我们实现这个需求,这个控制器的输入是当前的速度和目标速度,输出是应该给到电机的PWM占空比。一、PID控制器介绍PID控制器是一种广泛应......
  • ros - microros - 电机控制之使用开源库驱动多路电机
    前面了解了电机控制的原理并通过实验测试了对电机正反转以及转速的控制。本节我们采用开源库调用ESP32的外设MCPWM进行精细化的电机PWM控制。一、MCPWM简介MCPWM中文名是电机控制脉宽调制器(MotorControlPulseWidthModulator),是一款多功能PWM发生器,包含各种子模块,使其成为电......