AirSim python通信环境配置和无人机控制
本人学习课程链接【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
1.连接到 AirSim 模拟器
client = airsim.MultirotorClient()
client.confirmConnection()
MultirotorClient 类是 Airsim API 提供的一个类,用于连接和控制 多旋翼无人机,里面封装了与 Airsim 模拟器通信的接口。这里创建了一个MultirotorClient 类的对象client,之后使用这个对象来调用 AirSim 提供的各种 API 控制无人机。
.confirmConnection()用于确认客户端与 AirSim 模拟器之间的连接是否成功,若成功会在终端输出Connected!,失败也会输出错误。
2.启用API控制
client.enableApiControl(True)
这里启用 API 控制,无人机将不再接受手柄或其他手动控制器的输入,而是通过 AirSim 提供的 API 接口 来进行控制,这样控制权交到了API端口手中,我们可以用我们的代码通过API接口来控制无人机。
3.解锁无人机
client.armDisarm(True)
这一句调用API端口,解锁无人机的螺旋桨,使其准备启动。
4.起飞降落
client.takeoffAsync().join() # 无人机起飞并等待起飞完成
client.landAsync().join() # 无人机降落并等待降落完成
这里调用了两个接口,起飞takeoffasync(),降落landasync(),这两个都是异步函数,指令会立即返回,而不等待完成。由于是异步任务,这里如果不加 join(),程序会立即执行下一行代码,而不会等待无人机降落,导致程序逻辑错误,在起飞尚未完成时就执行降落命令。使用 join() 是为了让主程序等待当前任务完成,确保代码按照期望的顺序执行。
5.锁定无人机
client.armDisarm(False)
降落完成后,关闭螺旋桨,确保无人机不再操作。
6.释放 API 控制权
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
1.建立通信
client = airsim.MultirotorClient()#建立通信
client.confirmConnection()#确认连接成功
2.获得控制权并解锁
client.enableApiControl(True)#启动api的控制
client.armDisarm(True)#解锁无人机
3.起飞
client.takeoffAsync().join()#起飞
4.位置控制
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()。
5.降落
client.landAsync().join()#降落
6.锁定并交出控制权
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)
1.建立通信
client = airsim.MultirotorClient()#建立通信
client.confirmConnection()#确认连接
2.获得控制并解锁
client.enableApiControl(True)#获得api控制权
client.armDisarm(True)#解锁桨叶
3.起飞
client.takeoffAsync().join()
4.速度控制
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()。
5.悬停
#悬停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)#交出控制权
作者:fegxg