# 交接内容
## DJI MSDK 复飞
### 开发环境
* Android studio最新版
* Java 1.8
* DJI SDK 4.14 DJI UXSDK 4.14
* 开发平台Windows/Mac OS
### 功能要求
* 可以记录保存航线到本地
* 加载录制的航线可以自动复线记录航线的内容
* 不同的无人机可以使用同一航点文件
* 支持RTK
* 支持各个大疆机型
### 实现方法
#### 录制复飞流程图
![image-20210608153932140](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210608153932140.png)

#### 任务控制

具体代码参考reflywidgetactivity.java的missionctrl函数

![image-20210608154218300](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210608154218300.png)

#### 数据存储

在Mylatlng文件中自定义list 数组，用于存储航点信息。需要存储的数据有无人机的GPS信息（lat,lng,alt），偏航角度uavYaw,航点模式waypointactiontype,相机焦距camera_length，云台角度pitch。在Recordwidgetactivity文件中，有个admission 函数，用于往空的数组中添加航点数据，开始录制时保持最大频率（10hz）记录数据，持续调用admission函数。当停止录制时，将list数组转成json格式并写入到txt文件，文件存储路径由savePath参数决定。当读取航点时，只需要把过程逆向即可，读取txt文件内容，转成list数组保存。

#### 数据处理

* 数据平滑：使用滑动平均法进行优化航点使之更加平滑
* 航点数据插值：航点数据插值间接提高控制指令的发送频率

#### 参数配置

具体代码在reflywidgetactivity.java的btn_start_drone.setOnClickListener这个按键监听事件中

* 打开虚拟摇杆
* 设置无人机坐标系为大地坐标系
* 设置虚拟摇杆rollpitch控制为速度
* 设置yaw控制为角度
* 设置垂直方向（throttle）为速度
#### 坐标系转换

由于GPS坐标系无法进行导航，所以需要将GPS坐标系转成北东天坐标系。具体转换方法看GpstoEnu.java文件

### 后续改进
* 添加了变焦功能但是还未验证
* 大型飞机复飞时不太稳定，如M300，需要进行优化，优化方向有两个，使用waypoint V2进行M300的任务控制，和优化控制器的设计，对PID进行调参，或者使用更有效的控制器。
## DJI MSDK 自主降落
### 功能要求
* 使用机载相机检测停机坪，检测到后自动控制无人机降落到停机坪中。
### 实现方法
* 将获取到的图传数据流转码成YUV数据供aruco模块使用,视频流转码参考代码https://github.com/DJI-Mobile-SDK-Tutorials/Android-VideoStreamDecodingSample
* 使用opencv的aruco作为目标检测的方法
* 将aruco检测计算的结果放入控制器计算得出结果，发送给无人机
* 高度还剩一米时调用DJI SDK一键降落的API进行降落
* 对相机进行标定，将标定得到的相机内参传写入应用中。具体表达方法看标定方法那个文档。
### 实现难点
* 问题：相机自动对焦会改变相机内参，导致标定得出的参数无法长时间使用。
* 解决方案：设置自动对焦距离为一个固定的值。
* 问题：使用打印机打印出来的标定板和检测板都不能满足标定和检测要求，原因是黑色不够黑。
* 解决方案：使用KT板打印制作标定板和检测板。
### 后续改进
* 已经实现了降落的功能，但是还只是demo阶段，只能实施降落部分，没有飞行界面，没有任务管理。这部分的工作可以参考DJI MSDK复飞的代码来实现。
* 紧急停机按键存在问题，在使用紧急停机按键时可以夺回遥控器对无人机的控制，但是app会闪退，由于我手中没有飞机，无法协助解决，杭电同学也不清楚如解决。
## phenix mini 无人车编队
### 功能要求
* 使用phenix mini飞控控制麦克纳姆轮小车在lighthouse定位系统下实现可视化scratch编队编程。
* phenix mini可以接收来自定位器的定位数据和控制指令
* phenix mini可以对接收到的命令做出响应
* phenix mini可以控制麦克纳姆轮小车移动
* 定位器能够通过通过接收来自PC的控制信号转发给phenix mini 飞控
### 实现难点
* 按照lighthouse文档配置飞控相关参数，在无人机模式下phenix mini和pixhawk4都可以实现对定位数据的接收解码，在无人车模式下两者都不可以
* phenix mini 不支持无人车模式，需要移植最新版的飞控到phenix mini，相关工作已交给陈鹏华
* 在使用pixhawk4 1.12版本固件的时候，修改了编译配置文件和一些启动脚本，重新编译PX4 1.12版本的固件，使之在无人车模式下QGC能够显示LPE相关参数，参数按照lighthouse文档进行设置，进行测试时报错：lpe:timeout.具体原因未知。
* 根据官方文档在接入外部定位数据只提供给了多旋翼和垂直起降固定翼。
https://docs.px4.io/master/en/ros/external_position_estimation.html
https://docs.px4.io/master/en/advanced/switching_state_estimators.html

## lighthouse 室内定位系统使用和配置调参
* 定位器使用，电脑连接Wi-Fi：RSTSWARM2 密码：RST12345678
* 设置电脑IP为192.168.1.234。
* 子网掩码为255.255.0.0
* 网关为192.168.1.1
* 启动scratch脚本和server IP即可实现对无人机的控制。


## phenix mini 远程开发服务器
### vnc
* 安装VNC
sudo apt install tigervncserver
* 配置VNC

启动vnc

```sh
vncserver
```

第一次启动按照提示输入密码，这个密码是用于登陆VNC的密码

后续想修改VNC密码可以使用如下命令实现

```sh
vncpasswd
```

修改xstartup文件内容

```sh
vi /home/用户名/.vnc/sxtartup
```

将内容替换为如下内容

```sh
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
startxfce4 &
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic 
```
重新启动VNC就可以使用VNC访问远程访问图形化界面了。

### zerotier
* 账号：developers@robsense.com
* 密码：robsense2015
* robsense是用于phenix远程开发的虚拟局域网。
### gitlab
* 账号：root
* 密码：robsense2015
* 访问地址（处于zerotier虚拟局域网中）：192.168.195.106



