点击下方卡片,关注「3D视觉工坊」公众号
选择星标,干货第一时间送达

来源:古月居

添加小助理:cv3d001,备注:方向+学校/公司+昵称,拉你入群。文末附3D视觉行业细分群。

扫描下方二维码,加入「3D视觉从入门到精通」知识星球(点开有惊喜),星球内凝聚了众多3D视觉实战问题,以及各个模块的学习资料:近20门秘制视频课程、最新顶会论文、计算机视觉书籍、优质3D视觉算法源码等。想要入门3D视觉、做项目、搞科研,欢迎扫码加入!

0b8a0addd1635ca74297eaf997f8c398.jpeg

前言

自主导航与避障是机器人领域的核心研究方向之一,传统的避障算法多依赖于先验模型和规则设计。然而,面对复杂且动态的环境,这些算法常表现出一定的局限性。强化学习(Reinforcement Learning, RL)通过与环境交互,能够学习到最优策略,无需显式建模,是解决导航与避障问题的一种有效方法。

本文以强化学习为基础,详细讲解机器人如何通过强化学习实现自主导航与避障。我们结合经典的深度 Q 网络(Deep Q-Network, DQN)算法,设计并实现一个机器人自主避障系统,涵盖从理论到部署的完整流程。

原理介绍

1. 基本概念

c103e9ffc0bcd5d944b32e43f6591b29.png

强化学习是一种通过试错学习行为策略的框架,核心元素包括:

1、状态(State, s):机器人当前的环境表示,例如激光雷达数据、目标位置等。

2、动作(Action, a):机器人可执行的动作集合,例如前进、转弯等。

3、奖励(Reward, r):执行动作后的反馈信号,衡量动作的优劣。

3、策略(Policy, π):从状态到动作的映射,表示机器人的决策机制。

2. 强化学习整体流程

1、初始化: 定义状态、动作和奖励函数。

2、交互: 机器人与环境交互,采集状态和奖励数据。

3、更新策略: 根据采集的数据优化策略,使累计奖励最大化。

4、迭代:重复交互和优化,直至学习收敛。

3. DQN 算法的关键特点

DQN 将 Q 学习与深度学习结合,其核心思想为:

使用神经网络拟合状态-动作值函数 Q(s,a)。

通过经验回放(Experience Replay)避免时间相关性,提升稳定性。

引入目标网络(Target Network),缓解学习的不稳定性。

4. 算法流程

DQN 的核心公式为 Bellman 方程:

6eeac76b84253fb44046c8e3ca7a992d.png

其中:

Q:主网络预测的值。

Q′:目标网络的值。

r:当前奖励。

γ:折扣因子,控制未来奖励的重要性。

DQN 的主要步骤:

755c640ff1478c9a5aae8a6f147159cc.png

部署环境介绍

硬件需求

硬件:TurtleBot3(支持 ROS 的小型机器人平台)。

激光雷达:用于环境感知。

GPU:NVIDIA GPU,用于训练强化学习模型。

软件需求

操作系统:Ubuntu 20.04。

ROS 版本:ROS Noetic。

强化学习框架:TensorFlow 或 PyTorch。

仿真环境:Gazebo 11。

部署流程

1. 安装必要的软件

# 安装 ROS Noetic
sudo apt update
sudo apt install ros-noetic-desktop-full


# 安装依赖库
sudo apt install python3-pip
pip3 install tensorflow keras gym
pip3 install rospkg catkin_pkg


# 安装 Gazebo 仿真
sudo apt install ros-noetic-gazebo-ros

2. 创建工作空间

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make

3. 下载 TurtleBot3 仿真包

cd ~/catkin_ws/src
git clone https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git
cd ~/catkin_ws
catkin_make

4. 配置环境变量

echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
source ~/.bashrc

5. 启动 Gazebo 仿真环境

roslaunch turtlebot3_gazebo turtlebot3_world.launch

6. 启动强化学习节点

将强化学习代码放入 ROS 节点,并运行。

代码示例

1. 环境定义

import gym
from gym import spaces
import numpy as np


class TurtleBot3Env(gym.Env):
   def __init__(self):
       super(TurtleBot3Env, self).__init__()
       self.action_space = spaces.Discrete(5)  # 前进、左转、右转、停止等
       self.observation_space = spaces.Box(low=0, high=10, shape=(360,), dtype=np.float32)
       self.state = np.zeros(360)
       self.done = False


   def step(self, action):
       # 执行动作,获取激光雷达数据和奖励
       self.state = self.get_laser_scan()
       reward = self.calculate_reward()
       self.done = self.check_done()
       return self.state, reward, self.done, {}


   def reset(self):
       # 重置环境
       self.state = np.zeros(360)
       self.done = False
       return self.state


   def get_laser_scan(self):
       # 获取激光雷达数据的模拟函数
       return np.random.rand(360)


   def calculate_reward(self):
       # 定义奖励函数
       if min(self.state) < 0.2:  # 碰撞
           return -10
       else:
           return 1

