扫地机器人
扫地机器人是强化学习和机器人技术的经典应用场景之一。它涉及路径规划、环境感知、避障、覆盖率优化等核心问题,是学习机器人开发的良好切入点。
项目版本
扫地机器人项目主要分为两个版本:
- 基于 ROS 的仿真版本:在 Gazebo 仿真环境中实现,使用 ROS 框架进行通信和控制
- 基于强化学习的版本:使用 RL 算法(如 DQN/PPO)训练智能体学习清扫策略
核心技术问题
覆盖路径规划 (Coverage Path Planning)
扫地机器人的首要任务是覆盖整个可达区域,同时尽量减少重复清扫。
传统方法:
- 弓字形(Boustrophedon)路径:像耕田一样来回走,简单但需要精确定位
- 螺旋形路径:从中心或边缘开始螺旋清扫
- 分区覆盖:先将空间分成若干子区域,然后对每个子区域分别规划路径
基于RL的方法:
- 将房间网格化,智能体在每个格子上选择移动方向
- 奖励设计:覆盖新区域 +1,重复访问 -0.1,撞墙 -1,全部覆盖 +100
- 状态表示:当前位置 + 已覆盖区域的二值地图 + 传感器读数
SLAM (同步定位与建图)
扫地机器人需要在未知环境中同时完成定位和建图:
- 激光 SLAM:使用 LiDAR 传感器,精度高但成本较高(如 Roborock)
- 视觉 SLAM:使用摄像头,成本低但计算量大(如 iRobot Roomba j 系列)
- 惯性导航 + 编码器:低成本方案,精度较差,适合入门级产品
避障
- 红外/超声波传感器:检测近距离障碍物
- 碰撞传感器:物理接触检测,作为最后的安全保障
- 深度相机/3D ToF:获取障碍物的三维信息,实现更智能的避障
- AI视觉识别:识别电线、鞋子、宠物粪便等特定障碍物并主动规避
简单RL实现思路
使用 OpenAI Gym 风格定义扫地机器人环境:
import gymnasium as gym
import numpy as np
class CleaningRobotEnv(gym.Env):
def __init__(self, grid_size=10):
self.grid_size = grid_size
self.action_space = gym.spaces.Discrete(4) # 上下左右
self.observation_space = gym.spaces.Box(
low=0, high=1,
shape=(grid_size, grid_size, 2), # 通道0:障碍物, 通道1:已清扫
dtype=np.float32
)
def reset(self):
self.robot_pos = [0, 0]
self.cleaned = np.zeros((self.grid_size, self.grid_size))
self.cleaned[0][0] = 1
return self._get_obs(), {}
def step(self, action):
# 移动机器人
dx, dy = [(0,-1), (0,1), (-1,0), (1,0)][action]
new_x = np.clip(self.robot_pos[0] + dx, 0, self.grid_size - 1)
new_y = np.clip(self.robot_pos[1] + dy, 0, self.grid_size - 1)
# 计算奖励
reward = -0.1 # 步数惩罚
if self.cleaned[new_x][new_y] == 0:
reward = 1.0 # 覆盖新区域
self.robot_pos = [new_x, new_y]
self.cleaned[new_x][new_y] = 1
# 检查是否完成
coverage = self.cleaned.sum() / self.cleaned.size
done = coverage >= 0.95
return self._get_obs(), reward, done, False, {"coverage": coverage}
参考
- Choset, "Coverage of Known Spaces: The Boustrophedon Cellular Decomposition", Autonomous Robots, 2000
- ROS Navigation Stack