-
Notifications
You must be signed in to change notification settings - Fork 421
数字识别
本教程的目的:
- 理解数字识别程序背后的原理
- 掌握数字识别程序,并能够进行二次开发
- 学会使用数字识别程序的接口,完成与数字识别相关的飞行任务
-
安装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)
识别算法工作流程
- 数字识别网络——LeNet-5,结构如下图所示
- 透视n点算法估计相对位姿
识别算法参数修改
- 首先启动相机节点,如需修改相机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
- 数字板示例
数字可以兼容大部分手写字体,但是一定要有黑框与白底的正方形区域包围
number_detection.cpp
-
订阅来自图像的识别信息,这里使用了自定义的消息
prometheus_msgs::MultiDetectionInfo
,具体消息格式可以在msgs
文件夹中查看`ros::Subscriber vision_sub = nh.subscribe<prometheus_msgs::MultiDetectionInfo>("/prometheus/target", 10, vision_cb);`
仿真world介绍
具体world配置内容,请查看wall_num.world
及wall_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和墙体厚度的原因,解算出来的相对位置并不精准。
仿真流程
- 运行launch文件
roslaunch prometheus_gazebo sitl_number_detection.launch
- 在
number_detection
终端中输入1开始任务,飞机将自动解锁,切换至OFFBOARD模式,并起飞至悬停点[0,0,1.5] - 可在窗口中观察到数字的识别情况,也可以在终端中查看识别情况及相对距离。
运行截图:
- 我们的测试相机是在如下淘宝店购买的(仅供参考):https://item.taobao.com/item.htm?_u=g5bpko475d4&id=605447137649
# 首先启动相机节点,如下命令启动相机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左右。
感谢使用Prometheus自主无人机软件平台!