项目总体架构

首先,需要明确整个系统的软件和硬件架构,这有助于理解每一步的目的。

  1. 硬件层:

    • 执行机构:​ 四个直流减速电机 + 电机驱动板。

    • 传感器:​ 思岚S2激光雷达。

    • 下位机:​ STM32F103RCT6。负责直接控制电机驱动板(输出PWM和方向信号),并可能读取电机编码器数据(如果电机带编码器)。

    • 主控板:​ RK3588。作为机器人的“大脑”,运行ROS 2 Humble。负责处理激光雷达数据、运行SLAM算法、发布导航目标、以及向STM32下位机发送速度指令。

  2. 通信层:

    • RK3588 与 STM32:​ 通过串口(UART)​ 通信。自定义一个简单高效的串口协议。

    • RK3588 与 思岚S2:​ 通过USB​ 或 以太网​ 连接(S2支持这两种方式,USB更简单)。

  3. ROS 2 软件层:

    • 思岚官方驱动:​ 发布 /scan(sensor_msgs/msg/LaserScan) 话题。

    • 自定义串口通信节点:​ 这是一个你需要重点开发的节点。

      • 订阅:/cmd_vel(geometry_msgs/msg/Twist)

      • 发布:/odom(nav_msgs/msg/Odometry) (如果STM32能反馈编码器数据)

      • 功能:将 /cmd_vel消息转换为自定义协议发给STM32;从STM32读取编码器数据并转换为 odom消息发布。

    • SLAM工具箱:​ 订阅 /scan和 /odom,发布 /map(nav_msgs/msg/OccupancyGrid)。

    • RViz2:​ 可视化所有数据。


详细实现计划与步骤

第一阶段:硬件准备与基础测试

目标:​ 确保所有硬件单独工作正常。

  1. RK3588 基础环境搭建:

    • 安装 Ubuntu 20.04 或 22.04 操作系统。

    • 安装 ROS 2 Humble。请按照官方文档操作。

    • 测试ROS 2环境:source /opt/ros/humble/setup.bash,然后运行 ros2 topic list确认无错误。

  2. 思岚S2雷达测试:

    • 将S2连接到RK3588的USB口。

    • 安装思岚S2的ROS 2驱动。请参考思岚官方GitHub仓库(例如 rplidar_ros2)。

    • 启动驱动节点:ros2 launch s2_ros s2.launch.py

    • 使用RViz2可视化点云:rviz2,添加一个 LaserScan显示,将Topic设置为 /scan。你应该能看到雷达数据。

  3. STM32下位机与电机驱动测试:

    • 核心任务:​ 编写STM32基础固件,实现电机控制。

    • 步骤:

      a. 搭建STM32开发环境(STM32CubeIDE)。

      b. 使用HAL库配置生成PWM(用于控制电机速度)和GPIO(用于控制电机方向)的代码。

      c. 配置UART,用于接收RK3588的指令。

      d. 编写代码,解析简单的串口指令(例如:“v 0.5 0.1\n”表示线速度0.5m/s,角速度0.1rad/s)。

      e. 根据指令,计算四个电机的目标速度(差速转向模型),并输出相应的PWM信号。

      f. 将程序烧录到STM32,连接电机和驱动板,通过串口调试助手发送指令,测试小车能否按预期前进、后退、转弯。

第二阶段:ROS 2与STM32通信

