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
相关产品推荐
相关产品推荐

