ROS下的移动机器人路径规划算法,使用的是 强化学习算法 DQN DDPG SAC TD3等

最近研究移动机器人的小伙伴肯定绕不开路径规划这个话题。在ROS生态里搞强化学习就像在乐高积木上装火箭发动机——既灵活又带劲。今天咱们不聊传统A*、RRT这些老伙计,重点掰扯掰扯怎么用DDPG、SAC这些时髦算法让机器人自己学会"认路"。

先看个真实场景:TurtleBot在Gazebo迷宫里瞎转悠,激光雷达数据乱飘,这时候传统的路径规划算法可能得现场算个半死。但要是用上强化学习,这货能自己琢磨出怎么绕开障碍物直奔目标。咱们拿DDPG举个栗子,毕竟这算法处理连续动作空间贼合适:

class DDPGAgent:
    def __init__(self, state_dim, action_dim):
        self.actor = ActorNetwork(state_dim, action_dim)  # 决策网络
        self.critic = CriticNetwork(state_dim, action_dim) # 价值评估 
        self.target_actor = copy.deepcopy(self.actor)      # 目标网络
        self.memory = deque(maxlen=100000)                 # 经验池

    def act(self, state, noise=0.1):
        action = self.actor(tf.constant([state]))[0]
        return np.clip(action + np.random.normal(0, noise), -1, 1)  # 加点探索噪声

    def update(self):
        batch = random.sample(self.memory, 32)
        states, actions, rewards, next_states, dones = map(np.array, zip(*batch))
        
        # Critic网络更新(关键在时序差分误差)
        with tf.GradientTape() as tape:
            target_actions = self.target_actor(next_states)
            target_q = rewards + 0.99 * (1 - dones) * self.target_critic([next_states, target_actions])
            current_q = self.critic([states, actions])
            critic_loss = tf.reduce_mean(tf.square(target_q - current_q))
        critic_grad = tape.gradient(critic_loss, self.critic.trainable_variables)
        self.critic.optimizer.apply_gradients(zip(critic_grad, self.critic.trainable_variables))
        
        # 此处省略Actor更新部分...(总不能把代码全贴出来吧)

这里有个骚操作要注意:激光雷达数据最好做归一化处理,不然距离数值可能从0.1米到10米跨度太大,网络容易抽风。动作空间通常设成[-1,1]区间,对应线速度和角速度,比如:

# 动作到实际速度的映射
linear_speed = action[0] * MAX_SPEED
angular_speed = action[1] * MAX_TURN

奖励函数设计是门玄学,个人经验是别让机器人活得太舒服。比如这样设定:

  • 到达目标:+1000
  • 撞墙:-500
  • 每一步时间惩罚:-1
  • 朝向目标的角度差惩罚:-5*|θ|

但实际调参时可能得把距离衰减做进去,比如每靠近目标1米给+10分,这样比单纯终点给大分更有效。

说到SAC(软演员-评论家)算法,这货自带熵正则化,特别适合路径规划这种需要探索的场景。和DDPG最大的区别在于策略网络会主动增加随机性:

class SACAgent:
    def __init__(self, state_dim, action_dim):
        self.policy = StochasticActor(state_dim, action_dim)  # 输出均值和方差!
        self.q_net1 = QNetwork(state_dim, action_dim)
        self.q_net2 = QNetwork(state_dim, action_dim)  # 双Q网络防过估计
        
    def act(self, state):
        mean, log_std = self.policy(state)
        std = tf.exp(log_std)
        action = mean + tf.random.normal(tf.shape(mean)) * std
        return tf.tanh(action)  # 压缩到[-1,1]

训练时发现个坑:Gazebo仿真速度跟不上算法更新频率。这时候得用ROS的多线程回调,把传感器数据采集和模型推理放在不同线程,必要时还要做数据插值。另外记得用rosbag录数据,方便复现诡异bug。

最后给个实战建议:先用TD3算法快速验证(这算法比DDPG稳定),等效果稳定了再换SAC追求更好性能。实测在静态环境中,DDPG训练2万步能收敛,但在动态障碍物场景下,SAC的探索能力能快20%左右。别信论文里的完美曲线,真实训练时loss震荡得像心电图才是常态——只要整体趋势向下就偷笑吧。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