目标:​ 在RK3588上创建一个ROS 2节点,实现与STM32的稳定通信。

  1. 设计串口通信协议:

    • 定义一种简单、带校验的协议。例如:

      • RK3588 -> STM32 (控制指令):​ [前缀][线速度][角速度][校验和]\n

        • 例如:v,0.500,0.100,*37\n

      • STM32 -> RK3588 (里程计数据):​ [前缀][左轮里程][右轮里程][校验和]\n

        • 例如:o,12.500,13.200,*44\n

    • 注意:​ 如果电机带编码器,STM32需要能够读取并累计算里程信息。

  2. 创建自定义ROS 2包:

    • cd ~/ros2_ws/src

    • ros2 pkg create --build-type ament_cmake my_robot_bringup(名字可以自定)

  3. 编写串口通信节点(C++或Python):

    • 语言选择:​ C++性能更好,Python开发更快。建议初学者用Python,熟练后用C++。这里以Python为例。

    • 节点功能:

      • 导入 pyserial库操作串口。

      • 创建一个订阅者,订阅 /cmd_vel话题。

      • 创建一个发布者,发布 /odom话题。

      • 创建一个定时器,周期性地:

        a. 读取STM32数据:​ 从串口读取数据,解析出里程信息,填充 nav_msgs/msg/Odometry消息并发布。同时要进行坐标系变换(TF广播),发布 odomframe 到 base_linkframe 的变换。

        b. 发送控制指令:​ 当收到 /cmd_vel回调时,将速度值转换为协议格式,通过串口发送给STM32。也可以定时发送最新速度。

  4. 测试通信:

    • 编译并运行你的节点。

    • 使用 ros2 topic pub /cmd_vel ...手动发布速度指令,观察小车是否运动。

    • 使用 ros2 topic echo /odom查看是否收到里程计数据。

第三阶段:集成与SLAM建图

目标:​ 将所有的ROS 2节点启动,使用SLAM工具箱进行建图。

  1. 安装SLAM工具箱:

    • sudo apt install ros-humble-slam-toolbox

  2. 编写启动文件:

    • 创建一个 launch文件夹在你的package里。

    • 编写一个 slam.launch.py文件,一次性启动所有节点:

      • 思岚S2驱动节点。

      • 你的自定义串口通信节点。

      • SLAM工具箱节点(slam_toolbox)。

      • 可选项:RViz2配置,直接加载一个针对此小车的配置文件。

  3. 配置SLAM:

    • 创建一个Slam工具箱的配置文件(如 mapper_params_online.yaml),主要设置:

      • odom_frame: odom

      • map_frame: map

      • base_frame: base_link

      • 扫描话题:scan: /scan

  4. 开始建图!

    • ros2 launch my_robot_bringup slam.launch.py

    • 打开RViz2,你会看到:

      • 激光扫描点(红色点)。

      • 不断更新的地图(灰度栅格)。

      • 小车在地图中的位姿(一个箭头)。

    • 手动控制小车移动:​ 打开一个新终端,使用 teleop_twist_keyboard节点来控制小车。

      • sudo apt install ros-humble-teleop-twist-keyboard

      • ros2 run teleop_twist_keyboard teleop_twist_keyboard

    • 控制小车在环境中缓慢、完整地移动,直到地图清晰完整。

  5. 保存地图:

    • 建图完成后,保存地图:

      • ros2 run nav2_map_server map_saver_cli -f ~/my_robot_map

第四阶段:优化与下一步(导航)
  1. 优化:

    • 校准:​ 校准里程计,让发布的 /odom数据尽可能准确(调整轮子间距、轮胎周长等参数)。

    • TF树:​ 确保TF树正确:map -> odom -> base_link -> ...

    • PID调节:​ 在STM32端为每个电机增加速度环PID控制,使小车速度更稳定。

  2. 下一步(自主导航):

    • 你已经有了地图(map.pgm和 map.yaml)。

    • 下一步就是使用ROS 2的Navigation2栈来实现自主导航。这包括:

      • 配置 nav2_bringup

      • 设置代价地图、全局/局部规划器、行为树等参数。

      • 通过RViz2设置目标点,让小车自主规划路径并移动。

关键注意事项

  • 电源管理:​ 电机驱动功率很大,务必为电机、RK3588、STM32、雷达准备独立、功率足够的电源,共地处理要良好。

  • 机械结构:​ 小车的机械结构要稳固,特别是雷达的安装要水平、稳固,避免震动。

  • 安全第一:​ 测试时,最好把小车架起来,让轮子悬空,避免意外启动冲出去。

  • 调试工具:​ 善用 ros2 topic echo/listrviz2rqt_graph等工具进行调试。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