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