文档更新

This commit is contained in:
yewuya 2023-05-16 20:30:29 +08:00
parent 24220c5453
commit 44e127967a
62 changed files with 10 additions and 3126 deletions

View File

@ -1,36 +0,0 @@
# M300降落测试
## 无人机相对降落板不同角度
## 无人机相对降落板不同距离的误差
## 无人机相对降落板不同方向的误差
## 无人机相对降落板不同高度的误差
## 不同光照条件下的降落测试
## 不同风力的降落测试

View File

@ -1,11 +0,0 @@
Pico 配置
LTAI5tDmuBc9sA3CDso9bwe3
MzzUtOfOKx7CK3rFoSckNvujkQGBF3
MzzUtOfOKx7CK3rFoSckNvujkQGBF3
yewuyadeimagewall
oss-cn-hangzhou

View File

@ -1 +1,4 @@
* 用于记录日常工作中遇到的问题和解决方法 * 用于记录日常工作中遇到的问题和解决方法
## 技术
[[ROS]]

25
ROS.md
View File

@ -1,22 +1,9 @@
[[ros python]]]
[[ros cpp]]
## 参数服务器 [[ros 命令]]
### 设置参数
```c++
ros::NodeHandle n;
n.setParam("camera/session", to_string(session));
```
### 获取参数
```c++
ros::NodeHandle n;
string session_s;
n.getParam("camera/session", session_s);
```

View File

@ -1,22 +0,0 @@
# WSL相关指南
## 修该WSL最大内存
WSL2默认可以使用的内存大小为主机的80%,对于Linux而言即使装了桌面,一般的开发也没必要给这么多内存,分多了,反而有可能卡主机的Windows
操作:
1.打开Windows资源管理器,地址栏输入 %UserProfile% 回车,在该目录下创建一个文件, 名字为 .wslconfig ,写入内容示例如下 (我电脑16GB内存,分给WSL内存4GB,另外设置交换分区4GB)
```sh
[wsl2]
memory=2GB
swap=4GB
localhostForwarding=true
```
cmd执行 wsl --shutdown 关闭WSL,再重新打开即可
## wsl文件位置
资源管理器中输入:`\\wsl$`

View File

@ -1,12 +0,0 @@
# amvlab 环境配置
```sh
source /home/aihangtec/Prometheus/devel/setup.bash
export GAZEBO_PLUGIN_PATH=$GAZEBO_PLUGIN_PATH:$/home/aihangtec/Prometheus/devel/lib
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$/home/aihangtech/Prometheus/Simulator/gazebo_simulator/models
export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$/home/aihangtec/Prometheus/Simulator/gazebo_simulator/amov_models
source /home/aihangtec/prometheus_px4/Tools/setup_gazebo.bash /home/aihangtec/prometheus_px4 /home/aihangtec/prometheus_px4/build/amovlab_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/home/aihangtec/prometheus_px4
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:/home/aihangtec/prometheus_px4/Tools/sitl_gazebo
```

View File

@ -1,6 +0,0 @@
录制和复页面飞切换
小范围连续转弯效果不好
![image-20210222154911901](C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210222154911901.png)

View File

@ -1,7 +0,0 @@
# conda 切换虚拟环境
```shell
conda env list //显示所有环境
conda activate my_test //切换到my_test环境
```

View File

@ -1,7 +0,0 @@
## 容器开机自启
```
docker ps -qa
docker update --restart=always 容器ID/容器名
docker update --restart=always 56f0b18af626
```

View File

@ -1,36 +0,0 @@
## 编辑frp 服务
```
sudo vi /etc/systemd/system/frpc.service
```
```
[Unit] #服务名称,可自定义
Description = frp client
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
Restart=on-failure
RestartSec=5s
#启动frps的命令需修改为您的frps的安装路径
ExecStart =/home/nvidia/frp_0.45.0_linux_arm64/frpc -c /home/nvidia/frp_0.45.0_linux_arm64/frpc.ini #路径修改
ExecReload=/home/nvidia/frp_0.45.0_linux_arm64/frpc reload -c /home/nvidia/frp_0.45.0_linux_arm64/frpc.ini #路径修改
[Install]
WantedBy = multi-user.target
```
## 配置frp服务开机自启
```
sudo systemctl daemon-reload # 刷新配置
sudo systemctl start frpc # 启动clash.service
sudo systemctl enable frpc # 设置开机启动
sudo systemctl status frpc # 查看clash.service的状态
```

View File

@ -1,93 +0,0 @@
# frp配置
下载文件
```shell
wget https://github.com/fatedier/frp/releases/download/v0.35.1/frp_0.35.1_linux_amd64.tar.gz
tar -zxvf frp_0.35.1_linux_amd64.tar.gz
cp -r frp_0.35.1_linux_amd64 frp
cd frp
ls -a
```
服务器端配置frps.ini文件内容如下
```shell
[common]
bind_port = 7000 # 云服务器服务端口
dashboard_port = 7500 # 网页控制台端口
token = 123456 # 密码
dashboard_user = yewuya # 控制台账号
dashboard_pwd = 1689458474Wu # 控制台密码
vhost_http_port = 10080
vhost_https_port = 10443
```
服务端配置完成之后运行
```
nohup ./frps -c frps.ini &
```
保持程序后台运行
客户端配置frpc.ini 文件内容如下
```shell
[common]
server_addr = 101.200.41.107 # 云服务器IP
server_port = 7000 # 云服务器服务端口
token = 123456 # 密码
[ssh] # 服务名称
type = tcp # 传输类型
local_ip = 127.0.0.1 # 本地IP
local_port = 22 # 本地服务的端口
remote_port = 6000 # 云服务器对应的端口
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6001
```
### frp客户端开机自启
创建服务文件
```sh
sudo vi /etc/systemd/system/frpc.serivce
```
文件内容如下
```sh
[Unit]
Description=Frp Client
After=network.target
Wants=network.target
[Service]
Restart=on-failure
RestartSec=5
ExecStart=/home/yewuya/frp/frpc -c /home/yewuya/frp/frpc.ini # 为fpc和frpc.ini的文件路径
[Install]
WantedBy=multi-user.target
```
开启开机自启服务相关命令
```sh
systemctl daemon-reload # 刷新服务列表
systemctl enable frpc # 设置frpc开机自启
systemctl disable frpc # 关闭frpc开机自启
systemctl start frpc # 启动frpc服务
systemctl stop frpc # 关闭frpc服务
```

View File

@ -1,18 +0,0 @@
# how it works
### What data is recorded
* We need to reproduce the flight path, so we need the GPS coordinates of each time of the drone
* We need to make sure the photos are the same, so we need to record the gimbal angle, the drone heading, and the camera activity at each time.
### How to control the drone
* We can control the drone to move in each direction by controlling the speed of the drone in the x, y and z axes, and then we can calculate the distance between the current GPS coordinates of the drone and the coordinates we want to reach, and substitute the result into the control algorithm to control the aircraft to any GPS coordinates in real time.
### How to control the camera
* The route we record is actually a very dense set of GPS coordinates, which we call waypoints, and each waypoint contains a lot of data, not just GPS coordinates. We can determine whether the camera needs to work based on the camera activity stored in the waypoint, and if it needs to work, control the drone to stay in place, adjust the gimbal angle and execute the camera task, and then continue to the next waypoint after the execution is completed.
Translated with www.DeepL.com/Translator (free version)

View File

@ -1,12 +0,0 @@
# lantronix--minifly wifi配置
* PC先连接AP 的wifi 名称RSTSWARM2 密码RST12345678
* 更改WiFi 的网络设置如图所示
![ip配置](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/ip%E9%85%8D%E7%BD%AE.png)
* 浏览器访问飞机的IP地址飞机的IP地址为192.168.2.1XX。XX为飞机上标签的后两位。如标签为026 则飞机的IP为192.168.2.126。网页的账号admin 密码PASSWORD
* 登录之后即可根据页面配置定位器的WiFi数据可配置参数太多就不列举了自行检索。

View File

