惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
博客园 - 司徒正美
A
About on SuperTechFans
Vercel News
Vercel News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
爱范儿
爱范儿
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
F
Fortinet All Blogs
S
SegmentFault 最新的问题
阮一峰的网络日志
阮一峰的网络日志
D
Docker
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
M
MIT News - Artificial intelligence
Jina AI
Jina AI
H
Help Net Security
量子位
IT之家
IT之家

博客园 - Angry_Panda

军事防务 —— 城市反无 —— 无线电侦测设备需要进行攻击目标分配吗?无线电侦测设备的调度在应用中是需要在部署时进行考虑还是在攻击时进行考虑 从一张AI合成的无人机救援图说起 —— 多人机协作的可行性 985大学不相信眼泪,信奉丛林法则;211大学更讲人情味 军事防务 —— 反无激光武器攻后的冷却和充能时间与其攻击的持续时长是否有关系 军事防务 —— 北京顺义李桥镇 (AI大模型生成答案)—— 反无激光武器攻后的冷却和充能时间与其攻击的持续时长是否有关系 军事防务:激光武器的参数 武器装备参数介绍 军事防务:城市反无 —— 无线电干扰设备的攻击范围 百家讲坛 —— 再度翻红 —— 长大后才发现最好的教育早已播下种子,只等阅历浇灌才真正发芽 军事防务 —— AFSim雷达传感器仿真技术 防务 —— 军事建模AFSIM —— 电磁波 为什么倒卖 军火最赚钱 —— 从防务公司的业务发展来看待军费问题 防务:防务业务 —— 武器开火后的返回结果 —— 武器结果:0=开火, 1=命中, 2=未命中 豆包AI回答 —— 为什么城市反无场景下无线电干扰设备即使击中目标也会一直攻击呢 防务:雷达和光电探测设备 —— 无人机的轨迹信息与真实位置信息的差异性,是根据随机函数来实现的吗,比如在真实位置上加一点的随机扰动吗 —— AFsim的手册 北京市顺义区李桥镇 —— 中科星图公司 —— 出行路线交通 —— “东方通勤车”(误区,“东方通勤车”的站点根本就找不到,如果不坐地铁,那么就坐850号公交) 北京市顺义区李桥镇(首都机场附件)—— 中科星图(星图防务) 公司宿舍 【转载】cessium python部署离线版本 ———— 如何使用Python操作三维地图 cessium —— cessium python部署离线版本 如何使用uv安装pytorch 基于GA-BP神经网络的防空导弹实时目标分配方法 【人生哲理】【视频】为什么说该花的钱不花,就会变成灾难呢? 随身移动WiFi ——50元级别的(三网 4G移动网络)—— 网速测试 豆包AI —— 为什么不把离散的状态空间属性用one-shot方式编码而是直接归一化为0到1范围的属性值 为ubuntu系统安装samba网络磁盘,实现局域网中的共享网络磁盘 —— 跨系统文件共享的完整方案 sudo fwupdmgr get-upgrades —— 在 Linux 系统中,用 fwupd 工具查看当前机器所有可升级固件(BIOS/UEFI、SSD、雷电、外设等) git免密认证同步仓库代码报错——git@github.com: Permission denied (publickey) —— 所需的ssh-add加载加密私钥 —— 指定加密私钥存储位置 【转载】 执行 ssh-add 报错 Could not open a connection to your authentication agent —— git免密认证同步仓库代码,所需的ssh-add加载加密私钥 uv python环境管理工具 ubuntu系统python安装pycairo报错:Run-time dependency python found: NO (tried pkgconfig and sysconfig) 无人机 —— dogfight —— 经纬度与笛卡尔坐标系的相互转换、方位角的计算
dogfight问题中(UAV 无人机空战——狗斗)—— 状态空间设计
Angry_Panda · 2026-06-27 · via 博客园 - Angry_Panda

image

  1. 完整状态空间定义(Python)

import numpy as np
from gymnasium import spaces

