视频接入
视频控件
在开发过程中,分为“本地视频视图控件”和“实时视频视图控件”。后者需要引入DJI MSDK V4。本地视频和实时视频都是通过相应的视频控件进行接入。
本地视频控件
(1).控件介绍
本地视频控件是UAVVideoEffectView,它的父类是EffectView(EffectView继承RelativeLayout)。它具备加载本地视频和管理无人机姿态参数的能力,也可通过同Relativelayout一样的方式添加进程序。
(2).UML简图
图:本地视频控件UML简图 |
实时视频控件
(1).控件介绍
实时视频控件是DJIFPVEffectView,它的父类也是EffectView(EffectView继承RelativeLayout)。它引入了DJI MSDK,具备显示实时视频画面和管理无人机姿态参数的能力,也可通过同Relativelayout一样的方式添加进程序。
(2).UML简图
图:实时视频控件UML简图 |
(3).控件使用
请参考“开发流程”->“编写代码”部分。
视频数据
(1).数据说明
当前版本,有两种方式接入视频。一种是通过姿态视频(姿态数据+视频文件)接入,另一种是加载SuperMap iDesktopx配置的视频数据集。
此处推荐使用后者。视频数据集中包含了姿态信息和视频资源的路径,将其拷贝至移动设备(手机、平板)即可。
(2).姿态视频
在使用第一种方式进行视频接入时,为确保视频场景能正常打开且和地图叠加准确,需要检查以下条件是否满足:
- 需确保视频内容无畸变、无拉伸、无黑边。
- 需确保姿态数据(*.csv)至少包括以下参数:
① 时刻值(时间戳),单位:us
② 相机的经度(通常采用无人机的经度)
③ 相机的纬度(通常采用无人机的纬度)
④ 相机相对起飞位置的高度(通常采用无人机的相对高度)
⑤ 相机的偏航角(注意区分无人机的偏航角)
⑥ 相机的俯仰角(注意区分无人机的俯仰角)
⑦ 相机的翻滚角(注意区分无人机的翻滚角)
⑧ 相机的垂直视场角、水平视场角或35mm等效焦距(三者取一即可)
当CSV文件可用且合规时,通过以下方法读取CSV文件,得到无人机参数集。
UAVCsvReader uavCsvReader = new UAVCsvReader(getApplicationContext(), new UAVCsvReader.OnReadUpdateListener() {
@Override
public void onUpdate(UAVRecordParameter currentPara, String[] value) {
//value[i]分别对应csv文件对应列
currentPara.setUnixTimeStamp(Long.parseLong(value[1]));
currentPara.setSensorLongitude(Double.parseDouble(value[2]));
currentPara.setSensorLatitude(Double.parseDouble(value[3]));
currentPara.setPlatformHeight(Float.parseFloat(value[4]));
currentPara.setYaw(Float.parseFloat(value[5]));
currentPara.setPitch(Float.parseFloat(value[6]));
currentPara.setRoll(Float.parseFloat(value[7]));
currentPara.setVerticalFOV(Float.parseFloat(value[8]));
currentPara.setHorizontalFOV(Float.parseFloat(value[9]));
}
});
ArrayList<UAVRecordParameter> uavRecordParameters = uavCsvReader.readFileFromSdCard(SDCARD + "/SuperMap/UavDemo/record.csv");
uavVideoEffectView.setUavRecordParameters(uavRecordParameters);
当MP4文件可用时,通过以下方法将MP4加入场景。
uavVideoEffectView.setDataSource(SDCARD + "/SuperMap/UavDemo/record.mp4");
视频数据集
视频数据集是SuperMap iDesktop X和SuperMap iMobile所支持的一种数据类型。
视频数据集可导入一个或多个视频,数据集存储了视频的路径、视频配准、范围等信息,便于视频的存储和管理。
SuperMap iDesktop X新建视频数据集后,通过“相机参数”导入与“视频文件”导入可实现姿态视频(姿态数据+视频文件)的导入。更多的iDesktopX 视频数据集生产过程请参考链接:https://help.supermap.com/iDesktopX/1101/zh/tutorial/SpecialFeatures/ARMap/NewARDataset。
SuperMap iDesktopX生产的视频数据集可通过如下代码在移动设备上进行加载。
DatasetVector video= (DatasetVector) datasource.getDatasets().get(0);
uavView.setDatasetVector(video);
视频联动
2D地图联动
视频投放
(1).功能描述
实现在二维地图上叠加视频帧的效果。(2).功能实现
基于AR和Mapping模块,使用CameraWindowRenderer类。
关键代码如下:
CameraWindowRenderer renderer = new CameraWindowRenderer(arView,map,CameraWindowRenderer.RenderType.VIDEO_FRAME);
renderer.setEnabled(true);//启用
再在视频控件的OnUpdateListener回调中添加renderer.refresh()方法,即可实现视频画面在二维地图上同步更新。(注:也可通过类似定时任务的方式)
(3).示例效果
图:视频投放示例效果 |
(4).注意事项
- 使用CameraWindowRender时,需要确保引入了com.supermap.ai.jar。
- com.supermap.ai中带有opencv依赖,需防止额外依赖opencv。
相机可视域
(1).功能描述
实现在二维地图上显示相机的可视范围。
(2).功能实现
基于AR和Mapping模块,使用CameraWindowRenderer类。
关键代码如下:
CameraWindowRenderer renderer = new CameraWindowRenderer(arView,map,CameraWindowRenderer.RenderType.VIDEO_FRAME);
renderer.setEnabled(true);//启用
(3).示例效果
图:相机可视域示例效果 |
3D场景联动
视频投放
(1).功能描述
实现在三维场景中上投放视频的效果。
(2).功能实现
基于Realspace和AR模块,主要使用ProjectionImage类。
关键代码如下:
effectView.innerCaptureScreen();
bitmap = effectView.getInnerCaptureScreenResult();
UAVRecordParameter parameter = effectView.getCurrentUAVRecordParameter();
if (parameter == null){
return;
}
if (!create) {
projectionImage = new ProjectionImage(sceneControl.getScene());
create = true;
}else {
projectionImage.clear();
}
projectionImage.setHintLineVisible(true);
projectionImage.setHintLineLength(100.0f);
projectionImage.setPosition(new Point3D(parameter.getSensorLongitude(),parameter.getSensorLatitude(),parameter.getPlatformHeight()));
projectionImage.setHeading(parameter.getYaw());
projectionImage.setPitch(parameter.getPitch());
projectionImage.setRoll(parameter.getRoll());
projectionImage.setHorizontalFov(parameter.getHorizontalFOV());
projectionImage.setVerticalFov(parameter.getVerticalFOV());
projectionImage.setImage(bitmap);
projectionImage.build();
(3).示例效果
图:视频投放示例效果 |
相机可视域
(1).功能描述
将无人机的相机可视域在三维场景中显示。
(2).功能实现
基于Realspace和AR模块,使用Viewshed3D类。
关键代码如下:
viewshed3D = new Viewshed3D(sceneControl.getScene());
viewshed3D.setDistance(500);
viewshed3D.setHiddenAreaColor(new Color(3,218,255,255));
viewshed3D.setVisibleAreaColor(new Color(3,218,255,255));
viewshed3D.setHintLineColor(new Color(0,255,0,255));
viewshed3D.build();
(3).示例效果
图:相机可视域示例效果 |
视频画中画
(1).功能描述
将三维场景和视频画面结合,以“画中画”的方式同步播放视频。
(2).功能实现
基于Realspace和AR模块,实时更新LookAt相机。
关键代码如下:
public void updateLookAt(EffectView view, UAVRecordParameter parameter){
if (isCompleted() && parameter != null){
LookAt lookAt = getLookAt(view, parameter);
sceneControl.getScene().setLookAt(lookAt);
}
}
(3).示例效果
图:视频画中画示例效果 |
数据管理
启动一个无人机视图后,会自动有一个无人机图层组,所有添加的数据,都需要通过图层组进行管理。
uavView.getUAVLayers();//获取无人机图层组
三维场景
(1).关键代码
当前版本,支持将配置好的工作空间场景,叠加到无人机视频场景中。
以下代码演示如何从视频控件中获取图层组,并如何将场景添加到图层组中。
mUAVLayers = uavView.getUAVLayers();
/**
* @param workspace 工作空间
* @param index 场景索引
*/
mUAVLayers.fromScene(workspace,0);
(2).应用示例
以下是桌面端和移动端的加载情况。
图:桌面端和移动端加载三维场景情况 |
矢量数据
(1).关键代码
当前版本,支持数据源中矢量(目前支持点、线、面)数据集叠加到无人机视频场景中。
以下代码演示如何将面矢量数据集添加至图层组。
DatasetVector region= (DatasetVector) datasource.getDatasets().get(0);
mUAVLayers.add(region);
此外,当前版本还支持设置图层风格样式,支持设置点符号颜色、大小;线符号宽度、颜色;面符号颜色、线宽,线颜色,以及所有透明度。
示例代码如下:
LayerStyle layerStyle=layer.getLayerStyle();
layerStyle.setAlpha();
layer.setPolygonColor();
(2).应用示例
在UAVSurvey中有对以上功能接口的应用。
加载示例矢量数据集的截图如下:
图:加载矢量数据集 |
样式修改的截图如下:
图:样式修改 |
KML数据
(1).数据准备
首先在SuperMap iDesktop球面场景中配置好的一份kml数据。当前版本只支持kml中含有POI、线、面元素。
图:加载kml数据 |
(2).关键代码
以下代码演示将文件加载到无人机场景
String kmlPath= PathConfig.UAV_User_KML+"city.kml";
mUAVLayers.addKmlLayer(kmlPath);
(3).应用示例
在SuperMap UAVSurvey中有对以上功能接口的应用,实测截图如下:
图:SuperMap UAVSurvey加载kml数据 |
更多KML数据加载情况如下:
图:加载更多kml数据 |
SCI地图缓存
(1).关键代码
当数据合规时,通过以下步骤实现SCI缓存的加载。
① 在布局中添加SceneMapControl控件,宽度高度设置多少无影响。
<com.supermap.ar.areffect.uav.map.SceneMapControl
android:id="@+id/scene_map"
android:layout_width="1dp"
android:layout_height="1dp"/>
② 绑定UAVVideoEffectView控件。
③ 设置工作空间。(仅打开SCI缓存,可跳过此步)
④ 打开指定的地图。(仅打开SCI缓存,可跳过此步)
⑤ 设置SCI缓存路径。(指向xxx.sci)
⑥ 启用缓存 步骤2-6示例代码如下:
sceneMapControl = findViewById(R.id.scene_map);
//绑定场景视图
sceneMapControl.bindEffectView(uavVideoEffectView,/*瓦片数量的算术平方根*/5);
//获取地图对象,并打开指定地图
Map map = sceneMapControl.getMap();
map.setWorkspace(DatasetVectorReader.mWorkSpace);
map.open("thMap");
sceneMapControl.setCacheFolderPath(SDCARD+"/000MapCache/map3/map3.sci");
sceneMapControl.setUseCache(true);
sceneMapControl.setRefreshListener(new SceneMapRefreshListener() {
@Override
public void onRefresh(RefreshStatus refreshStatus) {
Log.i(TAG, "onRefresh: " + refreshStatus.toString());
}
});
⑦ 通过调用refresh方法刷新地图。此外,为了地图瓦片能动态更新显示范围,可参考如下代码:
uavVideoEffectView.addOnUpdateListener(new EffectView.OnUpdateListener() {
@Override
public void onUpdate() {
UAVRecordParameter currentUAVRecordParameter = uavVideoEffectView.getCurrentUAVRecordParameter();
if (currentUAVRecordParameter != null){
sceneMapControl.refresh(uav.getSensorLongitude(),uav.getSensorLatitude(),/*Zoom*/18);
}
}
});
(2).示例效果
图:SCI地图缓存范例运行效果 |
(3).注意事项
当前版本,需确保sci缓存在通过SuperMap iDesktopX切图时,满足以下条件:
① 所切的地图确保坐标系为WGS_1984/Web_Mercator(EPSG Code 3857)。
② 剖分方式为“全球剖分”。
③ 存储类型为“原始”。
④ 当前支持的图片类型为 PNG、WEBP、JPG,在需要背景透明时,需要勾选背景透明,且不能使用JPG。
⑤ 块大小建议”1024x1024“,此处块大小越大,在UAV场景中显示的范围越大。
⑥ 注意:切图后需检查切图结果的文件夹对应的层级是否与切图所选择的层级一致。
模型数据
支持将二维的面数据通过拉伸高度,生成白模。效果图如下:
图:白膜拉伸 |
也可以通过属性数据通过链接模型资源路径的方式,加载gltf2.0格式的模型文件。关键截图如下:
图:加载GLTF2.0模型 |
交互操作
手势类型
当前版本支持以下多种动作类型。
手势类型 | 描述 |
---|---|
PAN | 漫游手势(缩放平移) |
CREATE_POINT | 绘制点 |
CREATE_LINE | 绘制线 |
MEASURE_DISTANCE | 量算距离 |
MEASURE_AREA | 量算面积 |
com.supermap.track.jar | 量算距离 |
MEASURE_HEIGHT | 量算高度 |
SELECT | 选择 |
EDIT_NODE | 编辑节点 |
ADD_NOD | 添加节点 |
DELETE_NODE | 删除节点 |
数据采集
(1).关键代码
修改ActionControl的Action即可,参考代码如下:
mUAVActionControl = uavView.getUAVActionControl();//获取手势控制器
mUAVActionControl.setAction(UAVAction.NONE);
(2).示例效果
以下是基于该功能接口在UAVSurvey实现的效果截图。
图:数据采集 |
数据编辑
(1).关键代码
修改ActionControl的Action即可,参考代码如下:
UAVLayers.get(1).UAVBaseLayer.setEditable(true);
mActionControl.setAction(UAVAction.SELECT);
mActionControl.setAction(UAVAction.ADD_NODE);
(2).示例效果
以下是基于该功能接口在UAVSurvey实现的效果截图:
修改数据空间信息:
图:数据编辑 |
修改数据属性信息:
图:属性编辑 |
通过上述方式采集、编辑后的数据,可直接在SuperMap iDesktopX上打开。
图:SuperMap iDesktopX打开编辑数据 |
视频量算
当前支持长度、高度、面积三种量算方式。需要注意的是,仅可在平坦的地表进行量算操作。
修改ActionControl的Action即可,参考代码如下:
mUAVActionControl.setAction(UAVAction.MEASURE_AREA);
以下分别是高度、长度、面积量算的实测图:
图:高度、长度、面积量算 |
航点任务
关于航点任务的实现上,此处分为两部分介绍。分为“航线规划”和执行“飞行任务”。
现可通过以下方式去规划航线进而执行飞行任务,也可导入既定的航点集,将航点集作为飞行任务的传入参数。
航线规划
当前版本,航线规划主要用于实现类似建图航拍和多图斑举证的场景。
建图航拍
通过飞行高度、横向(旁向)、纵向(航向)重叠率等参数计算航点的方式。
(1).适用场景
三维重建的照片拍摄。
(2).关键方法
① 计算构成航线的航点坐标点集。
FlightPathHelper.calculateWayPoints(PathTaskParameter pathTaskParameter);
② 根据任务参数异步计算航线。
FlightPathHelper.calculateWayPoints(PathTaskParameter pathTaskParameter, FlightPathHelper.OptimalSetting setting, PathResultCallback callback);
③ 计算构成航线的航点坐标点集。
FlightPathHelper.calculateWayPoints(Point3D a, Point3D b, Point3D c, float distance);
(3).实现步骤
① 通过交互式的方式获取到多边形的顶点集(建图的范围)。
② 构建重叠率参数OverlapParameter(横/旁重叠率、飞行高度、相机水平/垂直视场角)。
overlapParameter = new OverlapParameter(/*横向重叠率*/0.8f,/*纵向重叠率*/0.8f).setFov(/*水平FOV*/73.73f,/*垂直FOV*/53.17f);
//拍照间距(纵向非重叠距离)
ySpaceDistance = overlapParameter.getCaptureSpacing();
//航线间间距(横向非重叠距离)
xSpaceDistance = overlapParameter.getRouteSpacing();
③ 构建分析参数PathTaskParameter(航向、始终点、路径规划类型)。
DOUBLE_GRID 双向网格,主方向互相垂直
GRID 网格状(平行四边形的方式构建)
④ 路径计算 calculateWayPoints(PathTaskParameter pathTaskParameter)。
FlightPathHelper.calculateWaypoints(new PathTaskParameter(PathPlanningType.GRID, ps,overlapParameter).setStartPosition(effectView.getCameraPosition()).setEndPosition(effectView.getCameraPosition()),FlightPathHelper.OptimalSetting.MIN_WAYPOINT,pathResult -> {
//pathResult为路径结果
});
⑤ 结果解析。
//从计算结果中获取构成航线的点集
ArrayList<Point3D> pointList = pathResult.getPointList();
(4).应用示例
SuperMap UAVSurvey基于上述接口实现了航点/航线规划、存储、选择的功能。详情如下:
① 航点。点击绘点,进行航点绘制,提交后保存改航点任务,以供执行飞行时选择。
图:航点任务 |
② 矩形。点击绘点,拖动矩形大小为合适为止,右边设置中可以调整航线任务的各类参数。如旁向/横向重叠率,飞行高度,航线类型等等。
图:矩形航线任务 |
③ 多边形。绘点点击单点绘制成多边形,其他和矩形一致。
④ 选择。选择已保存的航点、航线任务,若选择时无人机已准备好起飞或是已经起飞,则选择后无人机会自动执行飞行任务。
(5).三维重建
通过“建图航拍”规划的航线,并执行飞行任务拍摄之后,得到到照片可直接用于三维重建。
以使用“重建大师”为例,ContextCapture、PhotoScan类似。
具体步骤如下:
① 数据准备。将飞机拍摄的照片导出。在使用“重建大师”时,对应架次的相机拍摄的照片需要导入到对应的文件夹。
图:准备数据 |
② 导入数据。打开“重建大师”->新建工程->导入图片->选择定位类型->EXIF(注:大疆无人机拍摄的照片含有EXIF信息)。
图:导入数据 |
③ 空三计算。点击应用->启动本地引擎->提交空三。
图:提交空三 |
成果生成。设置重建参数->提交产品。
图:提交产品 |
④ 成果查看。在DasViewer中查看重建结果。
图:成果查看 |
⑤ SuperMap iDesktopX导入重建结果。
图:SuperMap iDesktopX导入重建结果 |
图:设置导入参数 |
(6).注意事项
使用以下方法时,PathTaskParameter 中航向设置无效。
calculateWaypoints(PathTaskParameter pathTaskParameter, FlightPathHelper.OptimalSetting setting, PathResultCallback callback);
本方法会根据 FlightPathHelper.OptimalSetting自动计算得到一个最优的航向。
MIN_DISTANCE 最短距离
MIN_WAYPOINT 最少航点数
多图斑举证
基于TSP分析,计算拍摄完所有点位的最优路线。
(1).适用场景
类似多图斑举证这种需要巡查多个点位并拍照的场景。
(2).关键方法
计算从当前位置开始对所有矢量图斑进行举证的最优航线。
calculateWayPointTask(DatasetVector datasetVector, Rectangle2D bounds, float height, float hFov, float vFov, Point2D currentPosition);
(3).实现步骤
① 从数据源中取出作为图斑数据的面数据集A。
Dataset dataset = mapControl.getMap().getLayers().get(0).getDataset();
DatasetVector datasetVector = (DatasetVector) dataset;
② 构建查询范围rectangle2D。
③ 根据rectangle2D生成遍历拍摄完包含bounds内所有图斑涵盖范围的航点任务组。
WayPointTask[] wayPointTasks = FlightPathHelper.calculateWayPointTask(datasetVector, rectangle2D, /*飞行高度*/height, /*水平FOV*/73.73f, /*垂直FOV*/53.17f,/*无人机当前位置*/position);
④ 解析任务组WayPointTask[]。
CapturePose[] getCapturePose() 获取拍照姿态
Point2D getWayPoint() 获取航点坐标
(4).应用示例
在设置飞行高度、选定要举证的图斑后,示例程序生成的航线如下:
图:多图斑举证 |
(5).注意事项
点数量较少时,能够得到全局最优解。
点数量较多时,能得到全局最优的近似解。
点数量阈值:15。
航线显示
(1).实现方式
通过“航线规划”,可得到航点的坐标位置信息(Point3D、Point2D),从而可以在2D地图、3D场景、视频画面中将航线进行可视化。
(2).应用示例
在2D地图上显示航线,示例效果如下:
图:二维地图显示航线 |
在3D场景中显示航线,示例效果如下:
图:三维地图显示航线 |
在多个窗口显示航线,示例效果如下:
图:多窗口显示航线 |
飞行过程中,实时显示航线示例如下:
图:二维实时航线 |
图:三维实时航线 |
飞行任务
SuperMap iMobile航点任务
(1).实现方式
基于DJI MSDK通过定时任务的方式,持续执行发送飞控数据。
(2).适用范围
适用大疆所有支持Mobile SDK 4.16.x 的无人机(包括Mini,Mini SE,Mini 2,Air 2,Air2s)。
(3).使用示例
exWaypointMissionManager = ExWaypointMissionManager.getInstance();
//设置航点集
exWaypointMissionManager.setWaypointList(pointList)
//配置任务
exWaypointMissionManager.configMission(effectView);
//开始任务
exWaypointMissionManager.startMission();
(4).任务状态
- 执行{ExWaypointMissionManager#configMission(ICommonControl)},状态进入 READY
- 执行{ExWaypointMissionManager#startMission()},状态进入EXECUTING
- 执行{ExWaypointMissionManager#pauseMission()},从EXECUTING进入EXECUTING_PAUSE
- 执行{ExWaypointMissionManager#continueMission()},从EXECUTING_PAUSE再次进入EXECUTING
- 执行{ExWaypointMissionManager#stopMission()},从EXECUTING进入NO_ACTION
(5).状态监听
通过setOnStateChangeListener方法设置监听事件用以监听状态的变化,示例如下:
exWaypointMissionManager.setOnStateChangeListener(new ExWaypointMissionManager.OnStateChangeListener() {
@Override
public void onStateChange(ExWaypointMissionManager.Status status) {
switch (status){
case READY:
//"任务就绪"
break;
case EXECUTING:
// "任务执行中"
break;
case EXECUTION_PAUSED:
// "任务暂停"
break;
case NO_ACTION:
//"任务未开始或已完成"
break;
}
}
@Override
public void onSendData(float currentSpeed, float currentYaw, float currentAltitude) {
//实时数据
}
/**
* 航段更新
* @param index 对应航点的索引
*/
@Override
public void onUpdateWaySegment(int index) {
}
@Override
public void onStartMission() {
}
@Override
public void onStopMission() {
}
@Override
public void onFinishMission() {
}
});
DJI航点任务
(1).实现方式
基于DJI MSDK的航点任务接口。
(2).适用范围
适用于大疆MSDK支持航点任务的机型
不支持的设备型号:链接。
(3).使用示例
djiMissionManager = DJIWaypointMissionManager.getInstance();
WaypointMissionState currentState = djiMissionManager.getCurrentState();
if (currentState == WaypointMissionState.NOT_SUPPORTED){
Toast.makeText(mActivity, "飞行设备不支持", Toast.LENGTH_SHORT).show();
return;
}
try{
//此处需要检查,像DJI Air 2s,DJI的MSDK不支持航线规划
wayPointMission = configWayPointMission();
DJIError djiError = djiMissionManager.loadWayPointMission(wayPointMission);
if (djiError==null){
//成功执行任务
status = true;
}
}catch (IllegalArgumentException e){
//...
}
public WaypointMission configWayPointMission(){
//desc-设置航点
djiMissionManager.setWayPointList(waypoints);
//desc-巡航速度
djiMissionManager.setAutoFlightSpeed(autoSpeed);
djiMissionManager.setMaxFlightSpeed(maxSpeed);
//desc-飞机总是朝向前进方向
djiMissionManager.setHeadingMode(WaypointMissionHeadingMode.AUTO);
//任务完成后,无动作,原地悬停
djiMissionManager.setFinishedAction(WaypointMissionFinishedAction.NO_ACTION);
//desc-创建航点任务
WaypointMission wayPointMission = djiMissionManager.configWayPointMission(getActivity());
DJIError djiError = wayPointMission.checkParameters();
if (djiError != null){
throw new IllegalArgumentException(djiError.getDescription());
}
return wayPointMission;
}
DJI时间线事件
(1).实现方式
基于DJI的TimelineEvent实现。
(2).适用范围
由于GoToAction仍需使用DJI 的航点任务,因此适用于大疆MSDK支持航点任务的机型 不支持的设备型号:链接。
(3).使用示例
djiTimeLineMissionManager = DJITimeLineMissionManager.getInstance();
float height = 50.0f;//飞行高度
for (int i = 0; i < point2DS.getCount(); i++) {
Point2D item = point2DS.getItem(i);
//构建Action
GoToAction goToAction = new GoToAction(new LocationCoordinate2D(/*lat*/item.getY(),/*lon*/item.getX()),/*alt*/height);
goToAction.setFlightSpeed(autoSpeed);
djiTimeLineMissionManager.addMissionAction(goToAction);
}
//配置任务
djiTimeLineMissionManager.configTimeLineMission();
//执行任务
djiTimeLineMissionManager.startTimeline();
视频推流
此处不仅涉及视频推流,还需要用到数据流服务,以便用于推送无人机的实时位置、姿态等信息。
数据流服务
(1).服务配置
构建配置SuperMap iServer环境,启用数据流服务。旨在将无人机的姿态参数进行推送。用户在移动端只需要配置服务参数(例如地址、ip、端口等)。
(2).示例代码
//服务的ws地址,服务的ip地址,服务的端口,iServer的账号,iServer的密码
MediaManager.setInfoPushService(wsAddress,ip,port,username,password);
(3).推流结果
以下是将无人机飞行过程中的实时姿态推流后,在iServer的接收情况。
图:查看移动端的实时视频推流结果 |
视频流服务
(1).服务配置
视频推送需要先搭建开源rtsp服务,这里使用的是easydrawin。
服务配置地址:https://github.com/EasyDarwin/EasyDarwin。
图:服务配置 |
(2).示例代码
//无人机视图,rtsp服务器ip地址,rtsp服务器端口号,推流id名称,服务注册回调
MediaManager.setVideoPushService(effectView,ip, port, id, callback)
MediaManager.startPush() //开始推送视频+姿态
MediaManager.stopPush() //停止推送
(3).推流结果
查看移动端的实时视频推流结果的情况。
图:查看移动端的实时视频推流结果 |
跨终端应用
将无人机的实时姿态、视频进行推流后,更利于多端协同。
案例截图如下:
图:案例截图1 |
图:案例截图2 |
图:案例截图3 |
图:案例截图4 |