@ -1,165 +0,0 @@
# log 实训
## log简介
**log的定义**:日志是将软件运行的状态、过程等信息,输出到不同的介质中(例如:文件、控制台、显示屏等),并进行显示和保存。为软件调试、维护过程中的问题追溯、性能分析、系统监控、故障预警等功能,提供参考依据。可以说,日志的使用,几乎占用的软件生命周期的至少 80% 的时间。
**log的重要性**:对于操作系统而言,由于其软件的复杂度非常大,单步调试在一些场景下并不适合,所以日志组件在操作系统上几乎都是标配。完善的日志系统也能让操作系统的调试事半功倍.
**log的作用**
* *** 确定程序的运行路径 *** 一个函数有没有被调用,一个 if 块有没有被执行,一个 while 循环执行了几次,到了哪一步中断了,都可以通过 输出出相关信息来查看。
* *** 查看变量的状态 *** 程序自身的报错会告诉你发生了什么错误,但你还需要找出为什么会发生错误。**通过 log输出出错语句涉及到的相关变量的值和类型**,可以帮助分析出错原因。
* *** 找出出错位置 *** 往往错误的原因并不在报错的位置,所以多输出一些标记,多 输出不同位置的变量值,**查看变量在运行过程中值的变化情况**,可以观察是在哪里发生了问题。
## px4 log使用
#### 代码添加log输出
在飞控开发过程中可以使用以下代码进行log调试根据不同的错误级别在相应的部分插入相应的信息。不同的信息代表不同的情况info一般用来表示重要功能完成了。warn表示发生异常但不影响系统使用err代表使用已经影响到了系统的工作必须马上解决问题。
```c++
PX4_INFO("输出需要的数据");
PX4_WARN(" 输出警告信息");
PX4_ERR("输出错误信息" );
```
在代码的需要的位置插入这三种log输出代码原则如下
**多输出一些辅助信息**,方便自己查看,不然一堆数据看花眼。一般输出时会标注上**变量名,再输出变量类型,以及变量的值**
**在出错行之前输出**。报错行涉及的一些变量,把他们的数值和类型,全都输出出来,看看和预期是否一致。
**一行做一件事 **。如果你出错的一行里连续调用了多个函数或运算,要分开写,分开输出。
### nsh调试
debug方式主要分仿真器调试和真机调试一般都是先进行软件仿真调试再进行真机调试。二者调试时的终端都会输出log信息。根据输出的log信息可以快速定位问题所在。也可以在把编译生成的固件写入飞控之后飞控连接[QGC地面站][http://qgroundcontrol.com/ ]之后打开mavlink console也可以运行自己所写的module.仿真器和QGC地面站都可以输入help来查看有效的命令和语法.这里以px4_simple_app为例,下图是在jmavsim仿真器运行px4_simple_app时所输出的log信息。
![image-20210122161137944](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210122161137944.png)
![image-20210122154447764](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210122154447764.png)
### 日志分析
#### logger
px4 的logger会把订阅的uorb消息记录成.ulg文件存在SD卡中logger可以订阅任何uorb消息并且可以进行配置选择需要的消息主题和频率.logger输出保存ulog文件也可以通过mavlink向客户端发送ulog数据.这两个后台任务可以同时进行.
**logger实现**
使用两个线程:
- 主线程以固定速率运行(如果以-p参数启动的话则轮询主题并检查数据更新
- 写入线程,将数据写入文件
两个线程之间有一个可配置大小的写入缓存区。
logger默认情况下飞机解锁之后就会开始记录日志,飞机锁定之后停止记录日志.也可以在终端使用logger on手动开启.logger off停止记录.日志记录的主要内容为飞行数据和debug信息记录的日志文件可以用于对飞机的系统和飞行性能的评估、调整和事故分析.日志的格式是ulog.记录的日志文件会存储成.ulg文件存在SD卡中.可以安装使用pyulog查看日志信息.
**logger 命令**
```
logger <命令> [参数...]
命令:
start
[-m <val>] 后端模式
可选: file|mavlink|all, 缺省: all
[-e] 启动后立即开始记录,直到上锁(否则只在解锁后开始记录)
[-f] 记录直到关闭为止(包含 -e)
[-t] 使用日期/时间命名日志目录和文件
[-r <val>] 记录速率单位Hz值为0则不限速
缺省: 280
[-b <val>] 记录缓存大小单位KiB
缺省: 12
[-q <val>] mavlink模式下uORB队列大小
缺省: 14
[-p <val>] 轮询主题而不是以固定速率运行(记录速率和主题间隔将被忽略)
可选: <topic_name>
on 立即开始记录,覆盖解锁(日志系统必须在运行中)
off 立即停止记录,覆盖锁定(日志系统必须在运行中)
stop
status 打印状态信息
```
**pyulog安装方法**
```shell
git clone https://github.com/PX4/pyulog.git
cd pyulog
python setup.py build install
```
pyulog常用命令
```shell
ulog2csv sample.ulg //将sample.ulg文件转成.csv文件这些文件可以使用excel打开
ulog_messgaes sample.ulg //查看ulog中的uorb的消息
ulog_info sample.ulg //显示sample.ulg记录的信息
ulog_params sample.ulg //查看sample.ulg文件的参数
```
下方是ulg文件转成csv后的几个比较重要的文件和所记录的信息。
airspeed_0.csv 存放了飞行的指示空速和滤波前后的真空速
vehicle_attitude_0.csv 存放了四元数及pqr
vehicle_attitude_setpoint_0.csv 存放了期望的姿态角及四元数、油门信息
tecs_status_0.csv 存放了滤波后的高度、速度、加速度信息及期望的高度、速度、加速度信息以及跟总能量有关的一些参数
actuator_outputs_0.csv、actuator_outputs_1.csv 存放了输出混控器的pwm信号其中0是main out 1是aux out分别由主处理器和协处理器输出
actuator_controls_0_0.csv 存放了输入混控器的归一化数据
ekf2 两个文件中存放着互补滤波的数据更新
home_position_0.csv 存放着地面站所在位置
日志记录的消息主题也可以自己定义的,通过创建SD卡中的etc/logging/logger_topics.txt文件可以自定义记录需要的日志消息主题.一旦使用这个文件就会自动替换全部的默认主题.文件内容格式如下.
```text
<topic_name> <interval> <instance>
```
topic_name 就是所要订阅的消息主题的名称
interval 是消息之间的间隔.如果指定了则定义该主题的两条日志消息之间的最小间隔单位为ms。如果不指定则以全速率记录该主题.
instance是消息的实例,如果不指定就记录该消息主题的所有实例,指定就记录相应的实例.如果不指定就记录该消息主题的所有实例.
例子如下
```text
sensor_accel 0 0
sensor_accel 100 1
sensor_gyro 200
sensor_mag 200 1
```
使用前的记录的数据
![image-20210122174608467](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210122174608467.png)
替换后的数据
![image-20210122174633579](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210122174633579.png)

View File

@ -1,18 +0,0 @@
# matlab破解方法
## 安装
解压安装包双击setup安装高级选项选择我有安装密钥
**09806-07443-53955-64350-21751-41297**
选择许可证文件文件路径
许可证/license/license_standalone.lic
一直下一步完成安装
安装完成后复制Crack/libmwlmgrimpl.dll文件到安装路径**`C:\Program Files\Polyspace\bin\win64\matlab_startup_plugins\lmgrimpl`**
替换原先的文件即可。

View File

@ -1,8 +0,0 @@
# msdk 御2 自主降落
获取视频流并进行人脸识别(在iOS端实现的) https://github.com/zyphs21/VisionDetect
msdk获取避障信息代码(有效值为0.3到5m不在这个范围的数据无效) 主要是下视避障计算的结果(障碍物的距离)https://github.com/dji-sdk/Mobile-SDK-Android/blob/master/Sample%20Code/app/src/main/java/com/dji/sdk/sample/demo/flightcontroller/FlightAssistantPushDataView.java
msdk直播推流代码(推流延迟大概在1-3s) https://github.com/dji-sdk/Mobile-SDK-Android/blob/master/Sample%20Code/app/src/main/java/com/dji/sdk/sample/demo/camera/LiveStreamView.java

View File

@ -1,130 +0,0 @@
```
sudo vi /etc/udev/rules.d/DJIDevice.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="2ca3", MODE="0666"
sudo usermod -a -G dialout $USER
echo "deb https://mirrors.bfsu.edu.cn/ros/ubuntu/ focal main" >> /etc/apt/sources.list.d/ros-latest.list
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
echo "SUBSYSTEM=="usb", ATTRS{idVendor}=="2ca3", MODE="0666"" >> /etc/udev/rules.d/DJIDevice.rules
```
```
sudo usermod -a -G dialout $USER
echo "deb https://mirrors.bfsu.edu.cn/ros/ubuntu/ bionic main" >> /etc/apt/sources.list.d/ros-latest.list
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
echo "SUBSYSTEM=="usb", ATTRS{idVendor}=="2ca3", MODE="0666"" >> /etc/udev/rules.d/DJIDevice.rules
sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.bfsu.edu.cn@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.bfsu.edu.cn@g" /etc/apt/sources.list
sudo apt update
sudo apt install ros-melodic-desktop-full
sudo apt install libsdl2-dev ros-melodic-nmea-comms libcrypto++-dev
sudo apt install libexosip2-dev
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
```
## 允许root 登录
编辑sshd_config
sudo vim /etc/ssh/sshd_config
找到PermitRootLogin 取消注释 然后改为yes
重启ssh 服务
service sshd restart
```
#LoginGraceTime 2m
PermitRootLogin yes
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
```
## frp 配置
service 文件编写
sudo vi /etc/systemed/system/frpc.service
```shell
[Unit]
# 服务名称,可自定义
Description = frpcs server
After = network.target syslog.target
Wants = network.target
[Service]
Type = simple
Restart=on-failure
RestartSec=5s
# 启动frps的命令需修改为您的frps的安装路径
ExecStart = /root/ah/frp_0.45.0_linux_arm64/frpc -c /root/ah/frp_0.45.0_linux_arm64/frpc.ini
ExecReload= /root/ah/frp_0.45.0_linux_arm64/frpc reload -c /root/ah/frp_0.45.0_linux_arm64/frpc.ini
[Install]
WantedBy = multi-user.target
```
开机自启
```shell
sudo systemctl daemon-reload # 刷新配置
sudo systemctl start frpc # 启动clash.service
sudo systemctl enable frpc # 设置开机启动
sudo systemctl status frpc
```
## crontab 开机自启
```shell
@reboot sleep 2;bash shell.sh
```
## ubuntu 文件系统修复
```shell
fsck -y /dev/sda1 # /dev/sda1 要修复的硬盘路径
```
### ros代码开机自启
```shell
sudo apt-get install ros-melodic-robot-upstart #安装依赖
rosrun robot_upstart install dji_osdk_ros/launch/dji_vehicle_node.launch #设置ros服务
sudo systemctl daemon-reload && sudo systemctl start dji #启动ros 服务
rosrun robot_upstart uninstall dji #删除开机自启服务
```

View File

@ -1,50 +0,0 @@
# phenix mini 开发环境
* 下载代码
git clone http://192.168.195.106/root/flight_control.git
解压gcc 和modules
modules 文件夹移入.git 文件夹
gcc 文件夹移入etc/文件夹下(这部已经完成不需要做)
编辑.profile 文件
打开终端输入如下命令(rst为用户名自行替换)
```
vi /home/rst/.profile
```
在最后一行插入以下内容其中rst为用户名要根据自己用户名进行替换
```shell
export PATH=/etc/gcc-arm-none-eabi-7-2017-q4-major/bin:$PATH
```
保存退出之后运行一次.profile文件使修改生效终端执行如下命令
```sh
source .profile
```
之后使用cd进入到flight_control文件夹即可编译
编译命令
```cmake
make px4fmu-v4_default
```
windows 安装使用 MobaXterm 选择session vnc 输入IP和端口号之后输入密码
Mac 使用自带的屏幕共享 输入IP 192.168.3.124:5901 最后面的5901是端口号

View File

@ -1,22 +0,0 @@
# phenix mini 无人车编队
### 之前进展
* 找到了phenix mini 控制无人车的方法,但是物料还未到达无法实施
* 根据资料和参考之前的硬件连接方法使用phenix mini 的uart接口连接定位器经过测试连接时没反应后续需要何鹏鑫帮忙分析下定位器原理图正确连线引出需要的数据
### 待解决问题
* phenix mini 控制小车移动
* phenix mini和定位器之间的通信
### 未来计划
#### phenix 控制小车移动
* 重写px4无人车混控器修改小车模式的混控器使之能够控制麦克纳姆轮的小车4月13日
* px4无人车的位置控制可能也需要修改
#### phenix mini 和定位器之间的通信
* 等待何鹏鑫帮忙找到合适方法把定位器发送的数据用uart接口引出
* phenix mini 的mavlink intsance 数量已达四个需要删掉两个以供定位器使用选出两个instance并删除删除之后配置phenix mini 的mavlink 使得phenix可以正常接收定位器的数据和指令
* 修改phenix mini 的代码使之使用lighthouse定位系统的坐标作为当前的位置并以此进行位置控制
* 重写PC端的发送程序之前的发送程序不适合给phenix mini 使用

View File

@ -1,21 +0,0 @@
# phenix mini 移植px4 1.12的无人车代码
* phenix mini 是基于PX4 1.7.3修改而来的
phenix mini在切换到无人车模式后不论哪种车型都没有PWM输出。
后发现使用PX41.11和1.12版本固件的飞控可以输出PWM只是因为PX4没有支持麦克纳姆轮的车型无法做到控制无人车正常移动
刚开始以为是因为混控器方面的问题就参考1.12版本的混控器配置文件把1.12的混控器配置文件移植到phenix mini 移植之后发现也没有PWM输出。后查阅资料发现px41.7.3 版本的无人车模式存在bug有无人车模式但是没有PWM输出同时PX4官方也没有把无人车的代码加入到集成测试中所以也不清楚具体问题出在哪里。如下链接是关于这个问题的相关讨论
[no pwm output in rover mode · Issue #10221 · PX4/PX4-Autopilot (github.com)](https://github.com/PX4/PX4-Autopilot/issues/10221)
[NO PWM SIGNAL OUT - Pixhawk (Rover) - Discussion Forum, for PX4, Pixhawk, QGroundControl, MAVSDK, MAVLink](https://discuss.px4.io/t/no-pwm-signal-out-pixhawk-rover/5920)
和无人车相关的代码有lib中的ROMFS/px4fmu_commom文件夹下的内容
![image-20210426182153765](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210426182153765.png)
其中mixer中是不同机型的混控器配置文件init.d文件夹是不同机型的初始化配置
Src/lib文件夹下的mixeroutput_limit ,pwm,src/modules文件夹下的px4iofirmware,rover_pos_control,这些代码都和无人车的控制相关可能还有部分未列出的由于1.7.3和1.12的版本时间间隔过长等原因导致这两个版本的代码风格和软件架构发生了挺多变化很多东西不是一脉相承的增加了移植的难度而且由于不清楚究竟是哪部分原因导致的1.7.3版本无人车模式没有PWM输出所以可能需要把无人车相关的全部代码都移植到phenix mini中去或者选择找到PWM没有输出的原因修复这个BUG这两者所消耗的时间并不清楚可能找出bug比移植更加耗费时间。

View File

@ -1,161 +0,0 @@
# phenix mini 远程开发环境搭建
## 虚拟局域网
官网[ZeroTier Global Area Networking](https://www.zerotier.com/)
Linux下载安装
```sh
curl -s https://install.zerotier.com | sudo bash
```
其他平台官网下载安装包安装
网络id 1c33c1ced015b57c
Linux 使用如下命令添加
```sh
sudo zerotier-cli join 1c33c1ced015b57c
```
mac 打开软件后找到图标点击join network 输入网络ID 点击join即可其他默认
windows类似操作
![image-20210511184416883](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511184416883.png)
加入网络后需要管理员进行配置,可以私信通知管理员配置
## VNC远程访问ubuntu 图形化界面
windows 推荐使用Mobaxterm 安装好之后点击session --vnc 输入IP和端口号即可
Mac 使用自带的屏幕共享 输入IP端口号即可
之后输入密码就可以访问服务器的图形界面
## 开发环境配置
访问gitlab 服务器找到flight control 项目下载代码
[项目 · 仪表板 · GitLab](http://192.168.195.106/)
解压modules.zip
modules 文件夹移入.git 文件夹
.git 文件夹是隐藏文件,需要键盘按 ctrl + H 显示
也可以直接打开终端执行如下命令
```shell
git clone http://192.168.195.106/root/flight_control.git
cd flight_control/
unzip modules.zip
cp -r modules .git/
```
编辑.profile 文件
打开终端输入如下命令(rst为用户名自行替换)
```
vi /home/rst/.profile
```
在最后一行插入以下内容其中rst为用户名要根据自己用户名进行替换
```shell
export PATH=/etc/gcc-arm-none-eabi-7-2017-q4-major/bin:$PATH
```
保存退出之后运行一次.profile文件使修改生效终端执行如下命令
```sh
source .profile
```
之后使用cd进入到flight_control文件夹即可编译
编译命令
```cmake
make px4fmu-v4_default
```
## vs code远程开发
#### 远程插件配置
安装插件 Remote Development重启vs code
按图示顺序点击+号
![截屏2021-05-11 下午6.08.21](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/%E6%88%AA%E5%B1%8F2021-05-11%20%E4%B8%8B%E5%8D%886.08.21.png)
按照这个格式: ssh 用户名@服务器IP -A 输入
例子 ssh wujinhui@192.168.195.106 -A
![image-20210511180052204](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511180052204.png)
选择第一个默认地方保存即可
![image-20210511180312646](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511180312646.png)
也可以点击设置按钮选择配置文件进入详细配置,这个一般不需要进行配置
Host 名称
Host name 服务器IP
User 用户名
Port 端口号 默认22
![image-20210511181303382](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511181303382.png)
点击如图图标新建窗口
![截屏2021-05-11 下午6.29.20](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/%E6%88%AA%E5%B1%8F2021-05-11%20%E4%B8%8B%E5%8D%886.29.20.png)
选择继续
![image-20210511180506265](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511180506265.png)
输入密码
![image-20210511180621756](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511180621756.png)
登录进入之后就可以本地使用vs code一样进行操作了
#### 代码编译
打开终端,也可以使用快捷键打开,不同平台不太一样,自行搜索
![image-20210512154537012](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210512154537012.png)
输入编译命令
```makefile
make px4fmu-v4_default
```
等待编译完成即可
编译完成的文件需要通过sftp 下载到本地,编译生成的固件路径 /build/px4fmu-v4_default/px4fmu-v4_default.px4
windows 个人推荐 [MobaXterm free Xserver and tabbed SSH client for Windows (mobatek.net)](https://mobaxterm.mobatek.net/)
Mac个人推荐 [electerm/electerm: 📻Terminal/ssh/sftp client(linux, mac, win) (github.com)](https://github.com/electerm/electerm)
下载到本地之后使用QGC把固件写入飞控当中

View File

@ -1,32 +0,0 @@
# px4使用外部定位器VR定位器
### 定位数据发送到PX4
* 定位数据使用mavlink发送数据包为 ATT_POS_MOCAP,频率30Hz 通过串口发送
### 代码编译设置
* px4 版本 1.7.3
* 将如下代码复制到cmake/configs/nuttx_px4fmu-v4z-default.cmake这个路径中去
```cmake
set(PARAM_DEFAULT_OVERRIDES "{\\\"SYS_MC_EST_GROUP\\\": 1}")
```
![image-20210414095940692](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210414095940692.png)
* 编译生成固件刷入飞控
### QGC参数配置
* SYS_MC_EST_GROUP 选择local_position_estimator
![image-20210414093631393](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210414093631393.png)
* LPE_FUSION 只选择fuse vision position
![LPE_FUSION](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/LPE_FUSION.png)
* ATT_EXT_HDG_M 选择vision
![ATT_EXTHDG_M](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/ATT_EXTHDG_M.png)

View File

@ -1,7 +0,0 @@
# px4飞控常见报错及解决办法
* # Power redundancy not met: 0 instead of 1
setting COM_POWER_COUNT to 0

View File

@ -1,23 +0,0 @@
# qv2ray
* Register an account at this site
https://j01.space/waf/rAOIEGWKZSRb2iwU2
* Copy subscription link
![image-20210201112412756](C:\Users\ASUS\Desktop\mymarkdown\images\image-20210201112412756.png)
* Paste the subscription link and update it
Click on the group and set the group as a subscription link, copy the subscription link to the specified location, and finally click ok
![image-20210201112720673](C:\Users\ASUS\Desktop\mymarkdown\images\image-20210201112720673.png)
![image-20210201113017450](C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20210201113017450.png)
* Test the delay and enable it
Right click on the group and find the test delay. Select the proxy server according to the latency information, this result is only the latency not the network speed, the network speed should be measured by yourself. After selecting the server, click Start.
![image-20210201134114883](C:\Users\ASUS\Desktop\mymarkdown\images\image-20210201134114883.png)

View File

@ -1,44 +0,0 @@
# ubuntu Qv2ray安装和使用
## 安装
下载
* v2ray core
https://github.com/v2fly/v2ray-core/releases/download/v4.34.0/v2ray-linux-64.zip
* 安装qv2ray
打开terminal运行以下命令安装qv2ray
```sh
sudo snap install qv2ray
```
* 配置v2ray core
[下载](https://github.com/v2fly/v2ray-core/releases/download/v4.34.0/v2ray-linux-64.zip)并解压v2ray core 至任意位置但不能和qv2ray执行文件在统一路径下。
双击打开qv2ray 依次点击 首选项==》内核设置
1号位置的路径是解压后的文件夹中的v2ray文件
2号位置的路径是解压后的文件夹所在的路径
## 使用
v2ray订阅链接在购买服务的网站上有提供不同网站的订阅链接的具体位置不太一样不过一般都是首页会找到一个订阅设置相关的页面里面会有各种订阅方式的订阅 链接 例如ssr v2ray clash之类的。找到并复制v2ray订阅链接
依次点击 分组 ---》订阅设置---》此分组是一个订阅---》再在订阅链接的位置粘贴v2ray 订阅链接。之后更新订阅链接即可。
回到主页面之后选择线路并启动即可。
![image-20210201134114883](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210201134114883.png)
![image-20210904093105978](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210904093105978.png)
![image-20210201134114883](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210201134114883.png)

View File

@ -1,30 +0,0 @@
# ubuntu xrdp
### ubuntu服务器安装
```
sudo apt autoremove xrdp
sudo add-apt-repository ppa:martinx/xrdp-hwe-18.04
sudo apt-get update
sudo apt-get install xrdp xorg
sudo adduser xrdp ssl-cert
sudo reboot
```
### Windows客户端
使用远程桌面连接.搜索栏直接搜索即可.打开之后输入Ubuntu服务器的IP地址即可
xrdp 延迟测试
网线直连平均延迟小于1ms,rdp画质分辨率都开最高极限带宽
| 连接方式 | 延迟 | 带宽 | 画质等级 | 实际效果 |
| ---------------------- | ---- | ------- | --------- | --------------------------- |
| 网线直连局域网 | <1ms | 100Mbps | 1920*1080 | 延迟还行,降一档分辨率会更好 |
| 同一WiFi局域网 | 10ms | 20Mbps | 1280*720 | 延迟比较大,但用着还可以 |
| 云服务器(北京的服务器) | 40ms | 5Mbps | 1024*768 | 基本无法使用,延迟太大 |
| | | | | |
![rdp延迟](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/rdp%E5%BB%B6%E8%BF%9F.png)

View File

@ -1,45 +0,0 @@
# ubuntu 下vnc的使用
vnc安装
vnc更换桌面
vnc启动
```shell
vncserver -geometry 1920x1080
```
```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连接
* Mac
启动screensharing输入IP和端口号输入密码
* Windows
启动mobaxterm 找到vnc 输入IP和端口号输入密码
* Ubuntu
安装vnc viewer
*
*

View File

@ -1,59 +0,0 @@
# vs code 远程开发教程
#### 远程插件配置
安装插件 Remote Development重启vs code
按图示顺序点击+号
![截屏2021-05-11 下午6.08.21](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/%E6%88%AA%E5%B1%8F2021-05-11%20%E4%B8%8B%E5%8D%886.08.21.png)
按照这个格式: ssh 用户名@服务器IP -A 输入
例子 ssh wujinhui@192.168.195.106 -A
![image-20210511180052204](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511180052204.png)
选择第一个默认地方保存即可
![image-20210511180312646](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511180312646.png)
也可以点击设置按钮选择配置文件进入详细配置,这个一般不需要进行配置
Host 名称
Host name 服务器IP
User 用户名
Port 端口号 默认22
![image-20210511181303382](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511181303382.png)
点击如图图标新建窗口
![截屏2021-05-11 下午6.29.20](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/%E6%88%AA%E5%B1%8F2021-05-11%20%E4%B8%8B%E5%8D%886.29.20.png)
选择继续
![image-20210511180506265](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511180506265.png)
输入密码
![image-20210511180621756](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210511180621756.png)
登录进入之后就可以本地使用vs code一样进行操作了
#### 代码编译
打开终端 查看
输入编译命令
```makefile
make px4fmu-v4_default
```
等待编译完成即可

View File

@ -1,38 +0,0 @@
# wsl2 卸载和转移安装路径
## 查看已安装wsl2
```sh
wsl -l --all -v
```
## 导出wsl2系统为tar文件到D盘
```sh
wsl --export Ubuntu-18.04 d:\wsl-ubuntu18.04.tar
```
## 卸载wsl2 系统
```sh
wsl --unregister Ubuntu-18.04
```
## 重新导入wsl2系统并安装在D盘
```sh
wsl --import Ubuntu-18.04 d:\wsl-ubuntu18.04 d:\wsl-ubuntu18.04.tar --version 2
```
## 设置导入后的系统的默认登陆用户为安装时用户名
```sh
ubuntu1804.exe config --default-user yewuya
```
## 删除tar文件
```sh
del D:\wsl-ubuntu18.04.tar
```

View File

@ -1,46 +0,0 @@
# zerotier使用
## 安装
Windows直接下载
Linux执行以下命令自动安装
```sh
curl -s https://install.zerotier.com | sudo bash
```
## 加入网络
```sh
zerotier-cli join 9bee8941b576f25f
```
## 创建moon节点
### 服务器安装zerotier
```sh
curl -s https://install.zerotier.com | sudo bash
```
### 创建并编辑moon.json
```sh
cd /var/lib/zerotier-one
zerotier-idtool initmoon identity.public > moon.json
vi moon.json
"stableEndpoints": ["110.40.176.117/9993"] #找到并修改为以上内容
```
## 加入moon节点
```sh
zerotier-cli orbit d7945cc8a8 d7945cc8a8
```
### truenas scale 使用
参考[zyclonite/zerotier - Docker Image | Docker Hub](https://hub.docker.com/r/zyclonite/zerotier/)

View File

@ -1,9 +0,0 @@
[[# zerotier内部使用
官网[ZeroTier Global Area Networking](https://www.zerotier.com/)
账号developers@robsense.com
密码robsense2015
开发服务器IP 192.168.195.106

View File

@ -1,221 +0,0 @@
# 中国计量大学现代科技学院本科毕业设计(论文)
## 基于Android的无人机自动巡检
**郑 重 声 明**
本人呈交的毕业设计论文,是在导师的指导下,独立进行研究工作所取得的成果,所有数据、图片资料真实可靠。尽我所知,除文中已经注明引用的内容外,本学位论文的研究成果不包含他人享有著作权的内容。对本论文所涉及的研究工作做出贡献的其他个人和集体,均已在文中以明确的方式标明。本学位论文的知识产权归属于培养单位。
## 摘要
随着无人机技术的发展,无人机在各个领域都发挥了巨大的作用,但是无人机的保有量年年升高,无人机操作员的数量却一直增长缓慢,培养一个优秀的无人机操作员需要一两年的时间,而生产一架无人机只需要一天甚至更短的时间。无人机操作员的培养是困难的,但是如果通过软件实现无人机自动巡检,通过软件代替人操作之后,在软件开发完成之后,软件就会取代人的作用,且软件的复制是极为迅速的,可以迅速填补无人机操作员的空缺。
本文设计了一款实现简单,同时效果不错的无人机自动化巡检软件,通过使用该软件巡检人员只需要录制一遍标准的航线,之后就可以通过装载航线实现全自动的巡检,将大大提高无人机巡检的效率,同时减小了对无人机操作员的要求,无人机操作员只需要会基本的无人机操作就可以完成巡检工作。
## Abstract
With the development of drone technology, drones play a huge role in various fields, but the number of drone ownership rises year after year, the number of drone operators has been growing slowly, and it takes one or two years to train a good drone operator, while it takes only one day or even less to produce a drone. The training of drone operators is difficult, but if automatic drone inspection is achieved through software, after the software replaces human operation, the software will take over the role of human after the software development is completed, and the software is extremely fast to replicate and can quickly fill the vacancies of drone operators.
This paper designs a simple to implement, while the effect is good UAV automatic inspection software, by using the software inspectors only need to record the standard route once, after which they can achieve fully automatic inspection by loading the route, will greatly improve the efficiency of the UAV inspection, while reducing the requirements of the UAV operator, the UAV operator only needs to know the basic UAV operation can complete the inspection work.
## 目次
### 绪论
#### 引言
无人机技术的发展,无人机的优势,无人机数量远大于飞手数量,飞手培养难度大
无人机(Unmanned Aerial Vehicle),即无人驾驶飞行器,通常被称为无人驾驶飞机或无人驾驶飞机系统,是不需要人类飞行员操作的飞机,是一种由空气动力或电力驱动的航空器,人可以在地面通过无线电遥控或预编的程序来控制其飞行。
无人机分为三个大类,多旋翼无人机,固定翼无人机,无人机直升机,其中无人直升机最大的优势是灵活性强,可以随时随地垂直起飞和在空中悬停,但是其结构复杂,维护困难,同时成本较高;固定翼无人机在军用和民用领域应用较广泛,其飞机尺寸一般较大,其主要优点是飞行速度快、时间长、距离远、负载量大,缺点是不能定点悬停,因此相对多旋翼无人机和无人直升机其灵活性和功能性会大大降低。多旋翼无人机结构简单,操纵灵活,成本较低,在现阶段应用十分广泛。
随着技术的发展无人机在工业巡检发挥着越来重要的作用,现在无人机巡检已经广泛应用到各种巡检场景之中,如电网巡检,风力发电巡检,输油管道巡检,无人机在这些场景中的应用大大提高了巡检的效率,为了经济的发展做出了贡献 。
#### 研究目的与意义
随着无人机在巡检方面的应用的范围和规模越来越大产生了自动化巡检的需求现如今无人机的保有量已经达到数十万架而合格的无人机操作员只有几万人并且无人机操作员的培养是缓慢的一个合格的无人机操作员可能要一两年的时间但是一架无人机可能一个小时就生产出来了。无人机操作员的培养是困难的但是如果通过软件实现无人机自动巡检通过软件代替人操作之后在软件开发完成之后软件就会取代人的作用且软件的复制是极为迅速的可以迅速填补无人机操作员的空缺。本文的目的就是设计一款无人机的自动化巡检app。
### 相关技术分析
#### Android开发
Android是一种基于Linux的自由及开放源代码的操作系统Android 分为四个层,从高层到低层分别是应用程 序层、应用程序框架层、系统运行库层和 Linux 内核层。谷歌公司推出了开源的Android 系统现在应用非常广泛开发环境不会受到各种条条框框的限制开发者任意修改开放的源代码来实现与开发各种实用的手机App软件具有高级图形显示、界面友好等特点。Android 系统因其免费开源的特性受到广大个人开发者和企业的青睐同时网上存在大量的应用实例和开发经验因此选择android 作为开发平台,可以减小我们的开发难度。
#### 无人机
#### 大疆SDK
### 系统分析与设计
#### 需求分析
为了能够实现无人机的自动化巡检,需要实现能够在录制过程中实时记录无人机的飞行数据,同时保存下来,在复飞的时候能够根据这些信息进行复现录制时无人机的飞行轨迹和动作。同时为了后期数据分析,优化效果需要有日志记录的功能。故本次毕业设计的需求共有以下四种,航点数据记录,航点数据处理,飞行控制,飞行日志记录。
##### 航点数据记录
要想要实现复飞中能够准确的复现录制时的飞行轨迹和无人机动作就需要最大可能的记录飞行的数据需要记录的数据主要包括无人机的实时GPS信息和无人机的航向同时还需要记录无人机的云台相机的数据包括是否拍照是否录像。根据GPS信息可以记录无人机的飞行轨迹根据云台相机信息可以记录无人机在什么时候怎么拍照的。通过以上信息就可以复现无人机录制时候的飞行轨迹个和飞行动作。
##### 航点数据处理
由于无人机的GPS更新频率只有10HZ 这个频率的数据并不能满足飞行控制的需求且记录的数据不够平滑直接使用原始数据来控制无人机的飞行会导致无人机的飞行不够平稳飞行过程中会存在抖动。同时由于无人机记录的GPS信息是大地坐标系也叫经纬高坐标系LLA: Longitude Latitude Altitude是无法直接用于导航控制的所以需要将航点文件的中的坐标部分转换成站心坐标系也叫东北天坐标系ENU: East North Up故航点数据处理一共要执行三个操作首先是将航点文件记录的GPS信息由大地坐标系转成东北天坐标系之后对转化后的数据做一次数据平滑的操作最后对航点数据进行插值处理手动提高控制频率。
##### 飞行控制
因为要复现录制过程中完整的飞行轨迹所以无人机的飞行控制不能使用waypoint模式也就是航点模式航点模式飞行虽然更加稳定但是航点模式有个缺陷就是航点与航点之间是直线飞行且航点之间的距离有最小限制实测结果最小距离在3M的时候效果会比较出色但是这样就无法实现完全复现录制时的全部飞行细节所以无法通过waypoint模式来实现飞行控制DJI SDK 提供了另外一种飞行方式,可以通过发送虚拟摇杆命令的形式控制无人机的飞行,这个模式可以满足需求。
由于在巡检过程中还需要无人机执行拍照或者录视频的动作来采集数据,所以需要无人机无人机在自动复飞的时候也可以准确复现无人机的拍照动作,同时由于无人机拍照或者录视频需要在指定地点拍出来的东西才有价值,所以需要精准控制无人机的拍照位置,保证无人机自动复飞时候的拍照点和录制时候的拍照点位置误差很小,这样自动复飞任务才有价值。
##### 飞行日志记录
由于无人机在飞行过程中很难由人眼或其他设备直接近距离观察无人机的飞行状况,无人机也有时会发生事故或者飞行不稳定。为了分析事故的原因,就需要把无人机在飞行过程中产生的数据记录下来,可以根据数据分析无人机发生事故的原因,同时也可以根据无人机的飞行数据对无人机的控制进行调优,优化无人机的飞行状况。
#### 可行性分析
* 航点数据记录 通过DJI SDK可以以10HZ的频率获取到无人机的飞行信息同时也可以获取到当前无人机的云台角度和相机状态。
* 航点数据处理 可以写一个函数,实现对数据的转换和处理
* 飞行控制 通过DJI SDK的虚拟摇杆命令可以模拟遥控器发出的控制指令从而达到控制无人机飞行的效果同时可以通过DJI SDK的action实现无人机的拍照控制
* 飞行日志记录 可以自定义日志文件并保存到本地
* 综上所述整个系统是可以实现的。
#### 系统总体设计
根据需求分析整个系统存在两个核心一个是录制航线一个是航线复飞记录的数据可以实现录制航线的复现这就需要对数据进行选择和处理同时要设计一个简单可靠的控制器实现对无人机的飞行控制。这个飞行控制系统可以根据采集到的数据对实现无人机对录制航线的精准复现。创建三个activity 分别是recordactivity录制界面reflyactivity复飞界面normalactivity普通界面recordactivity负责实现飞行数据的记录和存储reflyactivity负责实现飞行数据的处理和复飞任务的执行normalactivity是传统飞行界面。
#### 功能模块设计
##### 飞行界面设计
首先创建基础的飞行界面这些基础的飞行界面要能显示无人机的飞行过程的中关键信息之后在基础的飞行界面上根据不同的任务界面为不同的任务界面添加不同的组件。recordactivity在基础界面上加入设置航点文件名称、开始录制、停止录制的按键reflyactivity在基础界面上加入选择航点文件、加载航点文件、开始执行复飞任务、停止复飞任务四个按键normalactivity只显示基础界面。
##### 位置控制器
由于无人机要精准复现无人机录制时的飞行轨迹且通过使用大疆SDK可以直接控制无人机的速度可以直接选用简单好用的位置控制器且不需要使用串级PID因为内环的速度控制已经由大疆SDK实现只需要使用位置控制器PID输出期望速度直接发送给无人机就可以实现对无人机的位置控制了。
##### 航点数据获取和存储
根据控制器的设置实现位置控制器需要输入当前坐标和期望坐标这就需要记录无人机的实时的GPS信息并保存下来同时因为无人机要拍照和录视频所以需要记录无人机的航向、云台相机角度、是否拍照、是否录像。保存了这些参数就可以实现对无人机飞行控制和拍照控制了。这些数据可以通过DJI SDK提供的API接口获取。
为了存储这些数据可以设计一个list 数据将录制中的所有信息按时间顺序存入数组中在停止录制之后将数组中的数据转成json文件存储到本地文件。
##### 航点数据读取和处理
用户在点击选择文件按钮之后会弹出小窗显示文件列表,在选中文件之后小窗消失并提示选中航点文件的名称,用户点击装载之后执行对航点数据的读取和处理。
航点数据的读取通过将文件从json格式重新恢复成自定义的list数组。这部分是由于无人机的基础数据更新频率只有10HZ数据频率太低会导致在复飞时无人机的飞行不够平稳根据这一情况需要对航点做优化处理。且由于GPS 信息记录的是大地坐标系也叫经纬高坐标系LLA: Longitude Latitude Altitude是无法直接用于导航控制的所以需要将航点文件的中的坐标部分转换成站心坐标系也叫东北天坐标系ENU: East North Up将GPS坐标转成东北天坐标系之后就用于导航控制了。
##### 飞行轨迹复现
在用户点击开始按键之后将在装载过程中处理好的飞行数据传入复飞控制函数中,复飞函数中循环读取航点数据,并将读取到数据放入位置控制器中实现对无人机的飞行轨迹的复现,同时当读取到其他航点模式时执行拍照动作或者录视频的动作。
### 系统实现
#### 总体架构
#### 功能模块实现
##### 飞行界面
无人机的飞行界面需要显示很多信息,一般包括如下几点
显示相机的实时画面
显示无人机的状态(飞机遥测数据、电池电量、信号强度等)。
允许用户查看和改变产品设置
无人机具有的基本功能,如自动起飞、降落、回家。
制作一个无人机的飞行应用程序需要先提供这些基础的核心功能然后才能在这个基础上添加独特的功能DJI UX SDK提供了具有这些核心功能的UI元素因此可以用来加快开发时间。通过使用默认的UX SDK 不需要添加其他的代码就可以创建一个基础的飞行界面,效果如下图所示
![defaultScreen.png](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/6416702b-1997-4565-9153-6d7c419fc7e4.png)
通过使用大疆的提供的DJI UX SDK来实现各个界面的基础飞行布局之后再根据不同的界面需求添加不同的按键录制节目添加设置文件名称开始录制停止录制三个按键复飞节目添加选择航点文件装载航线开始停止四个按键。普通模式只使用基础的飞行布局。
##### 位置控制器
使用pid 控制器实现对无人机的位置控制通过读取无人机的当前位置以及期望位置将两个值做差得出的结果放入到pid 控制器中得出的结果就是期望速度通过DJI SDK 发送给无人机即可实现对无人机的位置控制。
##### 航点数据获取和存储
在录制界面中添加三个按键,分别是设置文件名称,开始录制,停止录制。用户先点击设置文件名称,如果创建的文件名称和之前的文件名重复则创建失败,提醒用户重新创建,当用户点击开始录制时需要无人机处于飞行状态否则无法开始,提醒用户起飞无人机后重新开始。用户点击停止录制时,会根据用户设置的文件名自动创建相应的文件,并将航点数据存储到本地。如下图所示。
![image-20210519104158537](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210519104158537.png)
创建自定义航点数据类mylatlng用存储航点数据包含的数据类型有Lat、lng、alt、uavyaw、WaypointActionType其中WaypointActionType有四个种类分别是STAY、STOP_RECORD、START_TAKE_PHOTO、START_RECORD。使用大疆SDK大疆SDK的LocationCoordinate3D获取当前无人机的经度纬度高度创建相机状态的监听获取相机的状态当相机不在拍照时设置WaypointActionType为STAY拍照时设置为START_TAKE_PHOTO开始录视频时为START_RECORD在录制视频期间时保持WaypointActionType为STAY当视频录制结束时设置WaypointActionType为STOP_RECORD。记录数据时当相机没有活动时数据保持最大频率的记录也就是10HZ当相机发生活动时强制记录一条航点信息。点击停止录制时会自动把数据转成json格式并写入本地文件中。
##### 航点数据读取和处理
通过选择制定的文件将指定文件路径的航点文件转成json文件并将json文件转成自定义的list数组文件。这样就完成了航点数据的读取。读取完成的数据还需要进一步处理才能满足飞行控制的要求首先要对航点数据进行数据平滑的处理这里使用的是加权滑动平均法。简单来说滑动平均法把前后时刻的一共2n+1个观测值做平均得到当前时刻的滤波结果。滑动平均法还有一个升级版本也就是我们要用的加权滑动平均法。实际场景中每个观测值的重要程度不同忽略每个观测值的置信度直接平均不能得到精确的结果所以就需要给观测值加权。加权滑动平均法的公式如下
![[公式]](https://www.zhihu.com/equation?tex=p_%7Bt%7D%3D%5Cfrac%7B%5Csum_%7Bi%3D1%7D%5E%7Bn%7D%7B%28x_%7Bt-i%7D%2Aw_%7Bt-i%7D%2Bx_%7Bt%2Bi%7D%2Aw_%7Bt%2Bi%7D%29%2Bx_%7Bt%7D%2Aw_%7Bt%7D%7D%7D%7B2n%2B1%7D)
![[公式]](https://www.zhihu.com/equation?tex=w_%7Bt%7D) 为 ![[公式]](https://www.zhihu.com/equation?tex=t) 时刻的权重。6)式表示的是把每个观测值乘以权重后再平均。这种方法适用于观测值本身带有置信度的情况。使用加权滑动平均法将每个航点的前后三个航点代入到公式中得到处理之后的数据。在使用加权滑动平均法之后还需要使用差值的方法对处理后的航点文件的每个航点之间插入中位数原因是原始数据只有10HZ的频率10HZ的控制频率对无人机来说有点太低了所以需要插入中位数来实现航点数据翻倍的效果使用加倍后的航点数据可以使无人机的控制频率达到20HZ。处理后的航点数据在飞行之后的
##### 飞行轨迹复现
### 系统测试
#### 测试的重要性及目的
软件测试是程序的一种执行过程,目的是尽可能发现并改正被测试软件中的错误,提高软件的可靠性。它是软件生命周期中一项非常重要且非常复杂的工作,对软件可靠性保证具有极其重要的意义。通过测试也可以发现软件的不如,可以根据测试结果进行优化。同时无人机软件涉及到无人机的飞行控制,若软件在无人机的飞行期间发生故障,会造成无人机的失控,无人机的失控可能会对周围环境和人员造成巨大伤害。故需要完成软件测试才算是完成软件的开发任务。
#### 测试的方法及流程
由于本软件的主要功能是录制无人机航线并通过自动复飞复现录制的航线涉及到无人机的飞行故测试要首先在大疆提供的DJI assistant2软件中的无人机模拟器中进行在模拟器中测试完成之后在进行室外的真机测试。
测试时首先在验证软件的各个按键是否有效以及软件是否存在闪退现象之后使用软件测试无人机在模拟器中的飞行情况主要包括使用本软件操控无人机时是否正常在确认无人机在模拟器中正常飞行之后进入录制模式录制航线航线要求足够复杂要涉及到实际飞行中的各个情况包括直线曲线爬升降低转向以及这些动作的组合同时要设计不同的拍照点不同的拍照形式无人机悬停时拍照无人机飞行中拍照同一位置拍多张照片。在录制完测试航线之后进入复飞模式加载测试航线执行复飞任务观察两次飞行的轨迹是否重合观察是否在相同的位置拍照。同时查看软件在复飞过程中是否存在bug。在复飞任务正常执行完成之后读取log日志通过查看日志判断无人机飞行数据是否正常。
在模拟器测试通过之后,需要前往室外测试点进行测试,首先在一片空旷的地方进行测试,在空旷的地方尽可能的设计复杂的航线进行测试,在复飞过程中暂时只能根据肉眼观察复飞效果,复飞结束之后根据日志信息和两次飞行的照片对比分析复飞过程中是否存在问题。空旷场地测试完成之后即可进行无人机真正的作业环境进行测试,根据作业环境的工作流程录制相应的航线并复飞,根据两次飞行过程中采集到信息来分析软件功能是否正常。
### 总结与展望
#### 本文的主要工作
本文主要通过DJI 提供的Mobile SDK 和UX SDK在android平台上开发了一款用于无人机自动巡检的app。对无人机的组成和应用控制无人机飞行原理以及移动端应用开发过程进行了深入的研究所做的主要工作如下
* 无人机的飞行控制
根据DJI SDK 可以直接对无人机发送速度控制指令的方法设计了一个简单的位置控制器实现了对无人机位置的控制并通过这个位置控制器实现了对无人机飞行轨迹的控制同时使用DJI SDK action 的方法实现了对无人机的云台相机的控制,并将两种控制方式结合起来实现了对录制的飞行轨迹的复现。
* 无人机的数据采集和处理
根据设计的控制的需要对无人机的飞行数据进行采集和存储,并且对数据做了一定处理,首先将数据从大地坐标系转换为东北天坐标系,之后又对数据进行了平滑处理,主要用到的方法是加权滑动平均法,之后对数据做了插值处理,通过插值的方法间接提高了对无人机的控制频率,通过对数据的一系列处理,使得无人机的飞行变得更加平稳。
* 无人机自主飞行测试
将在开发工具中编写好的应用部署安装到 Android 系统的智能手机上,利用大疆提供的无人机模拟飞行 PC 软件 DJI assistant2连接无人机和电脑手机和遥控器在应用中录制航线并复飞录制的航线同时也在户外真实环境下进行了类似的测试。
### 不足与展望
本研究内容利用大疆的无人机结合其提供的移动开发平台 Mobile SDK 和 Android应用的开发知识开发出一款可以通过录制标准航线并加载航线实现自动化巡检的应用。但鉴于本人能力和水平的限度、时间紧迫、资料有限取得阶段性的成果的同时软件还有很多技术细节和想法有待加强和完善还有许多待完善的功能如设置云端登录账号航点文件存储到云端便于随时读取。对无人机飞行日志的自动化分析和上传。同时本应用还可以开发IOS版本以覆盖到更多的使用人群。
## 参考文献
## 作者简历
## 学位论文数据集

View File

@ -1,18 +0,0 @@
# 书单
| name | type |
| -------------------------- | ---- |
| 黑客与画家 | |
| 文明的冲突和世界秩序的构建 | |
| 穷查理宝典 | |
| 禅与摩托车修理的艺术 | |
| 西西弗神话 | |
| 国富论 | |
| | |
| | |
| | |

View File

@ -1,32 +0,0 @@
# 买衣服尺码
胸围
肩宽
臀围
| 名称 | 尺寸(厘米) |
| ---------------- | :----------: |
| 肩宽 | 48 |
| 胸围 | 90 |
| 臂围 | 28 |
| 臀围 | 97 |
| 衬衫袖长 | 57 |
| 短袖袖长 | |
| 七分袖袖长 | |
| 长袖袖长 | |
| 夹克短袖长袖衣长 | |
| 西装正装衣长 | |
| 中长款外套衣长 | |
| 长款外套衣长 | 100 |
| 高腰腰围 | |
| 中腰腰围 | 80 |
| 低腰腰围 | |
| 大腿围 | 49 |
| 小腿围 | 33 |
| 脚围 | |
| 九分裤裤长 | |
| 长裤裤长 | 86 |
| 脚长 | 260mm |
| 脚型 | 正常足 |

View File

@ -1,5 +0,0 @@
# 云计算学习知识
C/C++/Java/C#/Python/Go/PHP等编程语言
虚拟化、计算、网络、存储、安全、监控运维、操作系统、数据库、系统自动化、分布式架构、开源等;

View File

@ -1,139 +0,0 @@
# 交接内容
## 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-FiRSTSWARM2 密码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

View File

@ -1,14 +0,0 @@
# 公路车选择
| 名称 | 价格 | 购买链接 |
| ----------- | ---- | ------------------------------------------------------------ |
| 斯特拉king | | |
| 斯特拉95 | | |
| 迪卡侬RC500 | | [迪卡侬铝架公路弯把平把竞速赛车禧玛诺RC500碟刹公路自行车OVBRC-tmall.com天猫](https://detail.tmall.com/item.htm?spm=a230r.1.14.16.56ad5bdbsVFJQg&id=586248086063&ns=1&abbucket=18) |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |

477
出题.md
View File

@ -1,477 +0,0 @@
# 面试题
## 1
### 题目
H2O生成
现在有两种线程,氧 oxygen 和氢 hydrogen你的目标是组织这两种线程来产生水分子。
存在一个屏障barrier使得每个线程必须等候直到一个完整水分子能够被产生出来。
氢和氧线程会被分别给予 releaseHydrogen 和 releaseOxygen 方法来允许它们突破屏障。
这些线程应该三三成组突破屏障并能立即组合产生一个水分子。
你必须保证产生一个水分子所需线程的结合必须发生在下一个水分子产生之前。
换句话说:
如果一个氧线程到达屏障时没有氢线程到达,它必须等候直到两个氢线程到达。
如果一个氢线程到达屏障时没有其它线程到达,它必须等候直到一个氧线程和另一个氢线程到达。
书写满足这些限制条件的氢、氧线程同步代码。
### 答案
```c++
class H2O {
public:
int cntO;// 氧气的计数
int cntH;// 氢气的计数
mutex m;
condition_variable cv;
H2O() {
cntO = 0;
cntH = 0;
}
void hydrogen(function<void()> releaseHydrogen) {
unique_lock<mutex> l(m);
cv.wait(l, [this]()
{
// 氢气最大是2
return this->cntH < 2;
});
// releaseHydrogen() outputs "H". Do not change or remove this line.
releaseHydrogen();
++cntH;
// 已经构成 H2O ,重置计数器
if (cntH + cntO == 3)
{
cntH = 0;
cntO = 0;
}
cv.notify_one();
}
void oxygen(function<void()> releaseOxygen) {
unique_lock<mutex> l(m);
cv.wait(l, [this]()
{
// 氧气最大是1
return this->cntO < 1;
});
// releaseOxygen() outputs "O". Do not change or remove this line.
releaseOxygen();
++cntO;
// 已经构成 H2O ,重置计数器
if (cntH + cntO == 3)
{
cntH = 0;
cntO = 0;
}
cv.notify_one();
}
};
```
## 2
### 题目
用图画出无人机姿态控制的串级反馈控制系统
### 答案
![image-20210513201926139](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210513201926139.png)
进程间通信消息队列
## 3
### 题目
请你说一下多线程,线程同步的几种方式
### 答案
进程是对运行时程序的封装,是系统进行资源调度和分配的的基本单位,实现了操作系统的并发;
线程是进程的子任务是CPU调度和分派的基本单位用于保证程序的实时性实现进程内部的并发线程是操作系统可识别的最小执行和调度单位。每个线程都独自占用一个虚拟处理器独自的寄存器组指令计数器和处理器状态。每个线程完成不同的任务但是共享同一地址空间也就是同样的动态内存映射文件目标代码等等打开的文件队列和其他内核资源。
线程间通信的方式:
1、临界区
通过多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问;
2、互斥量 Synchronized/Lock
采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问
3、信号量 Semphare
为控制具有有限数量的用户资源而设计的,它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。
4、事件(信号)Wait/Notify
通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操作
## 4
### 题目
编写一个函数作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2移位后应该是“hiabcdefg” 函数头是这样的:
//pStr是指向以'\0'结尾的字符串的指针
//steps是要求移动的n
```c++
void LoopMove ( char * pStr, int steps )
{
//请填充...
}
```
### 答案
```c++
void LoopMove ( char *pStr, int steps )
{
int n = strlen( pStr ) - steps;
char tmp[MAX_LEN];
strcpy ( tmp, pStr + n );
strcpy ( tmp + steps, pStr);
*( tmp + strlen ( pStr ) ) = '\0';
strcpy( pStr, tmp );
}
```
## 5
### 题目
把M个同样的苹果放在N个同样的盘子里允许有的盘子空着不放问共有多少种不同的分法用K表示511和151 是同一种分法。
输入描述
第一行是测试数据
输出描述
对输入的每组数据M和N用一行输出相应的K。
输入例子
```
1
7 3
```
输出例子
```
8
```
### 答案
```c
#include<stdio.h>
int fun(int m,int n) //m个苹果放在n个盘子***有几种方法
{
if(m==0||n==1) //因为我们总是让m>=n来求解的所以m-n>=0,所以让m=0时候结束如果改为m=1
return 1; //则可能出现m-n=0的情况从而不能得到正确解
if(n>m)
return fun(m,m);
else
return fun(m,n-1)+fun(m-n,n);
}
int main()
{
int T,m,n;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&m,&n);
printf("%d\n",fun(m,n));
}
}
```
## 6
### 题目
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1
输入:
```
s = "3[a]2[bc]"
```
输出:
```
aaabcbc
```
输入:
```
s = "3[a2[c]]"
```
输出:
```
accaccacc
```
初始代码
```c++
class Solution {
public:
string decodeString(string s) {
}
};
```
### 答案
```c++
class Solution {
public:
string getDigits(string &s, size_t &ptr) {
string ret = "";
while (isdigit(s[ptr])) {
ret.push_back(s[ptr++]);
}
return ret;
}
string getString(vector <string> &v) {
string ret;
for (const auto &s: v) {
ret += s;
}
return ret;
}
string decodeString(string s) {
vector <string> stk;
size_t ptr = 0;
while (ptr < s.size()) {
char cur = s[ptr];
if (isdigit(cur)) {
// 获取一个数字并进栈
string digits = getDigits(s, ptr);
stk.push_back(digits);
} else if (isalpha(cur) || cur == '[') {
// 获取一个字母并进栈
stk.push_back(string(1, s[ptr++]));
} else {
++ptr;
vector <string> sub;
while (stk.back() != "[") {
sub.push_back(stk.back());
stk.pop_back();
}
reverse(sub.begin(), sub.end());
// 左括号出栈
stk.pop_back();
// 此时栈顶为当前 sub 对应的字符串应该出现的次数
int repTime = stoi(stk.back());
stk.pop_back();
string t, o = getString(sub);
// 构造字符串
while (repTime--) t += o;
// 将构造好的字符串入栈
stk.push_back(t);
}
}
return getString(stk);
}
};
```
## 7
### 题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
输入:
```
matrix = [[1,2,3],[4,5,6],[7,8,9]]
```
输出:
```
[1,2,3,6,9,8,7,4,5]
```
输入:
```
matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
```
输出:
```
[1,2,3,4,8,12,11,10,9,5,6,7]
```
初始代码
```c++
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
}
};
```
### 答案
```c++
class Solution {
private:
static constexpr int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0) {
return {};
}
int rows = matrix.size(), columns = matrix[0].size();
vector<vector<bool>> visited(rows, vector<bool>(columns));
int total = rows * columns;
vector<int> order(total);
int row = 0, column = 0;
int directionIndex = 0;
for (int i = 0; i < total; i++) {
order[i] = matrix[row][column];
visited[row][column] = true;
int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
if (nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]) {
directionIndex = (directionIndex + 1) % 4;
}
row += directions[directionIndex][0];
column += directions[directionIndex][1];
}
return order;
}
};
```
## 8
### 题目
static的用法定义和用途
### 答案
1用static修饰局部变量使其变为静态存储方式(静态数据区),那么这个局部变量在函数执行完成之后不会被释放,而是继续保留在内存中。
2用static修饰全局变量使其只在本文件内部有效而其他文件不可连接或引用该变量。
3用static修饰函数对函数的连接方式产生影响使得函数只在本文件内部有效对其他文件是不可见的这一点在大工程中很重要很重要避免很多麻烦很常见。这样的函数又叫作静态函数。使用静态函数的好处是不用担心与其他文件的同名函数产生干扰另外也是对函数本身的一种保护机制。
## 9
### 题目
const的用法定义和用途
### 答案
const主要用来修饰变量、函数形参和类成员函数
1用const修饰常量定义时就初始化以后不能更改。
2用const修饰形参func(const int a){};该形参在函数里不能改变。
3用const修饰类成员函数该函数对成员变量只能进行只读操作就是const类成员函数是不能修改成员变量的数值的。
被const修饰的东西都受到强制保护可以预防意外的变动能提高程序的健壮性。
## 10
### 题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
![img](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/robot_maze.png)
```
输入m = 3, n = 7
输出28
```
初始代码
```c++
class Solution {
public:
int uniquePaths(int m, int n) {
}
};
```
### 答案
```c++
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> f(m, vector<int>(n));
for (int i = 0; i < m; ++i) {
f[i][0] = 1;
}
for (int j = 0; j < n; ++j) {
f[0][j] = 1;
}
for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) {
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
return f[m - 1][n - 1];
}
};
```

View File

@ -1,23 +0,0 @@
# 大疆自主降落
### 之前进展
* Aruco 已经可以正常检测目标根据粗略测试结果误差在5cm左右
* 视频流解码已完成
### 未来计划
* 预计本周末可以进行真机测试
* 根据测试结果进行改进,优化延迟和检测精度
* 目前目标检测都是在A4纸大小的面积上进行后续可以定制一块符合停机坪大小的降落板更大的降落板会提高目标检测的准确性和可检测的最大距离
## 2021-7-19
* 使用lens类配置相机参数
* M300使用变焦镜头进行降落目标物识别
*

View File

@ -1,11 +0,0 @@
# 大疆自主降落对焦问题
* 设置对焦点
![image-20210510110942508](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210510110942508.png)
* 设置对焦距离
![image-20210510111255744](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210510111255744.png)

View File

@ -1,144 +0,0 @@
# 大疆自主降落无人机会议纪要
#### 进展
* 完成视频流数据的解析和降落点的检测,但是还存在一些问题
* 完成了控制器的设计,方同学需重新审核一下即可进行模拟器测试
#### 未解决问题
* 相机自动对焦之后会导致参数变化,导致需要重新标定参数,但是自主降落只是功能
```java
// 配置速度控制指令发送
private static BaseProduct product;
private float virtualroll = 0f;
private float virtualpitch = 0f;
private float virtualyaw = 0f;
private float virtualthrottle = 0f;
private Timer sendVirtualStickDataTimer;
private SendVirtualStickDataTask sendVirtualStickDataTask;
//设置虚拟摇杆
FlightController flightController = getFlightController();
public static synchronized BaseProduct getProductInstance() {
product = DJISDKManager.getInstance().getProduct();
return product;
}
public static boolean isAircraftConnected() {
return getProductInstance() != null && getProductInstance() instanceof Aircraft;
}
public static synchronized Aircraft getAircraftInstance() {
if (!isAircraftConnected()) {
return null;
}
return (Aircraft) getProductInstance();
}
public static FlightController getFlightController() {
Aircraft aircraft = getAircraftInstance();
if (aircraft != null) {
return aircraft.getFlightController();
}
return null;
}
public static boolean isProductModuleAvailable() {
return (null != getProductInstance());
}
public static boolean isAircraft() {
return getProductInstance() instanceof Aircraft;
}
public static boolean isFlightControllerAvailable() {
return isProductModuleAvailable() && isAircraft() && (null != getAircraftInstance()
.getFlightController());
}
private class SendVirtualStickDataTask extends TimerTask {
@Override
public void run() {
if (isFlightControllerAvailable()) {
getAircraftInstance()
.getFlightController()
.sendVirtualStickFlightControlData(new FlightControlData(virtualpitch,
virtualroll,
virtualyaw,
virtualthrottle),
new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError djiError) {
}
});
}
}
}
// 完成配置速度控制指令发送
//开始发送速度控制指令
private void start_auto_landing(){
if(flightController == null){
if(flightController == null)Toast.makeText(MainActivity.this,"无人机未连接请连接无人机后重新打开app",Toast.LENGTH_SHORT).show();
}else{
long starttime = System.currentTimeMillis();
Toast.makeText(this,"开始任务",Toast.LENGTH_SHORT).show();
flightController.setVirtualStickModeEnabled(true, new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError djiError) {
if (djiError != null) {
Toast.makeText(MainActivity.this,"err->"+djiError.toString(),Toast.LENGTH_SHORT).show();
}
}
});
flightController.setFlightOrientationMode(FlightOrientationMode.AIRCRAFT_HEADING, new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError djiError) {
Toast.makeText(MainActivity.this,"err->"+djiError.toString(),Toast.LENGTH_SHORT).show();
}
});
flightController.setVirtualStickAdvancedModeEnabled(true);//打开虚拟摇杆高级模式
flightController.setRollPitchControlMode(RollPitchControlMode.VELOCITY);//设置rollpitch控制为速度
flightController.setYawControlMode(YawControlMode.ANGLE);//设置yaw控制为角度
flightController.setVerticalControlMode(VerticalControlMode.VELOCITY);//设置垂直方向速度为速度
flightController.setRollPitchCoordinateSystem(FlightCoordinateSystem.GROUND);//设置坐标系为大地坐标系
long endTime = System.currentTimeMillis();
if (null == sendVirtualStickDataTimer) {
sendVirtualStickDataTask = new SendVirtualStickDataTask();
sendVirtualStickDataTimer = new Timer();
sendVirtualStickDataTimer.schedule(sendVirtualStickDataTask, 0, 50);
}
}
}
//结束发送速度控制指令
private void stop_auto_landing (){
if(flightController != null){
getAircraftInstance().getFlightController().setVirtualStickModeEnabled(false, new CommonCallbacks.CompletionCallback() {
@Override
public void onResult(DJIError djiError) {
if (djiError != null) {
Toast.makeText(MainActivity.this,"err->"+djiError.toString(),Toast.LENGTH_SHORT).show();
}
}
});
}
Toast.makeText(MainActivity.this,"复飞停止",Toast.LENGTH_SHORT).show();
// 虚拟摇杆停止
if(sendVirtualStickDataTimer != null){
sendVirtualStickDataTimer.cancel();
sendVirtualStickDataTimer = null;
sendVirtualStickDataTask = null;
}
}
```

View File

@ -1,82 +0,0 @@
# 宣讲会演讲稿
## 若联科技简介
[^1]在物联网和人工智能浪潮中
[^1]:yewuya
*无人机
除了商业版产品我们通过发布个人版产品开源自身领先技术建设全球开发者社区优选技术IP和行业应用促进技术与市场高效对接实现开放创新 。
[^2]在物联网和人工
[^2]: yewuy11a
若联科技同时还取得了以下成就:
•浙江省5G产业联盟成员单位
•联合中国移动、华为共同成立5G无人机创新实验室
•已完成数个5G网络下的无人机编队项目
•主打2B市场客户和无人机移动边缘计算核心技术
•地方和全国性媒体重点报道
公司核心团队介绍
首先是我们公司的金总同时是公司的CEO和CTO他从事无人机行业多年在行业内积累了 大量资源和经验。
还有就是我们的两位首席科学家分别是IOT首席科学家袁袁博士和AI首席科学家余教授其中袁博士在加入若联之前是华为的G研究员,曾参与过5G标准的制定,加入若联之后在通信技术这方面继续深耕,产出了很多成果,其中包括多项无人机编队通信技术专利.
核心技术
核心产品
.
## 5G时代的特征
下面我们开始进入正题开始讲解技术内容,在讲5G之前大家先看一个视频,看视频,其实我们的通信技术也是这样的,为了应对通信需求的不断提高,我们要不断的制定新的标准和技术来实现更高的通信效率
我们再看下一个视频,这个视频呢主要讲的是在5G网络下无人机和机器狗协同巡检.在5G网络的支持下,可以实现各种硬件的协同工作,比如这个视频里,无人机和在工厂上空进行巡检,发现异常后数据就发送给机器狗,机器狗就可以根据收到的信息进入工厂内部查找具体原因.
下面是5G网络对比其他通信技术的优势
5G应用场景,照着念即可
## 无人机编队飞行要求及展示
## 无人机编队技术关键点
## 无人机编队技术行业应用

View File

@ -1,28 +0,0 @@
# 室内变电站无人机巡检
## 室内环境
### 大致情况
![1](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/1.png)
![2](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/2.jpg)
![3](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/3.jpg)
### 参数要求
无人机在变电站中

View File

@ -1,8 +0,0 @@
# 峰飞航空猎头沟通结果
* 公司接受了德国投资一亿美元(未公开)
* 公司和军方存在合作(未公开)
* 周末不加班,平时任务重的话会加班,有调休
* 薪资15K 90%的可能性拿到
* 飞控算法工程师岗位直接发offer ,可选签三方(猎头说签三方比较麻烦)

View File

@ -1,13 +0,0 @@
# 年度项目获奖感言
感谢同事和领导的帮助和支持主要感谢
何鹏鑫:带领我熟悉项目。在刚开始的时候带领我推进项目的进度,后来由于有更重要的事情要做,就离开了这个项目
马时俊:这个项目最后变成了一个控制类的问题,由于我本身经验不是很多,向马时俊请教了许多控制方面的问题,告诉了我许多调参的经验和控制学知识,对改善飞机的飞行情况起到了很大的帮助
金总:这个项目最后的整体方案的使用的技术方向就是金总定下来的,没有这个正确的方向后面的都是无用功,在其他方面也给了我很大的支持。
这个项目遇到的最大的困难就是一直不清楚甲方的真正需求,我参与这个项目之后我和何鹏鑫花了将近一个月时间才算搞明白这个项目究竟要实现什么样的目的。在弄清楚需求之后后面的开发相对来说比较容易了,都是技术上可以想办法解决的,只要朝着这个方向去做就可以了。但是如果需求不清楚,你花了大功夫做出来的东西甲方可能根本用不上。搞清楚需求是开发前必须要做的事情
通过这个项目,我在对无人机的应用层面开发方面有了一定的经验,同时也学到了一些控制工程方面的知识。

View File

@ -1,11 +0,0 @@
| 方案占总投资比例比例 | 方案名称 | 具体产品 | 所占方案比例 | 实际每月金额 | 实际每周金额 |
| -------------------- | -------- | -------------------------- | :----------: | ------------ | ------------ |
| 40.00% | 有知有行 | 我要稳稳的幸福(且慢跟投) | 20% | 120 | 30 |
| | | 中证500(160119) | 40% | 240 | 60 |
| | | 中证红利(090010) | 40% | 240 | 60 |
| 20.00% | 自己 | 沪深300(100038) | 50% | 200 | 50 |
| | | 半导体(007300) | 15% | 60 | 15 |
| | | 交银精选混合(519688) | 35% | 140 | 35 |
| 40.00% | 也谈钱 | 长赢指数(且慢跟投) | 50% | 500 | 125 |
| | | 富国天惠成长混合(003494) | 25% | 150 | 37.5 |
| | | 兴全趋势投资(163402) | 25% | 150 | 37.5 |

View File

@ -1,9 +0,0 @@
# 无人机自主降落方案
Android官方提供了写CC++的方法马时俊那个识别算法用的是python写的不改过他是通过 py mavros来订阅的视频数据。Android写python可以通过第三方的办法实现。但是python程序要重写部分把视频源改成通过sdk获取的视频源。马时俊说这个可能不太好改其次改完了可能也没法正常用因为之前是TX现在是Android平台这两个平台架构不太一样。同样的程序改成功了可能 也没法正常运行。
我觉得应该找一个会C++ 和python的机器视觉

View File

@ -1,15 +0,0 @@
![[Pasted image 20230508173721.png]]
![[Pasted image 20230508173835.png]]
![[Pasted image 20230508173948.png]]
![[Pasted image 20230508174056.png]]
![[Pasted image 20230508185715.png]]
![[Pasted image 20230508185826.png]]
![[Pasted image 20230508190029.png]]
今天测了下星基 农田场景
1 地面静置不动两分钟水平浮动范围3cm 垂直浮动范围10cm
2 飞机运动模式油门推满 速度18m/s 持续两分钟星基RTK连接稳定一直保持固定解
3 飞航线平台下发任务航线速度15m/s 的情况下,飞机点与点之间是飞的弧线,且飞不到目标点
4 降低航线速度为5m/s 点与点之间飞直线且可以到达航点在30米高5倍变焦的情况下啥也拍不到对比录制航点位置和复飞航点位置发现偏了2米录制点拍照是为杆塔正中心复飞点拍不到杆塔

View File

@ -1,8 +0,0 @@
* 机库在执行关库/开库过程中,不能接收新的指令,否则执行中的任务和新的指令都会马上回复成功
* 机库自身状态不对的过程中,执行指令都会秒回成功
* 发充电指令无法得知是执行了换电还是充电
* 无法获取电池仓电池状态
*

View File

@ -1,50 +0,0 @@
# 校招职位
有赞 10.30截止
![image-20201028092904031](C:\Users\yewuya\AppData\Roaming\Typora\typora-user-images\image-20201028092904031.png)
云从
![image-20201028092843246](C:\Users\yewuya\AppData\Roaming\Typora\typora-user-images\image-20201028092843246.png)
依图 10.31截止
![image-20201028092800487](C:\Users\yewuya\AppData\Roaming\Typora\typora-user-images\image-20201028092800487.png)
新华三
![image-20201028092626715](C:\Users\yewuya\AppData\Roaming\Typora\typora-user-images\image-20201028092626715.png)
恒生电子
![image-20201028094534718](C:\Users\yewuya\AppData\Roaming\Typora\typora-user-images\image-20201028094534718.png)
数梦工场(宣讲会)简历投邮箱
同盾科技(校招没有)
涂鸦智能
图森未来(北京上海)
商汤科技
![image-20201029095804728](C:\Users\yewuya\AppData\Roaming\Typora\typora-user-images\image-20201029095804728.png)
地平线机器人(上海南京)嵌入式
寒武纪(上海西安)人工智能
陆金所(上海)前后端 人工智能
远景能源(上海)![image-20201029100944393](C:\Users\yewuya\AppData\Roaming\Typora\typora-user-images\image-20201029100944393.png)

View File

@ -1,98 +0,0 @@
<!--
* @Author: yewuya
* @Date: 2022-06-07 09:26:54
* @LastEditors: yewuya
* @LastEditTime: 2022-06-07 09:30:39
* @FilePath: \mymarkdown\第三方RTK第三方RTK飞行可能出现问题及解决方案.md
* @Description:
*
* Copyright (c) 2022 by yewuya, All Rights Reserved.
-->
# 第三方RTK飞行可能出现问题及解决方案
## 问题1RTK丢失或者RTK由固定解变为浮动解
### 问题造成影响
定位精度下降,影响高精度巡检的效果,甚至可能炸机,对于通道巡检之类的低精度巡检问题不是很大
### 对应措施
高精度巡检建议直接返航回到对应机库,通道巡检可以继续执行任务。
## 问题2RTKGPS无法获取定位数据
### 问题原因
* 人为干扰
* 特殊天气
* 巡检设备本身电磁辐射太强
* 第三方RTK模块电源不足
* 第三方RTK模块损坏
### 问题造成影响
无法执行任何任务,还有很大可能炸机。
### 对应措施
* 飞机悬停直到干扰结束或者没电。
* 飞机拔高到一定高度尝试摆脱干扰范围,不行的话,飞回返回原来高度。
* 飞机前后左右飞行(不安全,可能会撞到障碍物)
* 飞机原地降落,可能会炸机,加上视觉识别可以降低一些炸机概率,不过单目相机做定位有点困难.
* 飞行中记录飞机的所有数据无GPS后根据记录的数据倒飞回起飞位置由于没有GPS定位只能靠加速度计导航会导致倒飞定位比较差可能会炸机而且实现起来比较麻烦
* 第三方RTK出问题但是机载GPS正常的话可以执行返航
## 问题3机载电脑死机
### 问题原因
* 代码问题
* 散热不行机载电脑过热
* OSDK本身有问题导致代码崩溃
* 程序太多,负载太大,OSDK设备性能跟不上
### 问题造成影响
无法继续任务,此时如果遥控器已经断开,会飞机只能一直悬停.
### 可选措施
* 遥控器和飞机连接还未断开的情况下可以遥控器接管控制权,根据任务距离判断是否继续执行任务.超出遥控器范围直接返航.
* 由开机模块断电重启OSDK设备,恢复任务(OSDK设备供电还是飞机供电但是要走开机模块中转一下)
## 问题4空中电池断电(只坏了一块)
### 问题原因
电池自身出问题了.
### 问题造成影响
飞机还能继续飞行但不建议继续任务.
### 可选措施
* 返航
## 问题5服务器(工控机)连接断开
### 问题原因
* 服务器停机
* 工控机网络连接断开或者死机
* OSDK设备网络连接断开
### 问题造成影响
可以继续执行任务,但可能无法完成降落.
### 可选措施
* 直接返航
* 继续执行任务到达机库上方执行降落前尝试连接机库WiFi在局域网内控制机库开库完成降落
### 暂时只想到这么多,后续想到再说

View File

@ -1,96 +0,0 @@
<!--
* @Author: yewuya
* @Date: 2022-06-07 09:26:54
* @LastEditors: yewuya
* @LastEditTime: 2022-06-07 09:30:39
* @FilePath: \mymarkdown\第三方RTK第三方RTK飞行可能出现问题及解决方案.md
* @Description:
*
* Copyright (c) 2022 by yewuya, All Rights Reserved.
-->
# 第三方RTK飞行可能出现问题及解决方案
## 问题1RTK丢失或者RTK由固定解变为浮动解
### 问题造成影响
定位精度下降,影响高精度巡检的效果,甚至可能炸机,对于通道巡检之类的低精度巡检问题不是很大
### 对应措施
高精度巡检建议直接返航回到对应机库,通道巡检可以继续执行任务。
## 问题2RTKGPS无法获取定位数据
### 问题原因
* 人为干扰
* 特殊天气
* 巡检设备本身电磁辐射太强
* 第三方RTK模块电源不足
* 第三方RTK模块损坏
### 问题造成影响
无法执行任何任务,还有很大可能炸机。
### 对应措施
* 飞机悬停直到干扰结束或者没电。
* 飞机拔高到一定高度尝试摆脱干扰范围,不行的话,飞回返回原来高度。
* 飞机前后左右飞行(不安全,可能会撞到障碍物)
* 飞机原地降落,可能会炸机,加上视觉识别可以降低一些炸机概率,不过单目相机做定位有点困难.
* 飞行中记录飞机的所有数据无GPS后根据记录的数据倒飞回起飞位置由于没有GPS定位只能靠加速度计导航会导致倒飞定位比较差可能会炸机而且实现起来比较麻烦
* 第三方RTK出问题但是机载GPS正常的话可以执行返航
## 问题3机载电脑死机
### 问题原因
* 代码问题
* 散热不行机载电脑过热
* OSDK本身有问题导致代码崩溃
* 程序太多,负载太大,OSDK设备性能跟不上
### 问题造成影响
无法继续任务,此时如果遥控器已经断开,会飞机只能一直悬停.
### 可选措施
* 遥控器和飞机连接还未断开的情况下可以遥控器接管控制权,根据任务距离判断是否继续执行任务.超出遥控器范围直接返航.
* 由开机模块断电重启OSDK设备,恢复任务(OSDK设备供电还是飞机供电但是要走开机模块中转一下)
## 问题4空中电池断电(只坏了一块)
### 问题原因
电池自身出问题了.
### 问题造成影响
飞机还能继续飞行但不建议继续任务.
### 可选措施
* 返航
## 问题5服务器(工控机)连接断开
### 问题原因
* 服务器停机
* 工控机网络连接断开或者死机
* OSDK设备网络连接断开
### 问题造成影响
可以继续执行任务,但可能无法完成降落.
### 可选措施
* 直接返航
* 继续执行任务到达机库上方执行降落前尝试连接机库WiFi在局域网内控制机库开库完成降落

File diff suppressed because one or more lines are too long

View File

@ -1,34 +0,0 @@
# 自主降落开发日志
## 2021-7-13
### 进展
* 在一个单独的app上可以自动执行无人机基于aruco 的自主降落
* 完成了初步移植工作
### 问题
* 视频流解码使用的是surfaceview 与现有的UX SDK 的FPV widget冲突surfaceview只有显示的时候才能渲染隐藏surfaceview时无法初始化DJICodecManager
## 2021-7-22
### 进展
* 完成了M300的初步适配
### 问题
* M300可以挂载双云台或者单云台需要获取云台当前的状态是否多云台和云台挂载的位置。双云台都挂载的时候需要获取所使用相机所在的位置。
**获取多云台连接状态**
![image-20210722104805265](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210722104805265.png)
**获取云台**
![image-20210722104933952](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210722104933952.png)

View File

@ -1,80 +0,0 @@
# 自我介绍
* 飞控算法工作内容
与硬件、软件、结构等同事共同确定飞行器的主要参数,包括重量、动力、续航、功能,从而确定飞行器类型、确定各执行器和传感器的性能指标。
与嵌入式工程师沟通系统架构,确定程序中算法任务的执行频率、各个传感器调用方法、存储方法。
如果团队人多,根据人数拆解算法工作,比如几个人做组合导航,几个人做控制,组合导航里姿态和位置拆不拆开,高度分不分离出来。
如果只有一个人先测传感器数据最主要的是惯导看输出值有无问题如果有飞行器直接上机在真实的振动环境下看是否需要加低通滤波等处理还包括气压计、超声波、毫米波、摄像头、GPS这些传感器也都需要测试。
写标定算法,标定加速度计、陀螺仪、磁力计(如有)。
写状态显示算法如有LED时什么颜色代表什么状态。
确定数据融合方案,现在主流的都是卡尔曼滤波,然后开始设计算法,在飞控板上调试,看姿态、位置、高度、速度等状态量估计值是否合理。
写控制算法最简单常用的就是PID在简单的环境下试飞、调参。
增加复杂环境下的逻辑处理,比如使用超声波测高时,飞行器飞过楼梯怎么处理,如果是倾转旋翼,倾转过程如何控制等。
FDI算法设计用于隔离异常比如GPS丢星。
如有任务设备,简单调试,比如控制相机曝光,操作执行机构。
功能开发,比如航线规划后飞自动任务,避障,跟踪,定点环绕,固定区域巡逻等。
跟踪大量试飞测试,确保稳定性。
面试官好我叫吴金辉中国计量大学现代科技学院的计算机专业的学生在校期间在学好专业课的同时在大一大二参加了两年中国国际飞行器设计挑战赛CADC大一主要是跟着学长学习大二的时候我作为组长带领同学和学弟们参加比赛。我参加的项目是垂直起降载运大致规则是设计一个不超过两个电机的飞行器但不能使用直升机需要飞行器做到在起降区中装载货物按照一定的轨迹飞行之后将货物投放到一个0.4M直径的圆筒中,由于起降区面积比较小飞行器只能垂直起降。这就导致只能设计一些非传统的机型,在此期间也接触并制作很多种无人机,尾坐式垂直起降,倾转旋翼无人机,变距四轴,最后根据机型的测试结果的综合考虑,选用了变距四轴无人机作为最终的方案。最终也取得了不错的成绩,拿到了两个国家一等奖,团队总成绩排名第二的好成绩。两年的参赛经验让我学到了很多东西,也让我对无人机这方面产生了浓厚的兴趣。由于大一大二的时候能力有限,参加比赛的时候更多的是对现有飞控的参数的调整和一些自定义的配置,修改一下混控器这些简单的操作。我在大三的时候主动去了解了一些无人机飞控开发的内容,同时也去了一家无人机公司实习。实习的公司是杭州若联科技,公司的主要业务是无人机集群灯光秀和工业无人机。我在实习期间也参与了一些项目,在实习期间参与了一些项目也学到了许多东西。通过这些项目的实战,让我对无人机系统有着更深入的了解。也积累了更多的经验。
请问为什么pid不需要建模呢是因为参数最后依据实际情况来整定吗可是开源飞控几乎都不需要调参不管搭配很么鸡架什么电机什么桨都能飞得不错难道pid的参数与这些都无关吗那与什么有关系呢
PID控制是只需要目标设定和反馈值就可以反馈值可以用状态估计算法得到有了这两个pid就控制误差趋于零即可。开源飞控几乎不需要调参是因为鲁棒性相对好些机架或者电机之类的影响不会使性能差距很大但是如果变化很大的话还是能感觉出来参数不合适的所以一组参数就可以获得良好性能。所以本身pid控制器就不是基于模型调出来的当你飞行器变化一些参数影响没有那么大。
遥控信号丢失判定决策
电池电压判定和决策

View File

@ -1,3 +0,0 @@
# 视觉降落流程
![image-20210702085613779](https://yewuyadeimagewall.oss-cn-hangzhou.aliyuncs.com/image-20210702085613779.png)

View File

@ -1,99 +0,0 @@
# 计算机书
```
Code Complete (2nd edition) by Steve McConnell
The Pragmatic Programmer
Structure and Interpretation of Computer Programs
The C Programming Language by Kernighan and Ritchie
Introduction to Algorithms by Cormen, Leiserson, Rivest & Stein
Design Patterns by the Gang of Four
Refactoring: Improving the Design of Existing Code
The Mythical Man Month
The Art of Computer Programming by Donald Knuth
Compilers: Principles, Techniques and Tools by Alfred V. Aho, Ravi Sethi and Jeffrey D. Ullman
Gödel, Escher, Bach by Douglas Hofstadter
Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin
Effective C++
More Effective C++
CODE by Charles Petzold
Programming Pearls by Jon Bentley
Working Effectively with Legacy Code by Michael C. Feathers
Peopleware by Demarco and Lister
Coders at Work by Peter Seibel
Surely You're Joking, Mr. Feynman!
Effective Java 2nd edition
Patterns of Enterprise Application Architecture by Martin Fowler
The Little Schemer
The Seasoned Schemer
Why's (Poignant) Guide to Ruby
The Inmates Are Running The Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity
The Art of Unix Programming
Test-Driven Development: By Example by Kent Beck
Practices of an Agile Developer
Don't Make Me Think
Agile Software Development, Principles, Patterns, and Practices by Robert C. Martin
Domain Driven Designs by Eric Evans
The Design of Everyday Things by Donald Norman
Modern C++ Design by Andrei Alexandrescu
Best Software Writing I by Joel Spolsky
The Practice of Programming by Kernighan and Pike
Pragmatic Thinking and Learning: Refactor Your Wetware by Andy Hunt
Software Estimation: Demystifying the Black Art by Steve McConnel
The Passionate Programmer (My Job Went To India) by Chad Fowler
Hackers: Heroes of the Computer Revolution
Algorithms + Data Structures = Programs
Writing Solid Code
JavaScript - The Good Parts
Getting Real by 37 Signals
Foundations of Programming by Karl Seguin
Computer Graphics: Principles and Practice in C (2nd Edition)
Thinking in Java by Bruce Eckel
The Elements of Computing Systems
Refactoring to Patterns by Joshua Kerievsky
Modern Operating Systems by Andrew S. Tanenbaum
The Annotated Turing
Things That Make Us Smart by Donald Norman
The Timeless Way of Building by Christopher Alexander
The Deadline: A Novel About Project Management by Tom DeMarco
The C++ Programming Language (3rd edition) by Stroustrup
Patterns of Enterprise Application Architecture
Computer Systems - A Programmer's Perspective
Agile Principles, Patterns, and Practices in C# by Robert C. Martin
Growing Object-Oriented Software, Guided by Tests
Framework Design Guidelines by Brad Abrams
Object Thinking by Dr. David West
Advanced Programming in the UNIX Environment by W. Richard Stevens
Hackers and Painters: Big Ideas from the Computer Age
The Soul of a New Machine by Tracy Kidder
CLR via C# by Jeffrey Richter
The Timeless Way of Building by Christopher Alexander
Design Patterns in C# by Steve Metsker
Alice in Wonderland by Lewis Carol
Zen and the Art of Motorcycle Maintenance by Robert M. Pirsig
About Face - The Essentials of Interaction Design
Here Comes Everybody: The Power of Organizing Without Organizations by Clay Shirky
The Tao of Programming
Computational Beauty of Nature
Writing Solid Code by Steve Maguire
Philip and Alex's Guide to Web Publishing
Object-Oriented Analysis and Design with Applications by Grady Booch
Effective Java by Joshua Bloch
Computability by N. J. Cutland
Masterminds of Programming
The Tao Te Ching
The Productive Programmer
The Art of Deception by Kevin Mitnick
The Career Programmer: Guerilla Tactics for an Imperfect World by Christopher Duncan
Paradigms of Artificial Intelligence Programming: Case studies in Common Lisp
Masters of Doom
Pragmatic Unit Testing in C# with NUnit by Andy Hunt and Dave Thomas with Matt Hargett
How To Solve It by George Polya
The Alchemist by Paulo Coelho
Smalltalk-80: The Language and its Implementation
Writing Secure Code (2nd Edition) by Michael Howard
Introduction to Functional Programming by Philip Wadler and Richard Bird
No Bugs! by David Thielen
Rework by Jason Freid and DHH
JUnit in Action
```

View File

@ -1,20 +0,0 @@
# 试用期工作总结
## 工作学习情况
实现了无人机自主降落功能在御2无人机上完成测试后移植到M300上。并接入自动飞行平台在执行任务返航后会自动降落至贴有降落标识物的机库上。
初步完成了基于UWB的无人机室内导航定位app,在室内使用UWB标签进行无人机的定位。任务模式使用录制复飞的方式进行实时记录无人机的各种信息复飞时根据录制的信息进行轨迹/位置控制。app基本框架搭完成在进行功能验证和功能完善。
协助英俊进行现有复飞软件的应用层适配和bug修复
## 收获体会
将之前所学的知识在实际项目中使用并进行功能验证。自身之前所学东西得到了验证同时熟悉了基于大疆无人机开发的工作流。并与之前所使用的PX4无人机开发工作流进行对比。两者各有优缺点。
之前的工作属于个人单打独斗,现在和团队一起进行协同工作,工作效率和工作体验都好了很多。
## 未来个人发展定位
个人定位偏向无人机的导航控制使用各种方式实现无人机在不同环境下的定位导航并在此基础上实现无人机的自动巡检功能。主要学习方向为slam无人机导航算法无人机飞控算法。

View File

@ -1,19 +0,0 @@
# 远程桌面
## rustdesk
| 项目 | 公司电脑 | 家里电脑 | UWB 电脑 |
| ---- | ---------- | -------- | -------- |
| id | 29 078 604 | | |
| 密码 | wujinhui | | |
| | | | |
## 向日葵
| 项目 | 公司电脑 | 家里电脑 | UWB 电脑 |
| ---- | ---------- | -------- | -------- |
| id |496 782 610 | | |
| 密码 | wujinhui | | |
| | | | |

View File

@ -1,15 +0,0 @@
# 配置单
| 品类 | 型号 | 价格 |
| ---- | ----------------------- | ---- |
| CPU | AMD3600散片 | 979 |
| 主板 | 华擎 B450 | 799 |
| 散热 | 玄冰400 | 85 |
| 内存 | 威刚XPG ddr4 3000 8G *2 | 558 |
| 显卡 | 微星万图师1660/GTX 1030 | 2499 |
| SSD | SN550 1T | 0 |
| HDD | 无 | 0 |
| 机箱 | vector 1 | 539 |
| 电源 | EVGA 650W GM电源 | 799 |
| 合计 | | 4480 |

View File

@ -1,111 +0,0 @@
## mqtt 工具使用
### 工具下载
[MQTT Explorer | An all-round MQTT client that provides a structured topic overview (mqtt-explorer.com)](https://mqtt-explorer.com/)
各环境mqtt服务器地址
* 云南蒙自地址 112.116.71.17:1883
* 测试地址 121.40.120.163:1883
* 正式地址 39.174.88.210:12468
按照下图输入IP和端口暂时不需要用户名和密码可以直接登录
![[Pasted image 20230331153159.png]]
订阅消息
/ah/# 订阅所有消息
/ah/uav/# 只订阅全部无人机消息
/ah/hangar/# 只订阅全部机库消息
/ah/设备类型/设备序列号/# 订阅指定设备的全部消息
按照下面步骤新增订阅并连接到服务器
![[Pasted image 20230331153426.png]]
![[Pasted image 20230331153752.png]]
![[Pasted image 20230331153718.png]]
## app 日志查看
日志目前都存储在自己部署的minio 云存储。
下面是地址和账号 ”/“之前的是账号,后面是密码
云南
http://112.116.71.17:9000/
device-application/s&F4dGN9Q1taErBOuBPVrd3hXhMNhsCt
正式服务器
http://39.174.88.210:12490/login
device-application/s&F4dGN9Q1taErBOuBPVrd3hXhMNhsCt
测试服务器
http://39.174.88.209:10790/buckets/aihang/browse
device-application/s&F4dGN9Q1taErBOuBPVrd3hXhMNhsCt
![[Pasted image 20230331161609.png]]
![[Pasted image 20230331161707.png]]
![[Pasted image 20230331162020.png]]
![[Pasted image 20230331165136.png]]
## 查问题流程
* 当有人反馈问题时先初步判断是否为app 相关问题一般涉及到飞机相关的操作都有可能是app 端的问题。
* 然后根据提供的任务ID去查日志日志文件名称为飞机序列号+任务名称+任务ID+ 时间戳+时间戳转换出来的日期和时间。如果查不到任务ID 就需要根据问题反馈人反馈时间去找附近时间段的日志文件。
* 找到日志文件之后一般需要解析日志文件,我用这个也可以用别的 [在线JSON转Excel工具 - UU在线工具 (uutool.cn)](https://uutool.cn/json2excel/)
![[Pasted image 20230331171748.png]]
一般只需要看actioninfo 这个字段的东西就行,里面都是关键信息。
任务整个流程为,流程为同步任务,一步出错则后续都不执行:
* 前端页面用户下发任务
* 后端对任务数据、天气、设备状态等进行校验
* 后端下发开库开机 机库端返回成功
* 后端下发遥控器开机 app 返回成功
* 后端下发自检app 返回自检成功
* 后端下发任务执行app 返回执行成功
* 后端关闭机库
* 任务中 就正常飞行,也可能会收到远程控制指令这时候会暂停任务,响应远程控制的指令
* 任务结束app调用任务结束接口接口返回成功飞机返航三次失败就飞机前往备降点
* 任务结束接口调用成功,后端执行开库动作
* 开库成功后后端发送降落请求这时app 控制无人机进行降落流程
* 降落请求长时间未响应后端会在降落请求发送后的30分钟执行关库指令
* 降落成功后app进行图片传输后端操作机库执行关库夹紧推杆动作
* app图片传输结束后app 调用后端的飞机关机接口,整个任务流程结束
当用户判断出现问题时,先查对应的指令,首先看对应设备有没有收到指令,未收到则为后端或者前端问题。
app 这边对每次收到的指令都会做出响应无响应说明app有问题。
app 响应且响应为成功结果,则后端或者前端有问题。如果响应结果为错误则根据报错信息查问题
### 暂存已知问题
执行任务起飞后不关库 后端偶发性问题暂未定位到问题
机库开库无人机不开机 后端偶发性问题暂未定位到问题
降落后关库,但是关机失败,已解决,但是测试量不够不确定是否会复现
开库开机后app 显示传输数据完成,关闭无人机 已解决待测试
### app 指令接收和响应
#### 指令接收
接收执行的 mqtt topic为 /ah/uav/无人机序列号/command/
指令消息体如下app 日志会保存下 code 和requestId的内容
```json
{
"code": "task_stop",
"data":"",
"sdkType": "msdk",
"deviceId": "1ZNDH8500B72MM",
"requestId": "1111",
"time": 1667467817551
}
```
#### 指令响应
接收执行的 mqtt topic为 /ah/uav/无人机序列号/commandResponse/
消息结构如下当code 不为0是属于指令执行异常msg 字段会加上原因
``` json
{
"code": 0,
"data": "camera_vertical",
"msg": "on",
"requestId": "1111"
}
```
### app 指令类别参考接口文档

View File

@ -1,9 +0,0 @@
# 高通无人机会议记录
* 计算能力较弱只能进行简单的slam代码
* 网络连接不够稳定大概100M带宽延时挺高几百毫秒
* 只用到相机和通信部分
* 用的mavros
* 飞控部分存在问题
* 没考虑过搭飞机实际测试
* 使用phenix mini 连接高通平台高通平台充当通信链路和图像数据采集本地计算机做slam计算使用ros通信。