Skip to content

数字识别

Eason Yi edited this page Jul 12, 2023 · 3 revisions

数字识别

本教程的目的:

  • 理解数字识别程序背后的原理
  • 掌握数字识别程序,并能够进行二次开发
  • 学会使用数字识别程序的接口,完成与数字识别相关的飞行任务

准备工作

  • 安装python2运行时环境,pytorch和opencv-python

    pip install torch==1.4.0+cpu torchvision==0.5.0+cpu -f https://download.pytorch.org/whl/torch_stable.html

    pip install opencv-python=='3.4.2.16'

  • 如果出现以下报错:No module named 'skbuild',执行:

    pip install scikit-build

  • 如果出现以下报错:ft2build.h: No such file or directory,执行:

    sudo apt-get install libfreetype6-dev

    sudo apt-get install libpng-dev

识别算法介绍

pytorch_mnist_camera.py及pytorch_mnist_gazebo.py

  • 订阅的相机话题为/prometheus/camera/rgb/image_raw

  • 订阅的相机话题为/P300_Monocular_front/Monocular/image_raw

  • 方向定义: 目标位置 [相机系下:右方x为正,下方y为正,前方z为正]

  • 默认发布话题: /prometheus/target (话题格式请参考Prometheus/Modules/msgs/msg/DetectionInfo.msg)

识别算法工作流程

G07ccT.png

  • 数字识别网络——LeNet-5,结构如下图所示

GwfGjA.png

  • 透视n点算法估计相对位姿

Gw4wlQ.png

识别算法参数修改

  • 首先启动相机节点,如需修改相机ID,请参考代码(使用gazebo仿真请忽略这一部分)
rosrun prometheus_detection web_cam
rosrun camera_calibration cameracalibrator.py --size 8x6 --sqre 0.0245 image:=/prometheus/camera/rgb/image_raw
# size为标点板尺寸,square为每个方格宽度(m),image:=相机话题
  • 将得到的参数写入如下文件(有关数字板尺寸的预定义也在这个文件中:digitnum_det_len,单位m,为数字板的白色边长,检测时存在误差)
# 真实相机参数文件
Prometheus/Modules/object_detection/config/camera_param.yaml
# gazebo仿真环境中的相机参数问题,默认情况下不需要标定仿真环境中的相机
Prometheus/Modules/object_detection/config/camera_param_gazebo_monocular.yaml
  • 数字板示例

G0qmcV.png

下载地址

数字可以兼容大部分手写字体,但是一定要有黑框与白底的正方形区域包围

任务程序介绍

number_detection.cpp

  • 订阅来自图像的识别信息,这里使用了自定义的消息prometheus_msgs::MultiDetectionInfo,具体消息格式可以在msgs文件夹中查看

     `ros::Subscriber vision_sub = nh.subscribe<prometheus_msgs::MultiDetectionInfo>("/prometheus/target", 10, vision_cb);`
    
  • 控制飞机自主起飞并悬停在数字墙前方,并打印显示识别结果。(注意:此处显示的结果为相机坐标系数值) GwZKit.md.png

数字识别Gazebo仿真

仿真world介绍

具体world配置内容,请查看wall_num.worldwall_with_num.sdf

当飞机悬停于[0,0,1.5]位置,并正对数字墙时,每一个数字ID相对于飞机的距离为

  • 数字0:前方5米,左边2米,上方1米
  • 数字1:前方5米,左边1米,上方1米
  • 数字2:前方5米,左边0米,上方1米
  • 数字3:前方5米,右边1米,上方1米
  • 数字4:前方5米,右边2米,上方1米
  • 数字5:前方5米,左边2米,下方1米
  • 数字6:前方5米,左边1米,下方1米
  • 数字7:前方5米,左边0米,下方1米
  • 数字8:前方5米,右边1米,下方1米
  • 数字9:前方5米,右边2米,下方1米

注意:由于相机坐标系与机体坐标系不重合,以及数字ID和墙体厚度的原因,解算出来的相对位置并不精准。

GwVEEn.md.png

仿真流程

  • 运行launch文件 roslaunch prometheus_gazebo sitl_number_detection.launch
  • number_detection终端中输入1开始任务,飞机将自动解锁,切换至OFFBOARD模式,并起飞至悬停点[0,0,1.5] GwVFBj.md.png
  • 可在窗口中观察到数字的识别情况,也可以在终端中查看识别情况及相对距离。 GwVkHs.md.png

运行截图: GOkVbt.gif

如何进行真机实验?

相机购买

相机标定

# 首先启动相机节点,如下命令启动相机ID=0
roslaunch prometheus_detection web_cam0.launch
# 然后利用ros自带的标定程序对相机进行标定
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.0245 image:=/prometheus/camera/rgb/image_raw
  • 其中:size为标点板尺寸,square为每个方格宽度(m),image:=相机话题

  • 棋盘格标定板下载地址:Chessboard

  • 将得到的参数写入如下文件(有关目标尺度的预定义也在这个文件中):Prometheus/Modules/object_detection/config/camera_param.yaml,例如参数如下:

  • 标定板样张如下

  • 其中,**每个方格宽度(square)**的大小为0.01564m,**标点板尺寸(size)**为9x6

制作图片样张

下载数字图片:Num0-9

一下样张如下:

如图所示,其中内框尺寸为0.162m,外框尺寸为0.2m

距离估计误差

可以看出,平均误差在距离的百分之6左右。

实际实验效果视频

Clone this wiki locally