You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Q-learning无人机高度控制:如何设计奖励函数使高度稳定在1?

问题描述

我正在开展基于OpenAI Gym和PyBullet无人机的Q-learning项目,目标是控制无人机高度,使其稳定维持在高度1的位置。当前采用离散动作0、1、2,分别对应设置无人机电机输出为[0 0 0 0]、[1 1 1 1]、[-1 -1 -1 -1]。

最初尝试设置奖励函数为reward = (1 - (next_state))**2,但发现奖励与无人机高度成反比,即无人机下降时奖励反而升高。未自定义奖励函数时,无人机稳定在高度1.5而非目标值1。

系统默认奖励函数如下:

def _computeReward(self):
    state = self._getDroneStateVector(0)
    ret = max(0, 2 - np.linalg.norm(self.TARGET_POS(state[0:3]))**4)
    return ret

我的get_action()函数如下:

def get_action(q_values, epsilon):        
    if random.random() > epsilon:
        act = np.argmax(q_values.numpy()[0])
        return act
    else:
        act = random.choice(np.arange(3))
        return act

训练循环代码如下:

for i in range(num_episodes):
    state = env.reset()
    state = state[0][0][2]   
    total_points = 0 

    for t in range(max_num_timesteps):
        state_qn = np.expand_dims(state, axis=0)  
        q_values = q_network(state_qn)

        action = utils.get_action(q_values, epsilon)  

        a = np.array([[-1, -1, -1, -1]])
        action = action + a
        action = action.reshape(1, -1)

        next_state, reward, done, info, _ = env.step(action)
        next_state = next_state[0][2]
        #reward = (1 - (next_state))**2

        memory_buffer.append(experience(state, action, reward, next_state, done))
        update = utils.check_update_conditions(t, NUM_STEPS_FOR_UPDATE, memory_buffer)

        if update:
            experiences = utils.get_experiences(memory_buffer)
            agent_learn(experiences, GAMMA)

        state = next_state.copy()
        total_points += reward

请问应设计何种奖励函数来修正该问题?或有其他解决办法?


解决方案

一、修正奖励函数设计

核心逻辑是让无人机越接近目标高度1,奖励越高;偏离越远,奖励越低甚至为负。

1. 基础反向平方误差奖励

将之前的公式取负,直接通过惩罚高度差引导无人机靠近目标:

reward = -abs(1 - next_state) ** 2

可加入奖励上限避免极端值干扰训练:

reward = max(-10, -abs(1 - next_state)**2)

2. 分段式奖励(强化稳定行为)

针对目标区域设置额外正向奖励,强化无人机的稳定停留行为:

target_height = 1
height_diff = abs(next_state - target_height)
if height_diff < 0.1:
    reward = 2  # 稳定在目标范围内的奖励
else:
    reward = -height_diff ** 2  # 偏离目标的惩罚

3. 结合高度变化的奖励(抑制震荡)

加入高度变化率的惩罚,避免无人机频繁上下波动:

target_height = 1
height_diff = abs(next_state - target_height)
delta_height = abs(next_state - state)  # 当前步与上一步的高度差
reward = -height_diff ** 2 - 0.1 * delta_height

二、其他优化方向

1. 调整动作幅值

当前动作的电机输出幅值可能过大,导致无人机难以稳定。可修改动作映射:

  • 动作0:[0,0,0,0](保持不变)
  • 动作1:[0.7,0.7,0.7,0.7](降低上升动力)
  • 动作2:[-0.4,-0.4,-0.4,-0.4](降低下降动力)

2. 丰富状态输入

当前仅传入高度作为状态,可加入高度变化率(垂直速度),让Q网络感知无人机的上升/下降趋势,提升动作选择的精准度。

3. 修改默认奖励函数的目标位置

默认奖励函数中的self.TARGET_POS是预设目标,直接将其修改为[0,0,1],即可让默认奖励引导无人机向高度1靠拢。

4. 调优训练参数

  • 逐步降低epsilon值,后期减少随机探索,加快模型收敛;
  • 调整GAMMA值至0.9~0.95,平衡短期即时奖励与长期稳定奖励;
  • 调整NUM_STEPS_FOR_UPDATE,保证每次更新有足够的样本量。

内容的提问来源于stack exchange,提问作者gulb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 01:20:27