AirSim 教程指南 — Part 2:控制 API 全面解析

✈ 适合零基础初学者的无人机控制核心章节
🎯 目标:完全理解 AirSim 的动作控制、速度控制、位姿控制与路径规划 API
💡 本篇结束后,你将能通过 Python 代码让无人机随心所欲移动
📅 最后更新:2025年12月


📋 目录


1. AirSim 控制 API 总览

AirSim 的控制 API 可以分四大类:

控制方式 API 例子 难度 特点 适合场景
动作控制(Movement API) moveByVelocity(), moveByAngleThrottle() ⭐⭐ 以速度与角度为核心,灵活强大 RL、无人机基础动作
速度控制(Velocity API) moveByVelocityZ() 初学者最容易上手 平移、定高飞行
位姿控制(Pose API) simSetVehiclePose() ⭐⭐⭐⭐ 类似机械臂控制:直接给坐标 精确控制、拍照任务
路径控制(Path API) moveOnPath() ⭐⭐⭐ 自动飞路径 导航、巡逻、任务飞行

💡 初学者建议从 速度控制 → 动作控制 → 路径控制 → 位姿控制 顺序学习。


2. 基础准备:连接模拟器

所有控制都必须先 连接 AirSim

2.1 Python 连接代码(通用模板)

import airsim
import time

# 连接AirSim模拟器
client = airsim.MultirotorClient()
client.confirmConnection()

# 解锁 & 起飞
client.enableApiControl(True)
client.armDisarm(True)

print("Taking off...")
client.takeoffAsync().join()

print("Ready to fly!")

你几乎在所有示例中都会写:

client = airsim.MultirotorClient()
client.confirmConnection()
client.enableApiControl(True)
client.armDisarm(True)
client.takeoffAsync().join()

记住这段模板即可。


3. 动作控制:最常用、最灵活的方式

动作控制就是通过“动作指令”控制飞行,例如:

  • 前进多少秒
  • 以某个角速度旋转
  • 以某个速度上升
  • 改变俯仰、横滚、油门

AirSim 提供几个核心函数:

3.1 moveByVelocity()

以 3D 速度(vx, vy, vz)飞指定时间

示例:

# 前方 5 m/s 飞 2 秒
client.moveByVelocityAsync(
    vx=5, vy=0, vz=0, duration=2
).join()

坐标系回顾(非常重要):

AirSim NED 坐标
─────────────────────────────
x:前方
y:右方
z:向下(注意是负值向上)

例如:
想往上飞 → vz=-1
想右移 → vy=+2


3.2 moveByVelocityZ()

保持高度,只以速度移动。

client.moveByVelocityZAsync(
    vx=3, vy=0, z=-5, duration=3
).join()

用途:

  • 自动巡逻
  • 室内定高导航
  • 跟随移动物体

3.3 moveByAngleThrottle()

直接操控俯仰角、横滚角、油门:

client.moveByAngleThrottleAsync(
    pitch=0.1, roll=0, throttle=0.6, yaw_rate=0, duration=1
).join()

用途:

  • RL 强化学习控制
  • 纯动作级飞行(不建议新手使用)

4. 速度控制:以速度为主的精准移动

速度控制比动作控制更“高层”,适合想快速实现“飞到那边”的初学者。

最常用 API:

moveByVelocityZ()

保持高度 + 平移:

# 保持 z=-5 高度,以 3 m/s 前进 3 秒
client.moveByVelocityZAsync(3, 0, -5, 3).join()

新手必学,最稳最好理解。


5. 位姿控制:像机械臂一样“指定坐标点”

位姿控制直接设置:

  • 位置(x, y, z)
  • 朝向(roll, pitch, yaw)

函数:

5.1 simSetVehiclePose()

示例:

pose = airsim.Pose(
    airsim.Vector3r(10, 0, -6),         # 位置
    airsim.to_quaternion(0, 0, 1.57)    # yaw=90°
)
client.simSetVehiclePose(pose, ignore_collison=True)

用途:

  • 精准拍照任务
  • 仿真 SLAM ground truth
  • 多机编队位置重置

5.2 坐标系必懂

AirSim 使用 NED坐标系

x:前
y:右
z:下

而 UE4 世界坐标是:

X:前
Y:右
Z:上

AirSim 自动转换,不需要你手动处理。


6. 路径规划控制:自动飞一条路线

最“高层高级”控制方式。

API:

moveOnPath()

给无人机一系列坐标点,它会自动平滑飞过去。

示例:

path = [
    airsim.Vector3r(0, 0, -5),
    airsim.Vector3r(10, 0, -5),
    airsim.Vector3r(10, 10, -5),
    airsim.Vector3r(0, 10, -5)
]

client.moveOnPathAsync(
    path, 
    velocity=3,
    timeout_sec=30,
    drivetrain=airsim.DrivetrainType.ForwardOnly,
    yaw_mode=airsim.YawMode(is_rate=False, yaw_or_rate=0)
).join()

AirSim 内置路径平滑,无需自己写插值。


7. 组合应用:画一个“正方形”飞行程序

综合所有知识,写一个“小车巡逻”式正方形飞行。

import airsim
import time

client = airsim.MultirotorClient()
client.confirmConnection()
client.enableApiControl(True)
client.armDisarm(True)
client.takeoffAsync().join()

# 高度 -5m
z = -5

# 边长
L = 10

# 定义4个点
points = [
    airsim.Vector3r(0, 0, z),
    airsim.Vector3r(L, 0, z),
    airsim.Vector3r(L, L, z),
    airsim.Vector3r(0, L, z),
]

# 自动巡逻
for p in points:
    client.moveToPositionAsync(
        p.x_val, p.y_val, p.z_val, velocity=3
    ).join()
    print("Reached:", p)

print("Done.")

效果:

无人机起飞
→ 飞到 (10,0)
→ 飞到 (10,10)
→ 飞到 (0,10)
→ 回到起点

8. 常见错误与调试技巧

问题 原因 解决方法
无法连接 AirSim 未开模拟器 Win + “AirSimNH.exe”
控制无反应 忘记 enableApiControl 加上该函数
无法上升 记错 NED 坐标系 上升用 z = -5
无法飞直线 yaw 锁定不当 YawMode(is_rate=False)
路径抖动 点间距离太大 增加中间控制点

🎉祝你天天开心,我将更新更多有意思的内容,欢迎关注!
最后更新:2025年12月
作者:Echo

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