2. 强化学习模型

import tensorflow as tf
from tensorflow.keras import models, layers


def build_model(input_dim, output_dim):
   model = models.Sequential([
       layers.Dense(256, activation='relu', input_dim=input_dim),
       layers.Dense(256, activation='relu'),
       layers.Dense(output_dim, activation='linear')
  ])
   model.compile(optimizer='adam', loss='mse')
   return model

3. 主循环

from collections import deque
import random


env = TurtleBot3Env()
model = build_model(360, 5)
target_model = build_model(360, 5)
target_model.set_weights(model.get_weights())


experience_replay = deque(maxlen=2000)
epsilon = 1.0
gamma = 0.99


for episode in range(1000):
   state = env.reset()
   total_reward = 0
   for t in range(200):
       if np.random.rand() < epsilon:
           action = np.random.choice(5)
       else:
           action = np.argmax(model.predict(state.reshape(1, -1)))


       next_state, reward, done, _ = env.step(action)
       experience_replay.append((state, action, reward, next_state, done))
       state = next_state
       total_reward += reward


       if len(experience_replay) > 64:
           batch = random.sample(experience_replay, 64)
           for s, a, r, s_next, d in batch:
               target = r + gamma * np.max(target_model.predict(s_next.reshape(1, -1))) * (1 - d)
               q_values = model.predict(s.reshape(1, -1))
               q_values[0][a] = target
               model.fit(s.reshape(1, -1), q_values, verbose=0)


       if done:
           break


   epsilon = max(0.1, epsilon * 0.995)
   target_model.set_weights(model.get_weights())
   print(f"Episode: {episode}, Reward: {total_reward}")

代码解读

环境部分:

TurtleBot3Env:定义了机器人与环境交互的逻辑,包括动作空间、状态空间以及奖励函数。

模型部分:

build_model:构建了一个三层神经网络,用于拟合 Q 函数。

训练部分:

主循环实现了 DQN 算法,包括 ε-贪婪策略、经验回放和目标网络更新。

运行效果说明

1. 训练过程

1.1 初始阶段:随机探索

行为观察:在初始阶段,由于模型的策略未经过训练,机器人采取随机动作,频繁碰撞障碍物,导航行为混乱。

累计奖励: 每个回合的累计奖励在 -50 到 50 之间波动。

运行结果:

航任务,通常在短时间内因碰撞障碍物而结束回合。

从激光雷达输出可以观察到多个雷达束的值接近 0,表示机器人靠近障碍物。

1.2 中期阶段:策略逐渐优化

行为观察:

随着回合增加,机器人开始学习避开障碍物的基本行为:

停止接近障碍物。

选择更宽敞的路径前进。

累计奖励:回合累计奖励显著提升,通常在 50 到 200 之间波动。

运行结果:

机器人能够完成部分导航任务,避障成功率约为 60%。

从路径轨迹可以看到机器人逐渐向目标点移动,尽管有时仍会选择次优路径。

1.3 收敛阶段:策略趋于最优

行为观察:经过约 800-1000 回合的训练,机器人学会了高效的避障和导航策略:

在狭窄通道中精准通过。

动态调整路径,避开移动障碍物。

累计奖励:每回合的累计奖励稳定在 200 到 300 之间,接近理论最优值。

运行结果:

机器人完成导航任务的成功率达到 95%。

从激光雷达数据和路径轨迹观察,机器人在动态环境中表现出高效决策能力。

2. 运行性能指标

2.1 导航效率

平均路径长度:

    初期阶段:路径长度平均为 30m(包括碰撞后重试的路径)。

    收敛后:路径长度优化至 20m,接近最短路径。

平均导航时间:

    初期阶段:平均耗时 60-80 秒。

    收敛后:平均耗时降至 20-30 秒。

2.2 避障成功率

    初期阶段:避障成功率仅 10%。

    中期阶段:避障成功率提升至 60%。

    收敛后:避障成功率稳定在 95%。

2.3 模型稳定性

强化学习模型收敛后,在多次运行中表现出稳定的决策能力。

在随机生成的动态环境中,机器人成功完成任务的概率超过 90%。

3. 环境交互细节

3.1 激光雷达反馈

激光雷达提供了 360° 的环境感知数据:

    初期阶段:雷达输出值频繁低于 0.2m,反映机器人多次靠近障碍物。

    收敛后:雷达数据保持在 0.5m以上,机器人始终保持安全距离。

3.2 动态障碍物

