AirSim提供很多API接口,本文将使用python,通过这些接口实现对单个无人机简单飞行的控制。

1.python库的安装

需安装两个airsim相关的库:

pip install msgpack-rpc-python
pip install airsim

2.在Unreal中运行无人机

2.1 仿真运行

Documents\AirSim目录下创建setting.json文件,并写入如下的内容:

{"SettingsVersion": 1.2,"SimMode": "Multirotor"
}

"SimMode": "Multirotor"表示仿真模式为无人机,如果修改为 "SimMode": "Car"则为汽车。

之后进入环境目录下,运行VS项目工程文件,并使用Debug Game Editor模式开始调试。启动Unreal Editor后,可点击运行按钮运行仿真。在仿真运行时不会显示鼠标,通过“shift+F1”可弹出。

2.2 初始位置设置

进入Unreal Editor后,可对无人机的初始位置进行设置。在界面右侧的“世界大纲视图”中,搜素“PlayStart”,可以看到环境中已经设定的初始位置,如存在多个,保留一个即可。在其下方的“细节”一栏中,可修改参数以调整初始位置,或在关卡中拖动以修改初始位置。

2.3 视角设置

Unreal的环境中可以切换五种不同的视角:

  • F键切换至FirstPersonView,第一人称视角;
  • B键切换至FlyWithMe,跟随视角;
  • \键切换至GroundObserver,地面观察者;
  • /键切换至SpringArmChase,弹性机械臂跟随;
  • M键切换至Manual,手动控制,可以通过键盘按键控制观察者的位置和视角:
    • 方向键:前后左右的水平移动;
    • Page Up/Page Down:上下的垂直移动;
    • W,S:俯仰转动;
    • A,D:偏航转动。

3.无人机飞行控制

使用python对无人机飞行控制的基本代码逻辑可以分解为以下的步骤,接下来将分别说明如何通过代码实现。

3.1 获取与无人机的连接

在第2步中已经运行无人机的基础上,通过airsim.MultirotorClient()请求与无人机的连接,建立连接后返回句柄client,并通过client.confirmConnection()检查连接情况并打印。完整代码如下所示:

import airsimclient = airsim.MultirotorClient()
client.confirmConnection()

如果是对汽车进行仿真,则使用client = airsim.CarClient()

3.2 控制权的获取和交还

为确保安全,API控制默认不开启,故使用代码进行控制前需先获取控制权,在控制结束后交回控制权。使用client.enableApiControl()设置控制权,如输入参数为True则获取控制权,False则失去控制权。

client.enableApiControl(True)    # get control
client.enableApiControl(False)   # release control

3.3 无人机解锁和锁定

使用client.armDisarm()对无人机解锁和锁定,锁定后无人机旋翼停止旋转。

client.armDisarm(True)    # 解锁
client.armDisarm(False)   # 锁定

3.4 无人机起飞和降落

代码指令如下所示,其中.join()的作用是让该任务完全执行,再执行之后的任务,否则会被后面的任务打断。

client.takeoffAsync().join()   # 起飞
client.landAsync().join()      # 降落

3.5 无人机飞行

3.5.1 坐标系

无人机飞行的控制方式可以分为位置控制和速度控制两种,为实现对无人机的控制,首先需要弄清楚坐标系。

这里需要注意三个坐标系:

  1. Unreal中的世界坐标系,即Unreal中定义的机体外部环境的坐标系,这一坐标系在Unreal Editor中被用到。其x,y,zx,y,zx,y,z三个坐标轴的指向分别为北、东、上的方向,单位长度为厘米。
  2. AriSim中的全局坐标系,即AirSim中定义的机体外部环境的坐标系,在编写setting.json文件和airsim代码时,参考的坐标系为该坐标系。其x,y,zx,y,zx,y,z三个坐标轴的指向分别北、东、下的方向,单位长度为米。
  3. AriSim中的机体坐标系,即以机身朝向定义的坐标系,x,y,zx,y,zx,y,z三个坐标轴的指向分别为机体前、右、下的方向,单位长度为米。

在编写setting.json文件和airsim代码时,应依照AirSim中的全局坐标系,且其(0,0)(0,0)(0,0)的位置为Unreal Editor中选择的PlayerStart的位置。在仿真运行时,AirSim会将坐标自动转换至Unreal中的世界坐标系。

3.5.2 位置控制

