仿真案例#
本页提供两个面向首次使用者的可复现实验。建议先完成异构载具实验,熟悉 settings.json 和 Python API,再进行 ns-3 网络实验。
| 实验 | 重点 | 环境 | 预计时间 |
|---|---|---|---|
| 实验一:无人机、汽车与船 | AirGround、载具配置、RPC 端口、Python API |
Windows + UE 4.27 | 约 10 分钟 |
| 实验二:LAESim 与 ns-3 | ROS 里程计、节点映射、范围内交付、范围外丢包 | Windows + WSL2 + ROS + ns-3 | 约 15 分钟 |
完整示例统一维护在 Examples/quickstart,包含可直接复制的配置、运行脚本、预期结果和排查步骤。
实验一:无人机、汽车与船异构仿真#
目标#
在同一个 AirGround 场景中创建 UAV、Car、Boat,使用各自的 RPC 端口同时发送控制并读取状态。该实验不需要 ROS 或 ns-3。
核心配置如下,完整文件见 heterogeneous_fleet/settings.json:
{
"SimMode": "AirGround",
"ApiServerPortCar": 41461,
"ApiServerPortMultirotor": 41471,
"ApiServerPortBoat": 41481,
"Vehicles": {
"UAV": { "VehicleType": "SimpleFlight", "X": 0, "Y": 0, "Z": 0 },
"Car": { "VehicleType": "PhysXCar", "X": 0, "Y": -8, "Z": 0 },
"Boat": { "VehicleType": "SimpleBoat", "X": 0, "Y": 8, "Z": 0 }
}
}
Vehicles 下的键是 API 使用的实例名;VehicleType 选择动力学和控制接口;X/Y/Z 是相对于场景原点的出生位置。Boat 使用简化平面三自由度模型,不要求场景具有真实水体。
运行#
在仓库根目录打开 PowerShell,将实验配置复制为当前 AirSim 配置:
$AirSimDir = Join-Path ([Environment]::GetFolderPath('MyDocuments')) 'AirSim'
New-Item -ItemType Directory -Force $AirSimDir | Out-Null
$Settings = Join-Path $AirSimDir 'settings.json'
if (Test-Path $Settings) { Copy-Item $Settings "$Settings.backup" -Force }
Copy-Item .\Examples\quickstart\heterogeneous_fleet\settings.json $Settings -Force
py -3 -m pip install msgpack-rpc-python numpy opencv-contrib-python
先检查配置,无需启动 UE:
py -3 .\Examples\quickstart\heterogeneous_fleet\run_experiment.py --check-only
看到 configuration check passed 后,在 UE 4.27 中打开 LAESim 场景并点击 Play,然后运行:
py -3 .\Examples\quickstart\heterogeneous_fleet\run_experiment.py
脚本调用的关键 API 是:
uav.takeoffAsync(vehicle_name="UAV").join()
uav.moveByVelocityAsync(2, 0, 0, duration, vehicle_name="UAV")
car.setCarControls(airsim.CarControls(throttle=0.55), "Car")
boat.setBoatControls(airsim.BoatControls(throttle=0.70), "Boat")
运行约 8 秒后,脚本停止汽车和船并让无人机降落。终端应持续显示无人机局部 NED 坐标、汽车速度、船的纵向/横向速度。
完整步骤和练习见实验一 README,完整代码见 run_experiment.py。
实验二:LAESim 节点与 ns-3 通信范围#
目标#
将 settings.json 中的 UAV 和 Car 自动映射为同名 ns-3 节点,通过 ROS 网络桥接器发送消息,并分别复现通信范围内全部交付和范围外全部丢包。
LAESim odom_local_ned + settings X/Y/Z
↓
ROS 网络桥接器
↓ POSE / SEND
ns-3 Wi-Fi ad hoc + OLSR
↓ DELIVER
/network_sim/rx/Car
完整配置见 ns3_network/settings.json,关键部分是:
{
"Vehicles": {
"UAV": { "VehicleType": "SimpleFlight", "X": 0, "Y": 0, "Z": -2 },
"Car": { "VehicleType": "PhysXCar", "X": 20, "Y": 0, "Z": 0 }
},
"NetworkSimulation": {
"Backend": "ns3",
"Routing": "olsr",
"MaxRangeMeters": 100.0,
"RunnerPath": "~/opt/ns-3.48/build/scratch/ns3.48-laesim-ns3-runner"
}
}
网络桥接器在启动时读取 Vehicles,为每个实例创建一个 ns-3 节点。AirSim 的 odometry 以各载具出生点为局部原点,因此桥接器会将配置中的 X/Y/Z 出生偏移加回局部里程计,再更新 ns-3 节点位置。
启动链路#
先完成安装与构建页面中的 WSL2、ROS 与 ns-3 步骤,在 Windows 仓库根目录复制实验配置:
$AirSimDir = Join-Path ([Environment]::GetFolderPath('MyDocuments')) 'AirSim'
New-Item -ItemType Directory -Force $AirSimDir | Out-Null
$Settings = Join-Path $AirSimDir 'settings.json'
if (Test-Path $Settings) { Copy-Item $Settings "$Settings.backup" -Force }
Copy-Item .\Examples\quickstart\ns3_network\settings.json $Settings -Force
在 UE 中点击 Play,随后在 WSL2 中分别启动:
# 终端 A
source /opt/ros/noetic/setup.bash
roscore
# 终端 B:连接 Windows LAESim
export WINDOWS_HOST="$(ip route show default | awk '{print $3}')"
source /opt/ros/noetic/setup.bash
source "${HOME}/LAESim/ros/devel/setup.bash"
roslaunch airsim_ros_pkgs airsim_node.launch host:="${WINDOWS_HOST}"
# 终端 C:按 settings.json 启动 ns-3 桥接器
export LAESIM_HOME="${HOME}/LAESim"
export ROS_WORKSPACE="${LAESIM_HOME}/ros"
unset BACKEND
bash "${LAESIM_HOME}/NetworkSim/scripts/run_ros_network_bridge.sh"
unset BACKEND 很重要:已存在的 BACKEND=none 环境变量会覆盖配置文件。
验证交付与丢包#
当 MaxRangeMeters 为 100.0 时运行:
source /opt/ros/noetic/setup.bash
source "${HOME}/LAESim/ros/devel/setup.bash"
python3 "${HOME}/LAESim/Examples/quickstart/ns3_network/run_experiment.py" \
--expect delivered
预期 sent: 5、delivered: 5、dropped: 0,且返回的 simulation_time_ns 均大于 0。
然后将 Windows 活动配置中的 MaxRangeMeters 改为 5.0,重启终端 C 的桥接器,再运行:
python3 "${HOME}/LAESim/Examples/quickstart/ns3_network/run_experiment.py" \
--expect dropped
两个出生点相距约 20 米,超过 5 米硬通信范围,因此预期 delivered: 0、dropped: 5。完整步骤和排查见实验二 README。
Note
普通 /airsim_node/... 话题不会自动经过 ns-3。需要受到时延和丢包影响的业务消息应发布到 /network_sim/tx,接收端订阅 /network_sim/rx/<目标载具名>。
更多场景展示#
以下画面来自 LAESim 当前开发场景,用于展示统一岛屿环境和多类型载具能力。
场景视频演示#
视频时长约 41 秒,展示当前开发版本的岛屿环境与多类型载具运行效果。