RK3588作为主控,STM32F103作为下位机,思岚S2雷达,四路电机驱动板,进行地图构建计划
这是一个你。
项目总体架构
首先,需要明确整个系统的软件和硬件架构,这有助于理解每一步的目的。
-
硬件层:
-
执行机构: 四个直流减速电机 + 电机驱动板。
-
传感器: 思岚S2激光雷达。
-
下位机: STM32F103RCT6。负责直接控制电机驱动板(输出PWM和方向信号),并可能读取电机编码器数据(如果电机带编码器)。
-
主控板: RK3588。作为机器人的“大脑”,运行ROS 2 Humble。负责处理激光雷达数据、运行SLAM算法、发布导航目标、以及向STM32下位机发送速度指令。
-
-
通信层:
-
RK3588 与 STM32: 通过串口(UART) 通信。自定义一个简单高效的串口协议。
-
RK3588 与 思岚S2: 通过USB 或 以太网 连接(S2支持这两种方式,USB更简单)。
-
-
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: 可视化所有数据。
-
详细实现计划与步骤
第一阶段:硬件准备与基础测试
目标: 确保所有硬件单独工作正常。
-
RK3588 基础环境搭建:
-
安装 Ubuntu 20.04 或 22.04 操作系统。
-
安装 ROS 2 Humble。请按照官方文档操作。
-
测试ROS 2环境:
source /opt/ros/humble/setup.bash,然后运行ros2 topic list确认无错误。
-
-
思岚S2雷达测试:
-
将S2连接到RK3588的USB口。
-
安装思岚S2的ROS 2驱动。请参考思岚官方GitHub仓库(例如
rplidar_ros2)。 -
启动驱动节点:
ros2 launch s2_ros s2.launch.py。 -
使用RViz2可视化点云:
rviz2,添加一个LaserScan显示,将Topic设置为/scan。你应该能看到雷达数据。
-
-
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的稳定通信。
-
设计串口通信协议:
-
定义一种简单、带校验的协议。例如:
-
RK3588 -> STM32 (控制指令):
[前缀][线速度][角速度][校验和]\n-
例如:
v,0.500,0.100,*37\n
-
-
STM32 -> RK3588 (里程计数据):
[前缀][左轮里程][右轮里程][校验和]\n-
例如:
o,12.500,13.200,*44\n
-
-
-
注意: 如果电机带编码器,STM32需要能够读取并累计算里程信息。
-
-
创建自定义ROS 2包:
-
cd ~/ros2_ws/src -
ros2 pkg create --build-type ament_cmake my_robot_bringup(名字可以自定)
-
-
编写串口通信节点(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。也可以定时发送最新速度。
-
-
-
测试通信:
-
编译并运行你的节点。
-
使用
ros2 topic pub /cmd_vel ...手动发布速度指令,观察小车是否运动。 -
使用
ros2 topic echo /odom查看是否收到里程计数据。
-
第三阶段:集成与SLAM建图
目标: 将所有的ROS 2节点启动,使用SLAM工具箱进行建图。
-
安装SLAM工具箱:
-
sudo apt install ros-humble-slam-toolbox
-
-
编写启动文件:
-
创建一个
launch文件夹在你的package里。 -
编写一个
slam.launch.py文件,一次性启动所有节点:-
思岚S2驱动节点。
-
你的自定义串口通信节点。
-
SLAM工具箱节点(
slam_toolbox)。 -
可选项:RViz2配置,直接加载一个针对此小车的配置文件。
-
-
-
配置SLAM:
-
创建一个Slam工具箱的配置文件(如
mapper_params_online.yaml),主要设置:-
odom_frame: odom -
map_frame: map -
base_frame: base_link -
扫描话题:
scan: /scan
-
-
-
开始建图!
-
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
-
-
控制小车在环境中缓慢、完整地移动,直到地图清晰完整。
-
-
保存地图:
-
建图完成后,保存地图:
-
ros2 run nav2_map_server map_saver_cli -f ~/my_robot_map
-
-
第四阶段:优化与下一步(导航)
-
优化:
-
校准: 校准里程计,让发布的
/odom数据尽可能准确(调整轮子间距、轮胎周长等参数)。 -
TF树: 确保TF树正确:
map -> odom -> base_link -> ...。 -
PID调节: 在STM32端为每个电机增加速度环PID控制,使小车速度更稳定。
-
-
下一步(自主导航):
-
你已经有了地图(
map.pgm和map.yaml)。 -
下一步就是使用ROS 2的Navigation2栈来实现自主导航。这包括:
-
配置
nav2_bringup。 -
设置代价地图、全局/局部规划器、行为树等参数。
-
通过RViz2设置目标点,让小车自主规划路径并移动。
-
-
关键注意事项
-
电源管理: 电机驱动功率很大,务必为电机、RK3588、STM32、雷达准备独立、功率足够的电源,共地处理要良好。
-
机械结构: 小车的机械结构要稳固,特别是雷达的安装要水平、稳固,避免震动。
-
安全第一: 测试时,最好把小车架起来,让轮子悬空,避免意外启动冲出去。
-
调试工具: 善用
ros2 topic echo/list,rviz2,rqt_graph等工具进行调试。
更多推荐



所有评论(0)