# kaiwu-comp-2026-juesai
**Repository Path**: script2000/kaiwu-comp-2026-juesai
## Basic Information
- **Project Name**: kaiwu-comp-2026-juesai
- **Description**: 决赛,无人机
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-05-09
- **Last Updated**: 2026-05-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## clone repo
```sh
git clone https://gitee.com/script2000/kaiwu-comp-2026-juesai.git --filter=blob:none drone_obstacle_nav
```
## 任务目标
控制一架 Crazyflie 四旋翼无人机,从封闭空间一端的起点出发,自主避开随机生成的柱状障碍物群,途中收集路径上的途径点,到达另一端终点并稳定悬停。
任务由导航阶段和悬停阶段两段组成:
- 导航阶段:无人机从起点出发,避开障碍物、通过可选途径点,到达终点区域。
- 悬停阶段:进入终点区域后,连续悬停指定步数并保持位置精度。
## 环境介绍
基于 NVIDIA Isaac Sim(OmniDrones)构建的无人机三维飞行仿真环境。被控对象为与 Crazyflie 2.1 物理参数对齐的四旋翼无人机模型,采用 PIDrate(CTBR:Collective Thrust + Body Rate)控制模式。
| 参数 |
说明 |
| 仿真平台 |
NVIDIA Isaac Sim + OmniDrones |
| 机型 |
四旋翼(对齐 Crazyflie 物理参数) |
| 控制模式 |
CTBR 角速率指令 → PIDRateController → 电机推力 |
| 动作空间 |
4 维连续 [-1, 1](roll/pitch/yaw 角速度 + 推力比) |
| 观测空间 |
95 维 float32(全局观测) |
| 仿真步长 |
dt = 0.02s |
## 地图
封闭长方体空间(5m × 5m × 3m),四面墙壁 + 天花板 + 地面,无人机不得飞出边界。
起点:空间一端固定位置
终点:空间另一端固定位置
初始姿态:yaw = 0°(朝向 +x 方向,即终点方向),零速度悬停起飞
## 元素介绍
| 元素 |
说明 |
| 无人机 |
四旋翼飞行器(对齐 Crazyflie 物理参数),质量约 27g,动作空间为 4 维连续 CTBR 指令(3 维角速度 + 1 维推力比) |
| 障碍物 |
从地面延伸至天花板的圆柱体,随机数量(2~5)和随机半径(离散 5 档:0.15~0.35m),位置随机生成 |
| 起点 |
空间一端固定位置 [0.5, 2.5, 0.15],无人机初始放置于此 |
| 终点 |
空间另一端固定位置 [4.5, 2.5, 1.5](虚拟点,无物理实体),到达判定半径 0.2m |
| 途径点 |
空间中虚拟点(无物理实体),可选加分项,随机数量(0~5),触达判定半径 0.2m |
## 计分规则
### 评分公式
每个任务的评分由导航分、悬停分和 途径分三个子项相加,满分 100 分。
总分 = nav_score + hover_score + wp_score
### 子分计算
nav_score(导航分)
```
nav_score = nav_coeff × w_nav × (0.5 × time_norm + 0.5 × smooth_norm) × 100
```
- nav_coeff:计分资格标记,到达终点区域为 1,否则为 0
- w_nav = 0.25:导航分权重
- time_norm:导航时间归一化子项,越快越高
- smooth_norm:飞行平滑度归一化子项,越平稳越高
hover_score(悬停分)
```
hover_score = nav_coeff × hover_coeff × w_hover × clamp(1 - avg_position_error / 0.5, 0, 1) × 100
```
- nav_coeff:计分资格标记,到达终点区域为 1,否则为 0
- hover_coeff:悬停计分标记,成功完成悬停为 1,否则为 0
- w_hover = 0.35:悬停分权重
- avg_position_error:悬停期间的平均位置偏移
wp_score(途径点分)
```
wp_score = nav_coeff × w_wp × (visited_count / total_waypoints) × 100
```
- nav_coeff:计分资格标记,到达终点区域为 1,否则为 0
- w_wp = 0.40:途径点分权重
- visited_count:已收集的 Waypoint 数
- total_waypoints:当局总 Waypoint 数
任务失败
以下情况 episode 立即终止,总分 = 0:
- 无人机飞出封闭空间边界
- 碰撞次数达到 max_collisions(测评锁定为 1)
## 环境配置
在智能体和环境的交互中,首先会调用env.reset方法,该方法接受一个usr_conf参数,这个参数通过读取train_env_conf.toml文件的内容来实现定制化的环境配置。因此,用户可以通过修改train_env_conf.toml文件中的内容来调整环境配置。
```
# usr_conf为用户传入的环境配置
env_obs = env.reset(usr_conf=usr_conf)
```
train_env_conf.toml中包含以下配置信息:
### 关键参数说明
| 配置项 |
类型 |
默认值 |
取值范围 |
说明 |
num_envs |
int |
2048 |
> 0 |
并行环境数量(Isaac Sim GPU 并行仿真实例数) |
num_obstacles_range |
int[2] |
[2, 5] |
min ≥ 2, max ≤ 5 |
每局障碍物数量采样范围 |
radius_choices |
float[] |
[0.15, 0.20, 0.25, 0.30, 0.35] |
预定义离散值的非空子集 |
障碍物半径离散档位(米),同一 episode 内所有障碍物共用 |
nav_max_steps |
int |
1500 |
[100, 3000] |
导航阶段最大步数,超过未到达终点判定超时(测评使用 1500) |
hover_max_steps |
int |
150 |
[50, 500] |
悬停阶段固定步数 |
max_collisions |
int |
5 |
[1, 5] |
碰撞上限,达到则 episode 终止(测评锁定为 1) |
num_waypoints_range |
int[2] |
[0, 5] |
min ≥ 0, max ≤ 5 |
每局 Waypoint 数量采样范围,设为 0 可退化为纯导航+悬停训练 |
### 奖励配置说明
奖励实现归属 agent_ppo/feature/reward_process.py,每个 [rewards.] 段对应一个 _reward_() 方法。weight 用于控制该项是否参与最终求和以及参与强度(设为 0.0 可禁用某项)。
| 奖励项 |
类别 |
说明 |
target_progress |
导航 |
当前导航目标距离进展奖励:有未访问 waypoint 时跟踪 waypoint,清空后跟踪终点 |
goal_reached |
导航 |
首次到达终点并切入悬停阶段的一次性奖励;仅在 waypoint 已全部完成时生效(默认 100.0) |
in_arena |
安全 |
场内存活奖励 / 出界惩罚(默认出界 -100.0) |
obstacle_proximity |
安全 |
接近障碍安全距离阈值时的惩罚(默认单步 -2.0) |
collision |
安全 |
发生碰撞接触时的惩罚(默认单步 -20.0) |
stall |
导航 |
目标距离无进展时的停滞惩罚(默认 -0.1) |
waypoint_visit |
路径点 |
基于“新增已访问 waypoint 数量”增量的路径点访问奖励(可配置时间衰减,每个 waypoint 仅奖励一次) |
hover_stability |
悬停 |
悬停阶段鼓励低位置误差与低速度;离开终点区域与高速漂移会额外扣分 |
action_smoothness |
控制 |
惩罚动作一阶/二阶误差,提升飞行平滑度 |
energy_efficiency |
控制 |
惩罚控制能耗,鼓励低能耗轨迹 |
hover_precision |
悬停 |
悬停阶段按位置误差精度给出正向奖励 |
collision_exceeded |
终止 |
碰撞超限时的额外终止惩罚 |
timeout |
终止 |
导航超时时的额外终止惩罚 |
>💡 补充说明:
> train_env_conf.toml文件中的配置仅在训练时生效,请按上表数据描述进行配置。若配置错误,训练任务会变为"失败"状态,此时可以通过查看env模块的错误日志进行排查。
> 若需调整模型评估任务时的配置,用户需要通过腾讯开悟平台创建评估任务并完成环境配置,详细参数见智能体模型评估模式。
> baseline 默认已提供导航、安全、路径点、悬停与终止相关的多项奖励。用户仍可按需继续扩展,在 reward_process.py 中新增 _reward_() 方法,并在 toml 中追加对应 [rewards.] 段启用。
### 环境信息
| 数据名 |
数据类型 |
数据描述 |
frame_no |
int |
当前环境实例运行时的帧号 |
observation |
Observation |
环境实例的观测信息(95维 float32 张量) |
terminated |
int |
当前环境实例是否结束(出界/碰撞超限/悬停完成) |
truncated |
int |
当前环境实例是否异常或中断 |
extra_info |
ExtraInfo |
环境实例的可选额外信息 |
### 观测信息(observation)
观测为 95 维 float32 张量,shape [num_envs, 1, 95],包含无人机自身状态、障碍物信息、目标点信息和时间编码:
| 字段名 |
索引 |
类型 |
说明 |
target_rpos |
[0:3] |
float32[3] |
终点相对位置(基于加噪位置计算) |
obstacle_rpos |
[3:27] |
float32[8×3] |
8 个障碍物相对位置展平,未激活槽位全 0 |
linear_velocity |
[27:30] |
float32[3] |
机体线速度 |
angular_velocity |
[30:33] |
float32[3] |
机体角速度 |
rotation_matrix |
[33:42] |
float32[9] |
旋转矩阵展平(3×3),取值 [-1, 1] |
hover_timer |
[42:43] |
float32[1] |
悬停阶段累计时长(秒),导航阶段为 0 |
obstacle_radii |
[43:51] |
float32[8] |
8 个障碍物半径,未激活为 0 |
start_rpos |
[51:54] |
float32[3] |
起点相对位置 |
goal_rpos |
[54:57] |
float32[3] |
终点相对位置 |
phase_onehot |
[57:59] |
float32[2] |
导航/悬停阶段 one-hot([1,0]=导航,[0,1]=悬停) |
waypoint_rpos |
[59:83] |
float32[8×3] |
8 个 Waypoint 相对位置展平 |
waypoint_visited |
[83:91] |
float32[8] |
0=待访问,1=已访问或槽位未启用 |
time_encoding |
[91:95] |
float32[4] |
归一化进度编码 |
> 注意:target_rpos 与 goal_rpos 当前实现相同,均为终点相对位置。若需要"当前最近途径点"信息,请在 agent 侧自行根据 waypoint_rpos 和 waypoint_visited 计算。
## 得分信息
score_info 是在当前状态下执行动作 action 所获得的分数,分数的计算详见[计分规则](#计分规则)。
> 注意:得分用于衡量模型在环境中的表现,也作为衡量强化学习训练产出模型的评价指标,与强化学习里的奖励reward 要区别开。
### 额外信息(extra_info)
| 字段名 |
类型 |
说明 |
result_code |
int |
0=正常;-1=reset异常;-2=step异常 |
result_message |
str |
错误详情或 "OK" |
stats |
dict[str, np.ndarray] |
环境监控与评分字段(key 集合固定,每个 value shape 为 [N, 1]) |
stats 关键字段:
| 字段名 |
类型 |
说明 |
success |
np.ndarray[N,1] |
最终是否完成任务 |
timeout |
np.ndarray[N,1] |
是否导航超时 |
collision_exceeded |
np.ndarray[N,1] |
是否碰撞超限 |
arrival_success |
np.ndarray[N,1] |
是否进入过终点区域 |
hover_success |
np.ndarray[N,1] |
是否完成悬停 |
hover_failed |
np.ndarray[N,1] |
是否悬停阶段失败 |
total_score |
np.ndarray[N,1] |
最终比赛总分 |
nav_coeff |
np.ndarray[N,1] |
导航计分资格标记 |
hover_coeff |
np.ndarray[N,1] |
悬停计分标记 |
nav_score_raw |
np.ndarray[N,1] |
导航归一化子分 |
hover_score_raw |
np.ndarray[N,1] |
悬停归一化子分 |
wp_score_raw |
np.ndarray[N,1] |
Waypoint 归一化子分 |
time_norm |
np.ndarray[N,1] |
导航时间归一化子项 |
smooth_norm |
np.ndarray[N,1] |
平滑度归一化子项 |
waypoints_visited |
np.ndarray[N,1] |
已访问 Waypoint 数 |
waypoints_total |
np.ndarray[N,1] |
总 Waypoint 数 |
collision_count |
np.ndarray[N,1] |
累计碰撞次数 |
hover_precision |
np.ndarray[N,1] |
最终悬停精度 |
## 动作空间
动作为 4 维连续向量。底层控制模式为 PIDrate(CTBR:Collective Thrust + Body Rate):策略网络输出经 tanh 压缩到 [-1, 1] 后,送入 PID 速率控制器转换为电机推力指令。
| 维度 |
策略归一化范围 |
物理含义 |
底层映射 |
action[0] |
[-1, 1] |
目标 roll 角速度 |
线性映射到 [-180°/s, +180°/s] |
action[1] |
[-1, 1] |
目标 pitch 角速度 |
线性映射到 [-180°/s, +180°/s] |
action[2] |
[-1, 1] |
目标 yaw 角速度 |
线性映射到 [-180°/s, +180°/s] |
action[3] |
[-1, 1] |
目标推力比 |
重映射为 (x+1)/2 并 clamp 到 [0.0, 1.0] |
### 合法动作
本任务为连续动作空间,不存在离散合法动作过滤。所有 4 维动作值均有效,经 tanh 激活后天然约束在 [-1, 1] 范围内。
### 时间信息
步(step)和帧(frame)存在一定映射关系。
步是强化学习环境中的一个时间单位,表示智能体(agent)在环境中执行一个动作并接收反馈的过程。在每一步中,智能体选择一个动作,环境根据该动作更新状态,并返回新的状态、奖励和终止信号。
帧是场景的一个时间单位,表示场景的一个完整更新周期。在每一帧中,场景的所有元素都会根据当前的状态和输入进行更新。
本任务中每一步对应一帧,即 step : frame = 1 : 1。episode 实际最大总步数 = nav_max_steps + hover_max_steps(默认 1500 + 150 = 1650 步)。