# 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**. ![pics](https://rm-static.djicdn.com/tem/12037/15277487492d31567077707260390296.jpg) --- ## Ⅰ. 环境配置(以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不兼容的问题。(报错如下)![报错](Autoaim 说明/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1hESDE5OTEwMTEz,size_16,color_FFFFFF,t_70.png) :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 网络上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 | 打旋转前哨站 | ---