树莓派和ESP32通信

1. 环境准备

树莓派安装Ubuntu 24.04

使用 Raspberry Pi Imager 将 Ubuntu 24.04(代号 Noble)写入树莓派的 SD 卡。


2. ROS 2 安装

选择 ROS 2 版本

在 Ubuntu 24.04 上,建议安装 ROS 2 Jazzy Jalisco 版本,以确保最佳兼容性。

环境准备

  1. 确保已更新系统:
    sudo apt update && sudo apt upgrade -y
    
  2. 添加 ROS 2 的 APT 仓库:
    sudo apt install software-properties-common -y
    sudo add-apt-repository universe
    sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
    
  3. 设置全局代理,解决 DNS 或网络问题:
    export http_proxy="http://192.168.0.103:7892"
    export https_proxy="http://192.168.0.103:7890"
    export ftp_proxy="http://192.168.0.103:7890"
    export all_proxy="socks5://192.168.0.103:7891"
    

添加 ROS 2 仓库源

echo "deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu noble main" | sudo tee /etc/apt/sources.list.d/ros2-latest.list

安装 ROS 2

  1. 更新 APT 缓存并安装:
    sudo apt update
    sudo apt install ros-jazzy-desktop -y
    
  2. 添加环境变量:
    echo "source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
    source ~/.bashrc
    

3. micro-ROS Agent 安装

安装依赖

sudo apt install -y build-essential cmake python3-colcon-common-extensions python3-pip git

克隆 micro-ROS 源码

mkdir -p ~/microros_ws/src
cd ~/microros_ws
git clone https://github.com/micro-ROS/micro-ROS-Agent.git src/micro_ros_agent

安装 rosdep

  1. 创建虚拟环境:
    python3 -m venv ~/rosdep_venv
    
  2. 激活虚拟环境并安装 rosdep
    source ~/rosdep_venv/bin/activate
    pip install rosdep
    
  3. 初始化 rosdep
    sudo ~/rosdep_venv/bin/rosdep init
    ~/rosdep_venv/bin/rosdep update
    

安装 micro-ROS Agent 依赖

rosdep install --from-paths src --ignore-src -r -y

编译 micro-ROS Agent

colcon build --symlink-install
source install/setup.bash

配置环境变量

echo "source ~/microros_ws/install/setup.bash" >> ~/.bashrc
source ~/.bashrc

4. 启动 micro-ROS Agent

启动 micro-ROS Agent:

ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0 -b 115200

解决串口权限问题

如果遇到 errno: 13 的权限错误:

  1. 查看串口权限:
    ls -l /dev/ttyUSB0
    
  2. 将当前用户添加到 dialout 组:
    sudo usermod -a -G dialout $USER
    newgrp dialout
    

5. ESP32 程序调试

ESP32 示例代码

以下是 ESP32 程序的简化代码片段:

#include <Arduino.h>
#include <micro_ros_platformio.h>
#include <rcl/rcl.h>
#include <rclc/rclc.h>
#include <std_msgs/msg/int32.h>

rcl_publisher_t publisher;
std_msgs__msg__Int32 msg;

void setup() {
  Serial.begin(115200);
  set_microros_serial_transports(Serial);
  
  // 初始化 micro-ROS 节点和发布者
  rcl_allocator_t allocator = rcl_get_default_allocator();
  rclc_support_t support;
  rclc_support_init(&support, 0, NULL, &allocator);
  
  rcl_node_t node;
  rclc_node_init_default(&node, "optimized_micro_ros_node", "", &support);
  
  rclc_publisher_init_default(&publisher, &node, ROSIDL_GET_MSG_TYPE_SUPPORT(std_msgs, msg, Int32), "optimized_micro_ros_node_publisher");
  msg.data = 0;
}

void loop() {
  rcl_publish(&publisher, &msg, NULL);
  msg.data++;
  delay(2000);
}

6. 验证通信

列出主题

运行以下命令确认主题已注册:

ros2 topic list

查看主题消息

ros2 topic echo /optimized_micro_ros_node_publisher

示例输出:

data: 0
---
data: 1
---
data: 2

总结

通过以上步骤,成功实现了树莓派与 ESP32 的串口通信,并通过 ROS 2 和 micro-ROS 完成了消息发布与接收。