自主降落 · amov 您所在的位置:网站首页 无人机自动降落怎么找 自主降落 · amov

自主降落 · amov

2024-04-06 22:45| 来源: 网络整理| 查看: 265

自主降落

本教程的目的:

理解二维码识别程序背后的原理 掌握降落板识别程序,并能够进行二次开发 理解追踪的原理,运动目标的状态估计的原理 掌握自主降落程序,并能够进行二次开发 识别算法介绍

landpad_det.cpp

订阅:

真实环境中订阅的相机话题为/prometheus/camera/rgb/image_raw

仿真环境中订阅的相机话题为/P300_Monocular_front/Monocular/image_raw

发布:

检测结果话题/prometheus/object_detection/landpad_det (话题格式请参考Prometheus/Modules/msgs/msg/DetectionInfo.msg)

配置文件

真实环境中的配置文件为Prometheus/Modules/object_detection/config/camera_param.yaml

仿真环境中的配置文件为Prometheus/Modules/object_detection/config/camera_param_gazebo_monocular.yaml

注意修改参数landpad_det降落板边长(默认0.6m),0.6m包括边缘白色部分,黑色部分边长为0.4m

算法识别流程

降落板示例:

GykHsK.png

Aruco模块主要基于ArUco library,是一个二维码识别中被广泛使用的库。

一个ArUco标记外围都有一组黑色边框,同时内部有着确定该标记ID的二维矩阵组合而成。黑色的边框能加速标记在图像中的检测速度,内部的二维编码能唯一识别该标记,同时进行错误检测和错误修复。

注意:

二维码的样图可以从SpirePan下载

自主降落算法介绍

autonomous_landing.cpp

订阅降落板识别检测结果,即相对位置 ros::Subscriber landpad_det_sub = nh.subscribe("/prometheus/object_detection/landpad_det", 10, landpad_det_cb);

执行追踪算法及追踪策略(请阅读源码进行学习)

发布上层控制指令

ros::Publisher command_pub = nh.advertise("/prometheus/control_command", 10);

参数Thres_vision为视觉丢失阈值,参数distance_thres为判断是否直接上锁距离阈值,参数landing_pad_height为降落板高度,参数use_ukf表示是否使用UKF目标状态进行滤波估计,moving_target表示目标是静止或者移动,kpx_land/kpy_land/kpz_land为控制参数,start_point_x/start_point_y/start_point_z为起始点位置

关于坐标系转换的说明:

识别算法发布的目标位置位于相机坐标系(从相机往前看,物体在相机右方x为正,下方y为正,前方z为正) 首先,从相机坐标系转换至机体坐标系(从机体往前看,物体在相机前方x为正,左方y为正,上方z为正):由于此demo相机朝下安装,且xy方向无偏移量 pos_body_frame[0] = - Detection_raw.position[1]; pos_body_frame[1] = - Detection_raw.position[0]; pos_body_frame[2] = - Detection_raw.position[2]; 从机体坐标系转换至与机体固连的ENU系(原点位于质心,x轴指向yaw=0的方向,y轴指向yaw=90的方向,z轴指向上的坐标系):直接乘上机体系到惯性系的旋转矩阵即可 R_Body_to_ENU = get_rotation_matrix(_DroneState.attitude[0], _DroneState.attitude[1], _DroneState.attitude[2]); pos_body_enu_frame = R_Body_to_ENU * pos_body_frame; 从与机体固连的ENU系转换至ENU系(原点位于起飞点,x轴指向yaw=0的方向,y轴指向yaw=90的方向,z轴指向上的坐标系) Detection_ENU.position[0] = drone_pos[0] + pos_body_enu_frame[0]; Detection_ENU.position[1] = drone_pos[1] + pos_body_enu_frame[1]; Detection_ENU.position[2] = drone_pos[2] + pos_body_enu_frame[2]; 仿真流程

运行启动脚本(静止目标) roslaunch prometheus_gazebo sitl_landing.launch

运行启动脚本(移动目标)

roslaunch prometheus_gazebo sitl_landing_moving_target.launch

启动后,输入1启动自动降落任务,飞机将起飞至起始点 GD54l8.md.png

对于移动目标,待飞机起飞完毕后,新开一个窗口运行以下指令控制小车移动 rosrun prometheus_gazebo move_landing_pad.py

飞机将持续读取图像信息,结果可在终端查看,并可与真值进行比较。如丢失图像信息,飞机将会悬停在当前点 GD5hSf.md.png

当飞机与降落板位置小于阈值时,飞机将自动上锁,完成任务 GD52FI.md.png

测试视频1 测试视频1

如何进行真机实验? 相机购买 我们的测试相机是在如下淘宝店购买的(仅供参考):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,例如参数如下:

标定板样张如下

降落标识打印

我们使用的淘宝打印店铺(仅供参考),https://saikeyou.tmall.com/shop/view_shop.htm?spm=a230r.1.14.5.6b6e17e5jOudLm&user_number_id=1673324284

打印样张如下:

距离估计精度测试(地面实验)

在A4纸打印标识如下:

如图所示,降落版边长为0.188m。

执行指令:

## 请根据自己的相机节点选择 roslaunch prometheus_detection web_cam0.launch ## 运行检测节点 roslaunch prometheus_detection landpad_det.launch ## 查看检测效果(可视化) rqt_image_view

距离估计精度实验结果如下:

可以看出,距离误差在为距离的百分之7左右。

降落版边长为0.188m时,最远检测距离为2.65m,最近检测距离小于0.01m。

实际试验测试视频

video1



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有