1. 项目概述
今天要和大家分享的是ROS2机器人少年创客营第四天的实战内容。作为一个带过十几期机器人培训的老司机,我发现第四天往往是学员们突破"新手墙"的关键节点。在这一天,孩子们要从基础概念理解过渡到实际项目搭建,开始真正体验机器人开发的完整流程。
这次课程的核心是让12-16岁的青少年在树莓派上搭建ROS2开发环境,并通过Python实现一个简单的机器人避障功能。选择这个项目是因为它完美融合了硬件组装、软件编程和算法思维三个维度,既不会太难打击信心,又能让孩子们获得实实在在的成就感。
2. 环境准备与硬件搭建
2.1 硬件选型解析
我们为每个学员准备了一套标准化硬件套装:
- 树莓派4B(4GB内存版)
- 超声波传感器HC-SR04
- 两轮驱动底盘套件
- 18650电池组
- 7英寸触摸屏
特别提醒:超声波传感器的Trig和Echo引脚需要接1kΩ电阻分压,否则可能损坏树莓派GPIO口。这是我们踩过的坑,建议提前焊接好分压电路。
2.2 ROS2安装优化方案
针对树莓派性能特点,我们采用了轻量级安装方案:
bash复制sudo apt install ros-humble-ros-base
这个基础包去掉了GUI工具,节省了约40%的存储空间。我们还准备了预配置的SD卡镜像,将首次启动时间从2小时压缩到15分钟。
安装完成后,需要特别检查:
bash复制source /opt/ros/humble/setup.bash
printenv | grep ROS
确保环境变量正确设置,这是后续所有操作的基础。
3. 机器人运动控制实现
3.1 电机驱动开发
使用RPi.GPIO库控制L298N电机驱动模块:
python复制import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(IN1, GPIO.OUT) # 左轮正转
GPIO.setup(IN2, GPIO.OUT) # 左轮反转
GPIO.setup(IN3, GPIO.OUT) # 右轮正转
GPIO.setup(IN4, GPIO.OUT) # 右轮反转
def move_forward():
GPIO.output(IN1, True)
GPIO.output(IN2, False)
GPIO.output(IN3, True)
GPIO.output(IN4, False)
实测发现PWM频率设置在500Hz时电机运行最平稳,低于200Hz会有明显抖动。
3.2 ROS2节点通信架构
我们设计了三个核心节点:
- sensor_node:读取超声波数据
- control_node:实现避障算法
- motor_node:执行运动指令
节点间通过topic通信:
python复制# 在control_node中
self.publisher = self.create_publisher(Twist, '/cmd_vel', 10)
self.subscription = self.create_subscription(
Range,
'/distance',
self.listener_callback,
10)
4. 避障算法实现细节
4.1 距离检测优化
超声波传感器原始数据需要滤波处理:
python复制# 滑动窗口滤波
distance_readings = []
def get_filtered_distance():
distance_readings.append(current_reading)
if len(distance_readings) > 5:
distance_readings.pop(0)
return sum(distance_readings) / len(distance_readings)
4.2 状态机设计
采用有限状态机控制机器人行为:
mermaid复制graph LR
A[前进] -->|障碍<30cm| B[停止]
B --> C[右转45度]
C --> D[检测距离]
D -->|安全| A
D -->|仍危险| C
实际代码实现:
python复制class State(Enum):
FORWARD = 1
STOP = 2
TURN = 3
def execute_state(self):
if self.state == State.FORWARD:
self.move_forward()
if self.distance < 0.3:
self.state = State.STOP
elif self.state == State.STOP:
self.stop()
self.state = State.TURN
self.turn_angle = 45
# 其他状态处理...
5. 调试技巧与问题排查
5.1 常见问题速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电机不转 | 电源极性接反 | 检查18650电池方向 |
| 距离读数异常 | 传感器未校准 | 执行ros2 run teleop_twist_keyboard测试 |
| ROS节点失联 | 网络配置错误 | 检查ifconfig和ping测试 |
5.2 性能优化记录
通过top命令监控发现:
- Python节点内存占用约60MB
- 主循环频率从10Hz提升到20Hz后CPU使用率仅增加5%
- 添加
gc.collect()后内存泄漏问题明显改善
6. 课程教学心得
经过多期实践,我总结出几个关键教学点:
- 可视化调试:用
rqt_graph展示节点关系,抽象概念立刻具象化 - 渐进式挑战:先让机器人动起来,再加传感器,最后实现算法
- 故障即教材:故意制造一些接线错误,让学生学会看日志排查
有个12岁的学员发现,将转向角度从固定的45度改为根据障碍距离动态计算,避障效率提升了70%。这种自主探索正是创客教育的精髓所在。
7. 项目扩展方向
完成基础功能后,可以引导学员尝试:
- 增加IMU传感器实现更精准的转向控制
- 用OpenCV添加视觉避障能力
- 部署到Gazebo仿真环境进行大规模测试
- 设计迷宫挑战赛,用最少时间通过复杂地形
我们下期计划引入激光雷达,让孩子们体验更专业的SLAM建图过程。从教学反馈来看,经过四天训练,多数学员已经能够独立调试基本的机器人功能,这种成长速度总是让我感到惊喜。