本人学习课程链接【AirSim】无人机踏上飞行的征途——第三课-AirSim&Python通信环境配置以及无人机起飞降落、位置控制&速度控制_哔哩哔哩_bilibili,本系列文章对其代码做一个总结和解读
import airsim
#connect to the Airsim simulator
client = airsim.MultirotorClient()
client.confirmConnection()#confirm connect
#get control
client.enableApiControl(True)#把api control启动,不用手柄等控制器去控制,使用集成的api去控制
#unlock
client.armDisarm(True)#解锁无人机
client.takeoffAsync().join()#起飞无人机,join表示任务执行完后执行下一个任务
client.landAsync().join()#降落无人机
#lock
client.armDisarm(False)
client.enableApiControl(False)#释放控制权
首先导入AirSim库,需要提前安装好,若没安装可在conda环境下安装
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple airsim
client = airsim.MultirotorClient()
client.confirmConnection()
MultirotorClient 类是 Airsim API 提供的一个类,用于连接和控制 多旋翼无人机,里面封装了与 Airsim 模拟器通信的接口。这里创建了一个MultirotorClient 类的对象client,之后使用这个对象来调用 AirSim 提供的各种 API 控制无人机。
.confirmConnection()用于确认客户端与 AirSim 模拟器之间的连接是否成功,若成功会在终端输出Connected!,失败也会输出错误。
client.enableApiControl(True)
这里启用 API 控制,无人机将不再接受手柄或其他手动控制器的输入,而是通过 AirSim 提供的 API 接口 来进行控制,这样控制权交到了API端口手中,我们可以用我们的代码通过API接口来控制无人机。
client.armDisarm(True)
这一句调用API端口,解锁无人机的螺旋桨,使其准备启动。
client.takeoffAsync().join() # 无人机起飞并等待起飞完成
client.landAsync().join() # 无人机降落并等待降落完成
这里调用了两个接口,起飞takeoffasync(),降落landasync(),这两个都是异步函数,指令会立即返回,而不等待完成。由于是异步任务,这里如果不加 join(),程序会立即执行下一行代码,而不会等待无人机降落,导致程序逻辑错误,在起飞尚未完成时就执行降落命令。使用 join() 是为了让主程序等待当前任务完成,确保代码按照期望的顺序执行。
client.armDisarm(False)
降落完成后,关闭螺旋桨,确保无人机不再操作。
client.enableApiControl(False)
禁用 API 控制,返回到手动或其他控制模式,将控制权交出去。
位置控制的代码
import airsim
client = airsim.MultirotorClient()#建立通信
client.confirmConnection()#确认连接成功
client.enableApiControl(True)#启动api的控制
client.armDisarm(True)#解锁无人机
client.takeoffAsync().join()#起飞
client.moveToZAsync(-3,1).join()#以1m/s的速度移动到Z轴-3的位置,即上升到3m高度
#square flight
client.moveToPositionAsync(5,0,-3,1).join()
client.moveToPositionAsync(5,5,-3,1).join()
client.moveToPositionAsync(0,5,-3,1).join()
client.moveToPositionAsync(0,0,-3,1).join()
client.landAsync().join()#降落
client.armDisarm(False)#锁上旋翼
client.enableApiControl(False)#交出控制权f
client = airsim.MultirotorClient()#建立通信
client.confirmConnection()#确认连接成功
client.enableApiControl(True)#启动api的控制
client.armDisarm(True)#解锁无人机
client.takeoffAsync().join()#起飞
client.moveToZAsync(-3,1).join()#以1m/s的速度移动到Z轴-3的位置,即上升到3m高度
#square flight
client.moveToPositionAsync(5,0,-3,1).join()
client.moveToPositionAsync(5,5,-3,1).join()
client.moveToPositionAsync(0,5,-3,1).join()
client.moveToPositionAsync(0,0,-3,1).join()
首先在Z轴上升
client.moveToZAsync(-3,1).join()
moveToZAsync是异步移动Z轴的距离,第一个参数代表最终位置,-3代表高度为3,由于z轴朝下所以是-号,第二个参数1代表速度,同样由于是异步函数需要使用.join()。
接着进行移动
moveToPositionAsync(x, y, z, velocity)
使用moveToPositionAsync函数,代表位置移动,参数分别为xyz坐标和速度,按照指定速度移动到指定的位置,同样由于是异步函数,需要使用.join()。
client.landAsync().join()#降落
client.armDisarm(False)#锁上旋翼
client.enableApiControl(False)#交出控制权
速度控制代码
import airsim
import time
client = airsim.MultirotorClient()#建立通信
client.confirmConnection()#确认连接
client.enableApiControl(True)#获得api控制权
client.armDisarm(True)#解锁桨叶
client.takeoffAsync().join()#起飞
client.moveToZAsync(-3,1).join()#以1m/s的速度飞到Z轴-2的位置
#square flight
client.moveByVelocityAsync(10,0,-3,8).join()#x轴1m/s的速度飞8s
client.moveByVelocityAsync(0,10,-3,8).join()#y轴1m/s的速度飞8s
client.moveByVelocityAsync(-5,0,-3,8).join()
client.moveByVelocityAsync(0,-20,-3,8).join()
#悬停2秒
client.hoverAsync().join()
time.sleep(2)
client.landAsync().join()
client.armDisarm(False)
client.enableApiControl(False)
client = airsim.MultirotorClient()#建立通信
client.confirmConnection()#确认连接
client.enableApiControl(True)#获得api控制权
client.armDisarm(True)#解锁桨叶
client.takeoffAsync().join()
client.moveToZAsync(-3,1).join()#以1m/s的速度飞到Z轴-2的位置
#square flight
client.moveByVelocityAsync(10,0,-3,8).join()#x轴1m/s的速度飞8s
client.moveByVelocityAsync(0,10,-3,8).join()#y轴1m/s的速度飞8s
client.moveByVelocityAsync(-5,0,-3,8).join()
client.moveByVelocityAsync(0,-20,-3,8).join()
首先飞到指定高度
client.moveToZAsync(-3, 1).join() # 以1 m/s的速度飞到Z轴-3的位置
以1m/s速度飞到3m高度
之后使用速度控制函数
moveByVelocityAsync(vx, vy, vz, duration)
参数分别为xyz三个方向速度和持续时间。这里z轴虽然速度设置为-3,但是前面飞到z轴-3高度已经将z的高度固定了,默认行为是优先保持无人机的高度稳定性,所以只有xy方向速度有效果。同样由于是异步函数,需要使用join()。
#悬停2秒
client.hoverAsync().join()
time.sleep(2)
hoverAsync() 是 AirSim 提供的 API,告诉无人机进入 悬停模式,无人机会停止所有位置或速度移动操作,维持当前的姿态和位置不变,sleep(2) 会让程序暂停 2 秒,这样完成悬停2s的结果。
6.降落
client.landAsync().join()#降落
7.锁定并交出控制权
client.armDisarm(False)#锁上旋翼
client.enableApiControl(False)#交出控制权