class AirCombatStateSpace:
    def __init__(self):
        # --------------------------
        # 状态项索引(对应表1序号)
        # --------------------------
        self.state_dim = 20
        
        # 1. 对方飞机距离/km: 0~150 → 归一化到 [0,1]
        # 2. 对方飞机方位角/°: -180~180 → 归一化到 [-1,1]
        # 3. 对方飞机俯仰角/°: -90~90 → 归一化到 [-1,1]
        # 4. 对方雷达状态: 关机/扫描/跟踪 → 离散 0/1/2
        # 5. 对方剩余武器数量: 0~6 → 归一化到 [0,1]
        # 6. 对方武器状态: 未发射/在飞 → 离散 0/1
        # 7. 对方武器方位角/°: -180~180 → 归一化到 [-1,1]
        # 8. 对方武器俯仰角/°: -90~90 → 归一化到 [-1,1]
        # 9. 我方飞机速度/(m·s⁻¹): 300~600 → 归一化到 [0,1]
        # 10. 我方飞机航向角/°: -180~180 → 归一化到 [-1,1]
        # 11. 我方飞机俯仰角/°: -90~90 → 归一化到 [-1,1]
        # 12. 我方飞机滚转角/°: -180~180 → 归一化到 [-1,1]
        # 13. 我方剩余油量/kg: 0~4500 → 归一化到 [0,1]
        # 14. 我方雷达状态: 关机/扫描/跟踪 → 离散 0/1/2
        # 15. 我方雷达已失跟时间/s: 0~150 → 归一化到 [0,1]
        # 16. 我方雷达已开机时间/s: 0~10 → 归一化到 [0,1]
        # 17. 我方雷达已关机时间/s: 0~10 → 归一化到 [0,1]
        # 18. 干扰已持续时间/s: 0~10 → 归一化到 [0,1]
        # 19. 我方剩余武器数量: 0~6 → 归一化到 [0,1]
        # 20. 我方武器状态: 未发射/在飞 → 离散 0/1

        # --------------------------
        # 状态空间(连续 + 离散 统一为 Box 空间)
        # --------------------------
        # 为了兼容大部分 RL 框架,这里把所有状态都转为连续 [-1,1] 或 [0,1]
        # 也可以用 spaces.Dict 或 spaces.Tuple 处理混合空间
        self.observation_space = spaces.Box(
            low=-1.0,
            high=1.0,
            shape=(self.state_dim,),
            dtype=np.float32
        )

    def normalize_state(self, raw_state):
        """
        将原始状态(20维)归一化到 [-1,1] / [0,1] 范围
        输入: raw_state: list/array, 长度 20,对应表1各项原始值
        输出: normalized_state: np.array, shape=(20,), 范围 [-1,1]
        """
        s = np.array(raw_state, dtype=np.float32)
        normalized = np.zeros_like(s)

        # 1. 对方飞机距离 0~150 km → [0,1]
        normalized[0] = np.clip(s[0] / 150.0, 0.0, 1.0)

        # 2. 对方飞机方位角 -180~180° → [-1,1]
        normalized[1] = np.clip(s[1] / 180.0, -1.0, 1.0)

        # 3. 对方飞机俯仰角 -90~90° → [-1,1]
        normalized[2] = np.clip(s[2] / 90.0, -1.0, 1.0)

        # 4. 对方雷达状态(0:关机,1:扫描,2:跟踪)→ [0,1]
        normalized[3] = np.clip(s[3] / 2.0, 0.0, 1.0)

        # 5. 对方剩余武器数量 0~6 → [0,1]
        normalized[4] = np.clip(s[4] / 6.0, 0.0, 1.0)

        # 6. 对方武器状态(0:未发射,1:在飞)→ [0,1]
        normalized[5] = np.clip(s[5], 0.0, 1.0)

        # 7. 对方武器方位角 -180~180° → [-1,1]
        normalized[6] = np.clip(s[6] / 180.0, -1.0, 1.0)

        # 8. 对方武器俯仰角 -90~90° → [-1,1]
        normalized[7] = np.clip(s[7] / 90.0, -1.0, 1.0)

        # 9. 我方飞机速度 300~600 m/s → [0,1]
        normalized[8] = np.clip((s[8] - 300.0) / 300.0, 0.0, 1.0)

        # 10. 我方飞机航向角 -180~180° → [-1,1]
        normalized[9] = np.clip(s[9] / 180.0, -1.0, 1.0)

        # 11. 我方飞机俯仰角 -90~90° → [-1,1]
        normalized[10] = np.clip(s[10] / 90.0, -1.0, 1.0)

        # 12. 我方飞机滚转角 -180~180° → [-1,1]
        normalized[11] = np.clip(s[11] / 180.0, -1.0, 1.0)

        # 13. 我方剩余油量 0~4500 kg → [0,1]
        normalized[12] = np.clip(s[12] / 4500.0, 0.0, 1.0)

        # 14. 我方雷达状态(0:关机,1:扫描,2:跟踪)→ [0,1]
        normalized[13] = np.clip(s[13] / 2.0, 0.0, 1.0)

        # 15. 我方雷达已失跟时间 0~150 s → [0,1]
        normalized[14] = np.clip(s[14] / 150.0, 0.0, 1.0)

        # 16. 我方雷达已开机时间 0~10 s → [0,1]
        normalized[15] = np.clip(s[15] / 10.0, 0.0, 1.0)

        # 17. 我方雷达已关机时间 0~10 s → [0,1]
        normalized[16] = np.clip(s[16] / 10.0, 0.0, 1.0)

        # 18. 干扰已持续时间 0~10 s → [0,1]
        normalized[17] = np.clip(s[17] / 10.0, 0.0, 1.0)

        # 19. 我方剩余武器数量 0~6 → [0,1]
        normalized[18] = np.clip(s[18] / 6.0, 0.0, 1.0)

        # 20. 我方武器状态(0:未发射,1:在飞)→ [0,1]
        normalized[19] = np.clip(s[19], 0.0, 1.0)

        return normalized.astype(np.float32)

    def denormalize_state(self, normalized_state):
        """
        将归一化的状态 [-1,1]/[0,1] 转回原始范围(可选,用于调试/可视化)
        """
        s = np.array(normalized_state, dtype=np.float32)
        raw = np.zeros_like(s)

        raw[0] = s[0] * 150.0
        raw[1] = s[1] * 180.0
        raw[2] = s[2] * 90.0
        raw[3] = s[3] * 2.0
        raw[4] = s[4] * 6.0
        raw[5] = s[5]
        raw[6] = s[6] * 180.0
        raw[7] = s[7] * 90.0
        raw[8] = s[8] * 300.0 + 300.0
        raw[9] = s[9] * 180.0
        raw[10] = s[10] * 90.0
        raw[11] = s[11] * 180.0
        raw[12] = s[12] * 4500.0
        raw[13] = s[13] * 2.0
        raw[14] = s[14] * 150.0
        raw[15] = s[15] * 10.0
        raw[16] = s[16] * 10.0
        raw[17] = s[17] * 10.0
        raw[18] = s[18] * 6.0
        raw[19] = s[19]

        return raw
  1. 使用示例(在自定义 Gym 环境中)

from gymnasium import Env

class AirCombatEnv(Env):
    def __init__(self):
        super().__init__()
        self.state_helper = AirCombatStateSpace()
        self.observation_space = self.state_helper.observation_space
        # 动作空间可根据你的控制量自行定义
        self.action_space = spaces.Discrete(...)  # 或 spaces.Box(...)

    def _get_observation(self):
        # 假设从仿真中读取原始状态 raw_state (长度20)
        raw_state = self._read_raw_state_from_simulation()
        # 归一化后返回给 RL 算法
        obs = self.state_helper.normalize_state(raw_state)
        return obs

    def _read_raw_state_from_simulation(self):
        # 这里替换为你实际读取仿真数据的代码
        return np.zeros(20)

image

本博客是博主个人学习时的一些记录,不保证是为原创,个别文章加入了转载的源地址,还有个别文章是汇总网上多份资料所成,在这之中也必有疏漏未加标注处,如有侵权请与博主联系。 如果未特殊标注则为原创,遵循 CC 4.0 BY-SA 版权协议。