位置控制主要使用到如下的两个函数,同样可以通过.join()进行阻塞。接下来对位置控制的三个控制通道进行说明。

client.moveToZAsync()
client.moveToPositionAsync()
  1. 高度通道

    moveToZAsync()用于设置无人机的高度,其可设定zzz坐标和速度两个参数,如

    client.moveToZAsync(-3, 2).join()
    

    表示设定高度为3,速度为2,由于世界坐标系zzz坐标的朝向为地,故参数为-3。

  2. 水平通道

    moveToPositionAsync()用于设定无人机的水平位置,对其水平通道进行控制的用法实例为

    client.moveToPositionAsync(5, 0, -3, 1).join()
    

    表示飞往世界坐标系中(5,0,−3)(5, 0, -3)(5,0,−3)的位置,即水平位置为(5,0)(5,0)(5,0),高度为3,最后一个参数表示速度。

  3. 偏航通道

    moveToPositionAsync()还可以对偏航通道进行控制,用法示例为:

    drivetrain = airsim.DrivetrainType.MaxDegreeOfFreedom
    yaw_mode = airsim.YawMode(True, 10)
    client.moveToPositionAsync(0, 0, -3, 1, drivetrain=drivetrain, yaw_mode=yaw_mode).join()
    

    这里用到了moveToPositionAsync()的另外两个参数:

    参数drivetrain有两种模式可以设置:

    • airsim.DrivetrainType.ForwardOnly,表示始终朝向速度方向;

    • airsim.DrivetrainType.MaxDegreeOfFreedom,表示手动设置偏航方向。

    参数yaw_mode为偏航的模式和参数值,有两种模式可以设置:

    • airsim.YawMode(True, 10),第一个参数设置为True表示设置偏航角速度,第二个参数为角速度的值;
    • airsim.YawMode(False, 10),第一个参数设置为False表示设置偏航速度,第二个参数为角度的值;

    以上两个参数可以产生四种组合:

    • airsim.DrivetrainType.ForwardOnlyairsim.YawMode置为True,由于第一个参数要求始终朝向速度方向,第二个参数要求无人机以一定角速度持续旋转,二者矛盾,这种情况下无人机不会执行命令。
    • airsim.DrivetrainType.ForwardOnlyairsim.YawMode置为False,此时以无人机的速度方向为参考方向,产生角度为airsim.YawMode第二个参数的偏航角。
    • airsim.DrivetrainType.MaxDegreeOfFreedomairsim.YawMode置为True,第一个参数要求手动设置偏航角度,第二个参数要求设置偏航加速度,故无人机以一定的角速度旋转。
    • airsim.DrivetrainType.MaxDegreeOfFreedomairsim.YawMode置为False,此时以正北方向为参考方向,产生角度为airsim.YawMode第二个参数的偏航角。
3.5.3 速度控制

速度控制可通过函数moveByVelocityZAsync()moveByVelocityAsync()实现。

moveByVelocityZAsync()函数的前2个参数为无人机在x,yx,yx,y方向的速度vx,vyvx,vyvx,vy,第三个参数为无人机在zzz方向的位置,第四个参数为飞行时间,如以下代码可实现无人机以1m/s速度、在高度3m处沿xxx方向飞3秒钟。

client.moveByVelocityZAsync(1, 0, -3, 3).join()

moveByVelocityZAsync()同样可以设置偏航,方法与位置控制中设置偏航一致。

moveByVelocityAsync()只有第三个参数与moveByVelocityZAsync()不同,其第三个参数为无人机在zzz方向的速度。

但是由于无人机达到指令所要求的速度需要一定的调整时间,而其安装该指令飞行的总时长是固定的,故使用速度控制时总会存在一定的误差,而且速度的当前值与设定值差距越大,其误差越大。

3.5.4 悬停

使用hoverAsync()函数配合延迟函数可实现悬停,如以下代码可实现悬停3s。

client.hoverAsync().join()
time.sleep(3)

整时间,而其安装该指令飞行的总时长是固定的,故使用速度控制时总会存在一定的误差,而且速度的当前值与设定值差距越大,其误差越大。

3.5.4 悬停

使用hoverAsync()函数配合延迟函数可实现悬停,如以下代码可实现悬停3s。

client.hoverAsync().join()
time.sleep(3)

