# air
**Repository Path**: newsun-boki/air
## Basic Information
- **Project Name**: air
- **Description**: 13fvfvfbfbtgfbngt
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-06-12
- **Last Updated**: 2022-06-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Autoaim
Vision auto-aim for **RM 2022**.

---
## Ⅰ. 环境配置(以ubuntu18.04为例)
| 依赖库 | 作用 |
| ------------------ | ------------------------------------------------------------ |
| OpenCV3+ | 计算机视觉常用库,用于进行图像处理ROS自带,也可单独安装OpenCV4 |
| ROS-melodic-full | ROS机器人操作系统,后续与电控通讯依赖于ROS(18.04中安装melodic版本) |
| ROS-melodic-serial | ROS串口依赖库,ROS-melodic-full中未包含此串口包,需要自行安装 |
| libtorch | pytorch的c++版本,将pytorch训练出的.pt模型文件导入到c++文件中 |
| Eigen | 矩阵运算库,ROS自带,不需要自行安装 |
| Ceres 1.14 | 优化算法库,用于对优化型问题进行求解,需要下载安装 |
| MVS | 海康威视相机依赖库,用于对相机进行操作 |
### 1.1 libtorch 1.8.0+cpu 版本安装
**1.1.1 过去报过的错:**
先前曾尝试过很多版本,但都会存在libtorch和opencv4不兼容的问题。(报错如下)
:carrot:**报错的特征:**
当你单独使用OpenCV时,程序能够正常运行;并且当单独使用libtorch时,程序也能够正常运行;当你的工程同时使用OpenCV+libtorch时,报了上面的错误,表现为OpenCV无法调用起来。
:carrot:**冲突的原因:**
冲突的原因可能是OpenCV编译时候的C++ABI版本和libtorch中的不同,所以建议在相同的环境下编译。
:carrot:**可以进行的尝试:**
- [ ] 将ROS中的OpenCV删去(或不删去也可以,但须在CMakeLists.txt里面指明OpenCV的位置)
- [ ] 下载OpenCV和libtorch的源码并在同一个环境下进行编译。
**1.1.2 问题解决:**
为了方便,这里使用一种比较暴力 :motor_scooter: 的方法。从我的gitee中clone统一版本的libtorch,以此来解决冲突的问题。
:carrot:**具体操作步骤如下:**
1. `git clone https://gitee.com/undark/libtorch.git`
2. 建议在clone下的文件夹中,使用`rm -rf .git`脱离git。
3. 将clone下来的文件夹整个放在`/opt/`目录下。
4. 在使用libtorch时,编写CMakeLists.txt中需要包含`set(Torch_DIR "/opt/libtorch/share/cmake/Torch")`否则无法编译。
### 1.2 Ceres 1.14
ceres安装过程未遇到什么问题,但是现在已经有了2.1版本,未避免出现其他的问题,这里统一使用1.14版本。(当然也可以自行尝试2.1或是newer的版本是否向下兼容)
:carrot:**具体步骤如下:**
1. `git clone https://gitee.com/undark/ceres-solver-1.14.0.git`
2. 下载相关依赖:
1. 检查自己是否已经安装`cmake`,如果没有,则执行`sudo apt install cmake`来下载。
2. 代码如下
```
# google-glog + gflags
sudo apt-get install libgoogle-glog-dev libgflags-dev
# Use ATLAS for BLAS & LAPACK
sudo apt-get install libatlas-base-dev
# Eigen3
sudo apt-get install libeigen3-dev
# SuiteSparse and CXSparse (optional)
sudo apt-get install libsuitesparse-dev
```
3. 接下来进行install过程。
1. 进入到clone的文件夹`ceres-solver-1.14.0`的同级目录下。
2. 建议在clone下的文件夹中,使用`rm -rf .git`脱离git,否则可能在后续的cmake时候会报错。
3. `mkdir ceres-bin`
4. `cd ceres-bin`
5. `cmake ../ceres-solver-1.14.0`
6. `make -j5` ,其中的 `-j` 后加的参数指的是编译机器的内核线程数。
7. `make test`
8. `make install `
至此,ceres安装完成。之后可以在网上搜索ceres相关的应用案例自己运行下。
### 1.3 ROS-melodic-full
###
网络上ROS的安装教程很多,这里放一个成功安装的教程。[tutorial](https://blog.csdn.net/c417469898/article/details/106410305)
### 1.4 ROS-melodic-serial
这是一个需要自己安装的串口包,没有则使用`sudo apt install ros-melodic-serial`进行安装。
### 1.5 MVS
安装步骤:
1. `git clone https://gitee.com/undark/mvs.git`
2. `cd /mvs/`
3. `sudo su`或`su root`获得root privileges
4. `source ./setup.sh`
5. 在 `/opt/`文件夹中出现`MVS`
6. 在编译示例程序之前,确认LD_LIBRARY_PATH和MVCAM_COMMON_RUNENV两个环境变量已经生效.
echo $MVCAM_COMMON_RUNENV
输出:/opt/MVS/lib
如果当前环境不存在以上两个环境变量或者变量中不包含/opt/MVS/lib相关值时,需要跳转到安装包所在路径,并输入:
`source ./set_env_path.sh`
7. 检验:
在`/opt/MVS/bin/`目录下打开terminal,执行操作`./MVSPlayer`
之后出现MVS客户端图形化界面。即证明MVS安装完成。
---
## Ⅱ. 代码快速上手
### 2.1 前言
目前所使用的代码是在不断的优化的,但结构如Ⅰ文件结构说明中所述,在一段时间内不会发生很大的改变。
:carrot: 遇到自己的机器上面的代码与最新版本的代码不同的问题,如果想要将本机修改或未修改的内容全部覆盖掉时,需要进行以下操作:
```python
git fetch --all
git reset --hard origin/master # git reset不加hard只会丢弃暂存区的变更,加上hard会连同工作区的也丢弃。
git pull
```
经过上述操作可以将本地代码强制覆盖,与远端仓库保持一致。
### 2.2 代码上手步骤
1. 依照依赖库安装步骤,将环境配置完成。
2. 从 远端仓库克隆代码至某一位置。
`git clone https://gitee.com/newsun-boki/Vision_bak.git`
3. 进入到`Vison_bak`文件夹中,此时文件夹中的结构应为:
```python
Vision_bak
|-- .vscode
|-- model
|-- src
|-- tool
|-- .gitignore
|-- README.md
`-- new_add.md
```
4. 使用`catkin_make`操作编译该项目工程包,之后出现`Built target Frame`说明编译成功。
:carrot:若在编译过程中出现问题,尽量自行查找解决问题,或找我问下。
5. 使用`source devel/setup.sh`进行ROS程序注册。
:carrot:若不想每次都重新注册,可以将`source devel/setup.sh` 的指令添加至home目录下 的`.bashrc`文件中,具体操作自行搜索。
6. 使用`roslaunch armor test.launch`来运行测试案例的launch文件。
7. 其他操作:
1. 更换敌人颜色:
:carrot:修改`src/armor/config/`中的参数文件。若为英雄则修改`bullet_42.yaml`中的`init_color_blue`,若为测试或是步兵则修改`bullet_17.yaml`中的`init_color_blue`。
2. 选择是否显示处理后的有目标图像:
:carrot:修改`src/armor/include/aim_deps/AimDeps.hpp`文件中的宏定义:`#define DISPLAY_TARGETS`。若显示则保留,若不显示则将这一行注释掉。
---
## Ⅲ. 文件结构说明
### 3.1 一级文件结构
```c
src
|-- armor(为主要内容)
|-- serial
|-- serial_com
|-- model
|
|-- tool
|-- CMakeLists.txt
|-- data_robust.txt
`-- plotCurve.py
```
### 3.2 armor包---自瞄代码的核心板块
#### 3.2.1 `armor`包文件结构(仅包含代码部分)
```
armor
|-- Frame.cc
|-- config # 参数文件,Ⅳ中详细说明
|
|-- include
| |-- aim_auto # 自瞄核心代码(灯条识别、装甲板匹配、数字识别等)
| |-- aim_cam # 相机取流模块
| |-- aim_dec # 决策模块
| |-- aim_deps# 依赖的部分参数和路径
| |-- aim_energy # 打符模块
| |-- aim_pos # 位置相关计算模块
| |-- aim_pre # 预测模块
| |-- aim_rec # 数字判别模块
| `-- readParam.hpp # 读取参数
|
|-- launch
|
|-- package.xml
|
`-- src
|-- aim_auto
|-- aim_cam
|-- aim_dec
|-- aim_deps
|-- aim_energy
|-- aim_pos
|-- aim_pre
`-- aim_rec
```
#### 3.2.2 内容
**1、`aim_auto`**
```
include
|-- AimAuto.hpp
|-- ArmorPlate.hpp
|-- ErrorTerm.hpp
`-- LightMatch.hpp
src
|-- aim_auto
|-- AimAuto.cc
|-- ArmorPlate.cc
`-- LightMatch.cc
```
**2、`aim_cam`**
```
include
|-- CameraCtl.hpp
|-- CameraParam.hpp
`-- HPG.hpp
src
|-- CameraCtl.cc
`-- HPG.cc
```
**3、`aim_dec`**
```
include
`-- Armordecision.hpp
src
`-- Armordecision.cc
```
**4、`aim_deps`**
```
include
|-- AimDeps.hpp
|-- AimRos.hpp
|-- LOG.hpp
`-- Paths.hpp
src
`-- Paths.cc
```
**5、`aim_energy`**
```
include
|-- WM_Param.hpp
`-- WindMill.hpp
```
**6、`aim_pos`**
```
include
`-- GetPos.hpp
src
`-- GetPos.cc
```
**7、`aim_pre`**
```
include
|-- Predict.hpp
`-- RobustError.hpp
src
`-- Predict.cc
```
**8、`aim_rec`**
```
include
`-- NumRec.hpp
src
`-- NumRec.cc
```
**9、`config`**
```
config
|-- WM_Param.yaml
|-- aim_deps_config.yaml
|-- bullet_17.yaml
`-- bullet_42.yaml
```
**10、`launch`**
```
launch
|-- hero.launch
|-- infantry.launch
|-- serrial_gdb.launch
|-- sim_gdb.launch
`-- test.launch
```
---
## Ⅳ. config 参数内容
config 文件夹中包含多个yaml文件,各个文件中包含了程序的部分可调参数,具体情况如下。
### 4.1 config 文件组成
| 文件名称 | 内容 |
| -------------------- | -------------------- |
| aim_deps_config.yaml | 自瞄相关通用参数 |
| bullet_17.yaml | 步兵特殊参数 |
| bullet_42.yaml | 英雄特殊参数 |
| init_color_blue.txt | 电控控制颜色改变参数 |
| WM_Param.yaml | 打符参数 |
### 4.2 各个文件参数内容
+ `aim_deps_config.yaml`
| 参数 | 意义 |
| :---------------------- | ------------------------------------------------------------ |
| use_prediction | 是否使用预测 |
| use_antispin | 是否开启反陀螺 |
| hit_tower_mode | 打前哨站中部旋转装甲板模式,主要应该由电控决定,在此仅为调试辅助 |
| red/blue_thresh_low | 二值图threshold下阈值 |
| red/blue_r_balance | RED/BLUE_白平衡(红色通道) |
| red/blue_g_balance | RED/BLUE_白平衡(green通道) |
| red/blue_b_balance | RED/BLUE_白平衡(蓝色通道) |
| red/blue_filter | RED/BLUE_环境或血条导致的杂灯条过滤阈值 |
| f_x/y,c_x/y,k_1/2,p_1/2 | 相机内参矩阵和畸变系数 |
| num_light | 数字识别阈值 |
| predict_mode | 预测模式 |
| coeff_v | 水平左右移动预测系数初始值 - 速度 |
| coeff_a | 水平左右移动预测系数初始值 - 加速度(一般来说,加速度预测系数需要比速度预测系数大) |
| acc_thresh | 加速度绝对值认定为 [较小]的阈值 |
| speed_thresh | 速度绝对值认定为 [较小]的阈值 |
| HSV_parameter | HSV相关参数 |
+ `bullet_17.yaml`&`bullet_42.yaml`
| 参数 | 意义 |
| -------------- | ------------------------------------------------------------ |
| cut_ratio | 从上往下开始裁减比例 |
| hsv_threshold | 0不使用hsv(不用调参) 1使用hsv(需要调hsv参数) |
| gimbal_k_value | 空气阻力系数(夏天接近0.01949, 冬天接近0.02117) |
| debug_mode | 初始status |
| from_video | 视频流是否来自于视频文件?1为是,若 0(否) 则来自于摄像头(新摄像头为4) |
| video_path | 若视频流来自文件,则value为视频地址 |
+ `init_color_blue.txt`
+ 该文件中包含的value为颜色(1为蓝,0为红)。
+ 当 current_status 和 old_status 对应的颜色不同时会进行修改。
+ 修改时会退出当前程序并依赖于`.bashrc`自重启动重新运行程序。
- `WM_Param.yaml`
| 参数 | 意义 |
| --------------------- | ------------------------- |
| s_armor_min/max | |
| armor_ratio_min/max | |
| s_armor_ratio_min/max | |
| s_R_min/max | |
| R_ratio_min/max | |
| s_R_ratio_min/max | |
| s_leaf_min/max | |
| fin_ratio_min/max | |
| s_fin_ratio_min/max | |
| R | |
| length | 能量机关半径 |
| height | 能量机关实际宽度 |
| hit_dx | 云台标准位置离R高度 |
| constant_speed | 打击点距能量机关R水平距离 |
| direction | 是否逆时针转动 1否0是 |
| init_k_ | 摩擦系数 |
| A | 速度函数参数 |
| w | 速度函数参数 |
| fai | 速度函数参数 |
---
## Ⅴ. 通信协议
### 5.1 电控通信协议
十三字节基础版本,包含:
| 位置 | 类型 | 电控给视觉 | 视觉给电控 |
| ---------------- | ----- | --------------------------------------- | --------------------------------- |
| 0/1/2/3 4Bytes | float | 电控IMU pitch(度)(哨兵可以用编码器) | 相机坐标系最优目标位置x(mm) |
| 4/5/6/7 4Bytes | float | 电控IMU yaw(度)(哨兵可以用编码器) | 相机坐标系最优目标位置y(mm) |
| 8/9/10/11 4Bytes | float | 电控弹速(m/s) | 相机坐标系最优目标位置z(mm) |
| 12 1Byte | uint8 | 复杂,1.2详细说明 | 高4位为当前锁定的车号。低四位0000 |
### 5.2 电控给视觉的控制信息status
`Frame.cc` 下有相应的status判断逻辑:
+ status / 5 == 1 时,击打目标为blue;status / 5 == 0 时,击打目标为red。
+ 以下数值为 **status % 5** 得到的值。
| 数值 | 意义 |
| ---- | ---------------- |
| 0 | 自瞄模式,关预测 |
| 1 | 打小符模式 |
| 2 | 自瞄模式,开预测 |
| 3 | 打大符模式 |
| 4 | 打旋转前哨站 |
---