5.5 场景内物体的轨迹控制
本小节的例程源码路径:RflySimAPIs\\UE4MapSceneAPI\\GetTerrainAPI
5.5.1 MATLAB中获取高度图矩阵
- 用MATLAB进入到“RflySimAPIs\UE4MapSceneAPI\GetTerrainAPI”文件夹
- 在命令行窗口中输入并执行“LoadPngData XXX”来导入期望的地图数据,其中XXX对应了map文件夹内的某一个地图文件。例如使用“LoadPngData MountainTerrain”来读取高度山地地形的地图信息。运行完上述脚本后,会生成一个“MapHeightData.mat”文件来存储高度图矩阵数据。
- 注:本脚本会搜索需要的XXX.png(地形网格)和XXX.txt(校准数据)两个地形文件,搜索路径依次是:本路径下的“map”文件夹、“..\..\..\CopterSim\external\map”文件夹、和“【安装路径】\CopterSim\external\map”文件夹(【安装路径】默认是C:\PX4PSP,根据平台安装配置决定),请保证XXX地形文件在上述文件夹之一。
- 注:本函数的核心是“LoadPngData.m”文件,可自行查看其中的算法,主要是导入png为矩阵文件,加入校准数据,再转存为高度图矩阵
5.5.2 MATLAB中获取高度地形
- 在MATLAB中直接运行getTerrainAltData(0,0)和getTerrainAltData(200,0)等命令来查看期望坐标的高度(注意,这里采用北东地NED坐标系,向下为正)
- getTerrainAltData函数的作用是输入地图的x,y坐标,输出当前地形高度z
- 通过该函数可以获取地形中任意位置的高度信息,从而可以创建出紧贴地表的运动轨迹
5.5.3 CopterSim高度数据验证
- 打开CopterSim,选择三维场景(例如选择“MountainTerrain”),输入坐标,选择“PX4_SITL”模式(或连上Pixhawk选择PX4_HITL模式),再点击“开始仿真”,可以查看当前坐标的高度值
- 例如,输入上一页PPT中在MATLAB中测试的XY坐标值,并与CopterSim的结果进行对比。(注意:CopterSim中高度值做了反向,向上为正)
5.5.4 Simulink中生成高度轨迹
- 在MATLAB中运行命令“LoadPngData XXX”来导入期望的地图数据,其中XXX对应了map文件夹内的某一个地图文件。例如使用“LoadPngData MountainTerrain”来读取高度地图信息。
- 运行RflySim3D程序,键盘输入“M 3”切换到“MountainTerrain”的三维地图
- 打开“TrajGen.slx”运行即可。其中的getTerrainAltData模块调用了上一小节的MATLAB函数
- 运行“TrajGen.slx”文件
- 可以看到人在场景中沿着地形表面行走的demo如下。注:通过本接口还可以实现生成追踪目标、靶标等功能,用于视觉跟踪或者集群飞行时的障碍物50
- 注意:vehicleType 是一个控制三维物体的变量.
- vehicleType=3 对应四旋翼。RflySim3D有多重四旋翼样式可选,输入vehicleType =1003, 2003, 3003之类来选择具体样式
- vehicleType =5对应一个六旋翼
- vehicleType =30对应人,其中 3030表示样式为3的人,对应下图中行走的人
- vehicleType =100对应固定翼.
- vehicleType=150对应环、方框等靶标
- vehicleType=60对应发光的等,用于灯光秀显示
5.5.5 切换视角接口
- 在运行时可以在RflySim3D中通过鼠标和快捷键(V或者N)来切换不同视角,这种方法只能定性大致调整
- RflyCameraPosAng.m文件是一个控制相机视角的程序,直接在MATLAB命令行窗口中输入(仅限RflySim视觉版和完整版)
RflyCameraPosAng x y z roll pitch yaw
- 其中 x y z单位m表示相机相对飞机中心位置,roll,pitch,yaw单位是度,表示相机姿态角,例如输入
RflyCameraPosAng 0.2 0 0 0 0 0
- 相当于一个前置摄像头(中心向前0.2m)的视角
5.5.6 多机轨迹生成例子(同种飞机)
- 同上例子,打开RflySim3D程序,切换到“MountainTerrain”的三维地图
- 运行“TrajGenMulti.slx”程序,可以看到多个飞机从地面依次起飞,并飞矩形轨迹再降落
5.5.7 多机轨迹生成例子(不同飞机样式)
- 关闭上面的Simulink,在RflySim3D中按下“ESC”清除所有飞机
- 再运行“TrajGenMulti2.slx”例程,可以看到各种飞机与车在冰面运行的例子。
- 在RflySim3D中按下“S”可以显示飞机ID,按下“B”可以在不同飞机之间切换,按下“N”或“V”可以切换不同的视角
5.5.8 大规模集群演示
在下面文件夹RflySimAPIs\UE4MapSceneAPI\GetTerrainAPI\MultiVehicleAPI
中存放了一些通过Simulink向RflySim3D发送一架、20架和100架飞机的接口。利用这些接口例程,只需要一个UDP发送模块即可实现大量飞机的三维数据发送和可视化,减小的编程难度、提升运行效率、降低数据延迟和提高同步性。也可以根据例程中提示的数据结构体定义,通过Python或C等其他语言发送
注:Simulink接口更新,增加多机接口和贴合地形功能,见RflySimAPIs\UE4MapSceneAPI\MultiVehicleAPI
文件夹带ToGround后缀例程。同时Simulink增加往RflySim3D发送命令接口“RflySendUE4CMD.m”,例如直接使用RflySendUE4CMD('RflyChangeMapbyName MountainTerrain')可更改地图
1. 1个飞机接口例程
如下图所示该接口通过一个UDP发送模块向RflySim3D发送1架飞机,图中有两个UDP模块所以RflySim3D生成了两架飞机
2. 20个飞机接口例程
如下图所示该接口通过一个UDP发送模块向RflySim3D发送20架飞机
如下图该例程接口中一次性将20个飞机的id,三维样式,位置和姿态都发送给了UDP发送模块
3. 100个飞机接口例程
如下图所示该接口通过一个UDP发送模块向RflySim3D发送100架飞机
如下图该例程接口中一次性将100个飞机的id,三维样式,位置和姿态都发送给了UDP发送模块
5.5.9 集群Python演示接口介绍
- 在下图文件夹
RflySimAPIs\UE4MapSceneAPI\MultiVehicleAPI\PythonAPI
可以看到Python的场景控制接口,这些接口效果与Simulink接口一致,只需要打开RflySim3D,再运行python文件,即可在场景中生成多个集群飞机(三维物体)
(1)1个模型接口例程
运行python接口,效果如下,RflySim3D中生成一个三维的人类模型
该函数向 RflySim3D发送命令切换地图到Grasslands
该函数向RflySim3D发送生成模型的数据,第一个参数是生成模型的id,即图中展示的人体模型头上的1;第二个参数是三维模型的类型,其中30表示是人体模型,2表示人体模型的种类是2,0表示静止状态;第三个参数是存放模型位置的列表;第四个参数是表示模型姿态即三维坐标偏转角度的列表;第五个参数表示模型x,y,z轴的缩放比例
如果将第一个参数改为2,模型的标记也会变成2,将三维模型类型改为3,人体模型将变为无人机,如下图所示
(2)20个模型接口例程
运行python接口,效果如下,RflySim3D中生成20个三维的无人机模型
首先声明copterID是一个大小为20值全为0的数组,然后使id从1~20递增
声明VehicleType是一个大小为20值全为3的数组,即所有模型的类型均为3(旋翼无人机)
声明PosE是一个大小为60的数组,其中每一个值都是0~30内的随机数,在for循环中从第一个飞机的y坐标递减40得到所有飞机的y坐标,防止飞机模型重叠
使所有飞机的偏转姿态均为[0,0,0]
使所有飞机缩放比例均为[100,100,100]
使所有螺旋桨转速均为1000 r/min
下图中的astype(int)是将数组中的数组转换成int类型,tolist()函数是将数组转换成列表,方便下面的传参
下图中的函数是将上述得到的三维模型的数据传入RflySim3D中用以生成20个模型。前六个参数已经介绍过了,最后一个参数是指是否忽略地形,选择1的意思就是忽略地形,三维模型均在地面上
这个函数是向RflySim3D发送S命令,显示模型的编号
(3)100个模型接口例程
运行python接口,效果如下,RflySim3D中生成100个三维的无人机模型