环境中添加动态障碍物后,机器人依然能够实时调整路径:

    遇到迎面而来的动态障碍物时,机器人主动减速并绕行。

    动态避障策略从经验回放中学习得来,表现与人类操作相似。

3.3 多目标点导航

在测试中添加多个目标点,机器人根据任务要求逐一前往:

    学会在多个目标点之间切换最优路径。

    在动态环境中有效避免路径规划错误。

4. 可视化结果

4.1 激光雷达图像

    图像显示机器人周围环境中障碍物的分布。

    随着训练进展,激光雷达图中碰撞点逐渐减少,显示机器人学会了避障行为。

4.2 路径规划轨迹

    初期阶段:轨迹曲折,机器人频繁撞击障碍物,路径不稳定。

    中期阶段:轨迹逐渐变得平滑,但有时会偏离最优路径。

    收敛阶段: 路径完全优化,轨迹平滑且接近直线,表示机器人找到最短路径。

4.3 奖励曲线

    初期阶段:奖励值波动剧烈,多为负值。

    收敛阶段:奖励值逐渐增加并稳定,表明策略学习趋于最优。

本文仅做学术分享,如有侵权,请联系删文。

e2be9c19039e3d03497b6f0118950827.jpeg

362d191c4997ef1f09655558b6af8c9a.jpeg

3D视觉交流群,成立啦!

目前我们已经建立了3D视觉方向多个社群,包括2D计算机视觉、最前沿、工业3D视觉、SLAM、自动驾驶、三维重建、无人机等方向,细分群包括:

工业3D视觉:相机标定、立体匹配、三维点云、结构光、机械臂抓取、缺陷检测、6D位姿估计、相位偏折术、Halcon、摄影测量、阵列相机、光度立体视觉等。

SLAM:视觉SLAM、激光SLAM、语义SLAM、滤波算法、多传感器融合、多传感器标定、动态SLAM、MOT SLAM、NeRF SLAM、机器人导航等。

自动驾驶:深度估计、Transformer、毫米波|激光雷达|视觉摄像头传感器、多传感器标定、多传感器融合、3D目标检测、路径规划、轨迹预测、3D点云分割、模型部署、车道线检测、Occupancy、目标跟踪等。

三维重建:3DGS、NeRF、多视图几何、OpenMVS、MVSNet、colmap、纹理贴图等

无人机:四旋翼建模、无人机飞控等

2D计算机视觉:图像分类/分割、目标/检测、医学影像、GAN、OCR、2D缺陷检测、遥感测绘、超分辨率、人脸检测、行为识别、模型量化剪枝、迁移学习、人体姿态估计等

最前沿:具身智能、大模型、Mamba、扩散模型、图像/视频生成等

除了这些,还有求职硬件选型视觉产品落地、产品、行业新闻等交流群

添加小助理: cv3d001,备注:研究方向+学校/公司+昵称(如3D点云+清华+小草莓), 拉你入群。

f90c9e9b3f4e259dcab69d1f5f81e204.jpeg
▲长按扫码添加助理:cv3d001
3D视觉工坊知识星球

「3D视觉从入门到精通」知识星球(点开有惊喜),已沉淀6年,星球内资料包括:秘制视频课程近20门(包括结构光三维重建、相机标定、SLAM、深度估计、3D目标检测、3DGS顶会带读课程、三维点云等)、项目对接3D视觉学习路线总结最新顶会论文&代码3D视觉行业最新模组3D视觉优质源码汇总书籍推荐编程基础&学习工具实战项目&作业求职招聘&面经&面试题等等。欢迎加入3D视觉从入门到精通知识星球,一起学习进步。

e0d6122e6305a100d1645786d80bdafc.jpeg

▲长按扫码加入星球
3D视觉工坊官网:www.3dcver.com

卡尔曼滤波、大模型、扩散模型、具身智能、3DGS、NeRF结构光、相位偏折术、机械臂抓取、点云实战、Open3D、缺陷检测、BEV感知、Occupancy、Transformer、模型部署、3D目标检测、深度估计、多传感器标定、规划与控制、无人机仿真C++、三维视觉python、dToF、相机标定、ROS2机器人控制规划、LeGo-LAOM、多模态融合SLAM、LOAM-SLAM、室内室外SLAM、VINS-Fusion、ORB-SLAM3、MVSNet三维重建、colmap、线面结构光、硬件结构光扫描仪等。

9f9890afac2106daed76b3c0eb49061d.jpeg
▲ 长按扫码学习3D视觉精品课程
3D视觉模组选型:www.3dcver.com

3ddf23d70d5feb6e193fd19efe3445bc.png

—  —

点这里👇关注我,记得标星哦~

一键三连「分享」、「点赞」和「在看」

3D视觉科技前沿进展日日相见 ~ 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