飞机游戏六 空战环境 6.1 DBRML 6.1.5 动作空间设置

发布时间 2023-03-23 22:01:15作者: 英飞

飞机游戏六 空战环境 6.1 DBRML 6.1.5 动作空间设置

动作空间

1 连续动作空间

空间范围

 # 飞机的动作空间
        self.action_space = Box(
            low=np.array([
                0,  # 推力
                -1,  # Pitch 俯仰角
                -1,  # Roll 翻滚角
                -1,  # Yaw 偏航角
            ]),
            high=np.array([
                1,
                1,
                1,
                1,
            ]),
        )
    def sendAction(
            self,
            action
    ):
        """
        设置动作,只调节飞机的推力,和偏航控制

        :param action:
        :param actionType:
        :return:
        """
        df.set_plane_thrust(self.Plane_ID_ally, float(action[0]))
        df.set_plane_pitch(self.Plane_ID_ally, float(action[1]))
        df.set_plane_roll(self.Plane_ID_ally, float(action[2]))
        df.set_plane_yaw(self.Plane_ID_ally, float(action[3]))

2 离散动作库

空间范围

# 飞机的动作空间
        self.action_space = Discrete(5)

0 五种动作

为了简化动作空间,本文选取了5个空中作战的基本机动动作,分别为:爬升、俯冲、向左转弯、向右转弯和维持当前动作,分别用up、down、turnleft、turnright、stay表示,以此来构建离散的动作空间,则红方战机的动作空间表示为up down turn left turn right stay,同样地,蓝方战机的动作空间表示为up down turnleft turnright stay。

动作编号 动作名称 俯仰pitch 偏航yaw 滚转roll 推力 pitch
0 维持当前动作 0 0 0 1
1 爬升 -1 0 0 1
2 俯冲 1 0 0 1
3 向左转弯 0 1 0 1
4 向右转弯 0 -1 0 1

代码:

    def sendAction(
            self,
            action
    ):  # 设定动作 离散动作空间  动作编号 动作名称 控制量  俯仰 偏航 滚转 推力
        #0  维持当前动作  0 0  0 1
        #1  爬升 -1 0 0 1 
        #2 俯冲 1 0 0 1
        #3 向左转弯 0 1 0 1
        #4 向右转弯 0 -1 0 1
        if action == 0:
            df.set_plane_pitch(self.Plane_ID_ally_0, float(0))
            df.set_plane_yaw(self.Plane_ID_ally_0, float(0))
            df.set_plane_roll(self.Plane_ID_ally_0, float(0))
            df.set_plane_thrust(self.Plane_ID_ally_0, float(0))
        elif action == 1:
            df.set_plane_pitch(self.Plane_ID_ally_0, float(-1))
            df.set_plane_yaw(self.Plane_ID_ally_0, float(0))
            df.set_plane_roll(self.Plane_ID_ally_0, float(0))
            df.set_plane_thrust(self.Plane_ID_ally_0, float(1))
        elif action == 2:
            df.set_plane_pitch(self.Plane_ID_ally_0, float(1))
            df.set_plane_yaw(self.Plane_ID_ally_0, float(0))
            df.set_plane_roll(self.Plane_ID_ally_0, float(0))
            df.set_plane_thrust(self.Plane_ID_ally_0, float(1))
        elif action == 3:
            df.set_plane_pitch(self.Plane_ID_ally_0, float(0))
            df.set_plane_yaw(self.Plane_ID_ally_0, float(1))
            df.set_plane_roll(self.Plane_ID_ally_0, float(0))
            df.set_plane_thrust(self.Plane_ID_ally_0, float(1))
        elif action == 4:
            df.set_plane_pitch(self.Plane_ID_ally_0, float(0))
            df.set_plane_yaw(self.Plane_ID_ally_0, float(-1))
            df.set_plane_roll(self.Plane_ID_ally_0, float(0))
            df.set_plane_thrust(self.Plane_ID_ally_0, float(1))

1 七种基本动作

基于深度强化学习的无人机对战战术决策的研究

固定翼无人机可以选择的战术机动动作大致分为两个层面,第一个层面是空中机动战术动作,如高低强势回旋、筋斗、眼镜蛇、滚转等,另一个层面是由美国NASA提出的基本空战机动集合(Basic Fight Maneuvering,BFM),包括飞行器的定常飞行、减速飞行、加速飞行、左转弯、右转弯、向上拉起和向下俯冲。 本文主要研究的是如何提高无人机的自主格斗机动决策能力,无需考虑过于高级的战术策略,所以本文中选择基本空战机动动作作为UCAV可以选择的动作集。

image-20230323102608959

对于以上七种机动动作,我们选用无人机的切向过载,法向过载和滚转角来进行动作编码,即使用三元组[,,]x zN N来表示仿真中每个时刻下UCAV采取的动作。考虑无人机可承受的物理极限,切向过载的取值范围为[-2,2],法向过载的取值范围为[-5,5]。在实际每种机动动作中设定均采用最大过载,切向过载取值为-2,0或者2,法向过载选择为-5,1或5。滚转角取值为/3,0或者−/3。表3-1展示了七种不同的机动动作指令对应的编码方式。

image-20230323102643067

动作编号 动作名称 俯仰 偏航 滚转 推力
0 定常飞行 0 0 0 0.5
1 加速飞行 0 0 0 1
2 减速飞行 0 0 0 0
3 向左转弯 0 1 0 1
4 向右转弯 0 -1 0 1
5 向上拉起 -1 0 0 1
6 向下俯冲 1 0 0 1

2 15种基本动作

image-20230323204738387

机动动作库

动作编号 动作名称 俯仰pitch 偏航yaw 滚转roll 推力 pitch
a1 匀速向前
a2 加速向前
a3 减速向前
a4 水平左转
a5 倾侧左转
a6 减速左转
a7 水平右转
a8 倾侧右转
a9 减速右转
a10 匀速上升
a11 加速上升
a12 减速上升
a13 匀速下降
a14 加速下降
a15 减速下降

该机动动作库包含了前进、向左、向右、上升、下降五个机动方向以及匀速、减速、加速三个机动速度上的设定。