AirSim学习日志 3-使用AirSim控制无人机相关推荐

  1. AirSim学习日志 4-多无人机集群控制

    集群编队控制有集中式和分布式两种.集中式控制需要一个控制中心,受限于中心计算机计算资源的限制,无法做到大规模编队,且中心计算机被击毁后,系统将失控. 分布式控制没有一个中心点对集群进行控制,通过集群中 ...

  2. AirSim学习日志 6-无人机状态读取

    1.无人机真值状态读取 真值状态即无误差的无人机状态,通过以下的函数可读取无人机或无人车的真值状态, state = client.simGetGroundTruthKinematics() 实际运行 ...

  3. ue4和Airsim仿真无人机,键盘控制无人机运动

    代码 #键盘测试 import keyboard import airsimclient = airsim.MultirotorClient() client.confirmConnection()d ...

  4. [AirSim in Unreal] 在Unreal中使用无人机/无人车

    参照http://blog.csdn.net/u011860814/article/details/60469441一文就可以成功地搭建unreal上的airsim项目.我跑了一个car simula ...

  5. AirSim学习和踩坑记录(不定时更新)

    版权声明:本文为博主原创文章,遵循Creative Commons - Attribution-ShareAlike 4.0 International - CC BY-SA 4.0版权协议,转载请附 ...

  6. AirSim学习(1)-介绍,安装,unity测试

    home AirSim是一款基于虚幻引擎的无人机.汽车等模拟器(我们现在也有一个实验性的Unity版本).它是开源的,跨平台的,支持使用流行的飞行控制器(如PX4和ArduPilot)进行软件在环模拟 ...

  7. Unity小狐狸学习日志、关于角色创立,移动控制以及跳跃动画等方面

    ============================================================== GMAE:2d 导入数据包:创建项目后在unity商店导入数据包. 数据载 ...

  8. java框架学习日志-2

    2019独角兽企业重金招聘Python工程师标准>>> 上篇文章(java框架学习日志-1)虽然跟着写了例子,也理解为什么这么写,但是有个疑问,为什么叫控制反转?控制的是什么?反转又 ...

  9. 混合现实在医学领域的应用学习日志

    混合现实在医学领域的应用学习日志 理论知识 混合现实 追踪系统 硬件 场景 可扩展性 应用 教育 培训 手术 远程手术 da Vinci Research Kit (dVRK) 理论知识 混合现实 保 ...

最新文章

  1. 三代测序的基本原理、组装方法和应用场景
  2. [Android Traffic] 使用缓存来避免重复的下载
  3. Oracle学习:序列
  4. AI小编问世!阿里智能写手核心技术首次公开!
  5. SAP技术专家Jerry的技术分享微信群 - 2021年1月14日更新 - 还剩27个名额
  6. 机器学习在高德起点抓路中的应用实践
  7. 为了防止程序重排序,慎用volatile
  8. 整理JavaScript中,数组和字符的操作方法
  9. 腾讯视频会员宣布涨价:一年253元 你还续费吗?
  10. 【Flink】Flink checkpoint was declined
  11. Vim vimrc配置
  12. iperf3 万兆测试
  13. 计算器算贝塞尔公式_我不是灯光设计师,但是我会算空间的平均照度
  14. w10计算机,打开win10自带计算器的多种方法
  15. STM32F1xx_StdPeriph_Driver——I2C
  16. MHDD检测不到硬盘的解决办法
  17. 编写个人所得税计算程序
  18. mysql my.cnf位置_我如何找到MySQL my.cnf位置
  19. Linux下使用icq(转)
  20. html数据的格式是什么格式的文件,.html是什么格式的文件,html文件怎么打开

热门文章

  1. MySQL varchar类型的比较
  2. 跨境卖家运营亚马逊、eBay、wish、速卖通、Shopee、Lazada、乐天、煤炉有哪些技巧?如何做测评自养号?
  3. 虚拟机(win11)和云服务器的WarmServer配置缺少MSVCR110.dll
  4. 谷歌浏览器存不上sessionid问题 登录时一直提示验证码错误 / 参数为空
  5. EasyUI1.5之设置datagrid显示隐藏列
  6. 我曾七次鄙视自己的灵魂——纪伯伦
  7. Linux下Oracle19C RAC通过Gateways(透明网关)连接Sql server数据库
  8. 电感高频阻抗计算及导线寄生电容与电感
  9. MySQL 字符集不一致导致索引失效的一个真实案例
  10. 鸿蒙os智慧屏体验,华为智慧屏S Pro体验:告诉你鸿蒙OS有多优秀?