菜单

视觉精准降落(改)

下载

本篇内容:使用视觉识别完成精准降落

  • 视觉识别基于Aruco实现
  • 示例程序仅提供基于使用方式,仅用于示例与教学,实际使用请注意飞行安全
  • 本程序依赖视觉识别sunray_vision_detection程序请自行下载编译
  • 程序对识别精度有一定要求,请检查实际检测结果输出是否正确,错误的检查结果会导致降落失败甚至炸机的结果

相关依赖安装
sudo apt-get install libv4l-dev
sudo apt-get install v4l-utils
sudo apt-get install libopencv-dev
sudo apt-get install libopencv-contrib-dev

降落靶标

程序示例中使用的尺寸:0.42x0.42m(外包围)

/
land_aruco.png

运行自动降落脚本(脚本启动时,在scripts_exp中打开终端后再输入指令)

  • 文件Sunray/scripts_exp/demo_auto_land.sh
  • 脚本内容
复制代码
gnome-terminal --window -e 'bash -c "roslaunch sunray_uav_control sunray_mavros_exp.launch; exec bash"' \
--tab -e 'bash -c "sleep 5.0; roslaunch web_cam web_cam.launch ; exec bash"' \
--tab -e 'bash -c "sleep 5.0; roslaunch sunray_uav_control external_fusion.launch external_source:=3; exec bash"' \
--tab -e 'bash -c "sleep 2.0; roslaunch sunray_uav_control sunray_control_node.launch uav_id:=1; exec bash"' \
--tab -e 'bash -c "sleep 2.0; roslaunch sunray_uav_control terminal_control.launch uav_id:=1; exec bash"' \
gnome-terminal --window -e 'bash -c "sleep 3.0; roslaunch sunray_tutorial landmark_detection.launch; exec bash"' \
--tab -e 'bash -c "sleep 5.0; rosrun rqt_image_view rqt_image_view; exec bash"' \
--tab -e 'bash -c "sleep 8.0; roslaunch sunray_tutorial auto_land_by_pose.launch; exec bash"' \
# --tab -e 'bash -c "sleep 8.0; roslaunch sunray_tutorial auto_land.launch; exec bash"' \
  • 终端输入
复制代码
./demo_auto_land.sh

手动启动:

运行mavros连接飞控

bash 复制代码
# 打开终端 启动ros
cd ~/Sunray
roscore

# 启动mavros连接无人机
roslaunch sunray_uav_control sunray_mavros_exp.launch 

运行定位算法

bash 复制代码
# 启动外部定位节点和动捕
roslaunch sunray_uav_control external_fusion.launch external_source:=3
复制代码
### 运行控制节点    
```bash
# 启动节点
roslaunch sunray_uav_control sunray_control_node.launch
# 启动终端控制
roslaunch sunray_uav_control terminal_control.launch

启动相机节点

如果打开相机不为下视相机或打开失败请修改配置中的串口为实际设备序号 一般为/dev/video0-videon
配置文件:sunray_vision_detection/web_cam/config/web_cam.yml

复制代码
roslaunch web_cam web_cam.launch
# 可以打开rqt_image_view查看是否有对应的图像

运行降落靶标识别节点

复制代码
# 降落靶标识别
roslaunch sunray_tutorial landmark_detection.launch
# 可以打开rqt_image_view查看是否有识别到二维码
/
(改)

运行该脚本请确保无人机已经起飞并处于二维码上空使无人机能识别到二维码

  • 请根据实际实际跟随方式选择要运行的节点,一下脚本二选一运行
复制代码
# 基于位置控制的方式
roslaunch sunray_tutorial auto_land_by_pose.launch
# 基于速度控制的方式
roslaunch sunray_tutorial auto_land.launch
  • 启动脚本
  • 请修改camera_name和image_topic为实际图像话题,订阅的话题将以camera_name/image_topic的形式订阅
复制代码
# landmark_detection.launch
<launch>
    <env name="ROSCONSOLE_CONFIG_FILE" value="$(find sunray_tutorial)/config/rosconsole.config"/>
    <arg name="camera_name" default="/usb_cam" />
    <arg name="image_topic" default="image_raw" />
    <arg name="queue_size" default="1" />

    <node pkg="landmark_detection_ros" type="landmark_detection_ros_node" name="landmark_detection_ros_node" output="screen">
        <remap from="image_rect" to="$(arg camera_name)/$(arg image_topic)" />
        <remap from="camera_info" to="$(arg camera_name)/camera_info" />

        <param name="queue_size" type="int" value="$(arg queue_size)" />

        <param name="uav_id" type="int" value="1" />
        <param name="x_bias" type="double" value="0" />
        <param name="y_bias" type="double" value="0" />
        <param name="draw_tag_detections_image" type="bool" value="true" />

        <param name="rotate" type="int" value="1" /> <!-- 0: no rotation, 1: rotate 180 degree clockwise, 2: rotate 90 degree clockwise  3: rotate -90 degree clockwise-->

        <param name="algorithm_parameters" type="str" value="$(find sunray_tutorial)/config/aruco_detector_params.json" />
        <param name="camera_parameters" type="str" value="$(find sunray_tutorial)/config/head_camera.yaml" />
        <param name="local_saving_path" type="str" value="$(find sunray_tutorial)/output" />
        
    </node>
</launch>
  • aruco_detector_params_sim.json 识别相关配置
    实际使用时修改markerLengths即可,以单二维码黑色边框实际尺寸为准
复制代码
{
    "ArucoDetector": {
        "dictionaryId": 1,
        "markerIds": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,91,92,93,94],
        "markerLengths": [0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.052,0.212,0.212,0.212,0.212],
        "adaptiveThreshConstant": 7,
        "adaptiveThreshWinSizeMax": 23,
        "adaptiveThreshWinSizeMin": 3,
        "adaptiveThreshWinSizeStep": 10, 
        "aprilTagCriticalRad": 0.17453292519,
        "aprilTagDeglitch": 0,
        "aprilTagMaxLineFitMse": 10.0,
        "aprilTagMaxNmaxima": 10,
        "aprilTagMinClusterPixels": 5,
        "aprilTagMinWhiteBlackDiff": 5,
        "aprilTagQuadDecimate": 0.0,
        "aprilTagQuadSigma": 0.0,
        "cornerRefinementMaxIterations": 30,
        "cornerRefinementMethod": 0,
        "cornerRefinementMinAccuracy": 0.1,
        "cornerRefinementWinSize": 5,
        "detectInvertedMarker": false,
        "errorCorrectionRate": 0.6,
        "markerBorderBits": 1,
        "maxErroneousBitsInBorderRate": 0.35,
        "maxMarkerPerimeterRate": 4.0,
        "minCornerDistanceRate": 0.05,
        "minDistanceToBorder": 3,
        "minMarkerDistanceRate": 0.05,
        "minMarkerLengthRatioOriginalImg": 0,
        "minMarkerPerimeterRate": 0.03,
        "minOtsuStdDev": 5.0,
        "minSideLengthCanonicalImg": 32,
        "perspectiveRemoveIgnoredMarginPerCell": 0.13,
        "perspectiveRemovePixelPerCell": 4,
        "polygonalApproxAccuracyRate": 0.03,
        "useAruco3Detection": false
    }
}
  • head_camera.yaml 相机内参
复制代码
%YAML:1.0
---
calibration_time: "Mon Aug 12 14:19:51 2024"
image_width: 640
image_height: 480
camera_name: usb_cam
distortion_model: plumb_bob
camera_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 5.8073836624234639e+02, 0., 3.4026653041851887e+02, 0.,
       5.8193473945541200e+02, 2.3147452752869887e+02, 0., 0., 1. ]
distortion_coefficients: !!opencv-matrix
   rows: 1
   cols: 5
   dt: d
   data: [ 3.6130919074799477e-02, 1.1900433468807413e-01,
       2.6210657400892435e-03, -1.3749174061884208e-03,
       -1.7425085463579266e+00 ]
rectification_matrix: !!opencv-matrix
   rows: 3
   cols: 3
   dt: d
   data: [ 1., 0., 0., 0., 1., 0., 0., 0., 1. ]
projection_matrix: !!opencv-matrix
   rows: 3
   cols: 4
   dt: d
   data: [ 5.8073836624234639e+02, 0., 3.4026653041851887e+02,
       -1.7632733596808731e-01, 0., 5.8193473945541200e+02,
       2.3147452752869887e+02, -4.5388923997248358e-02, 0., 0., 1.,
       4.3764930595089069e-01 ]
avg_reprojection_error: 1.6889888091837532e-01
aruco_reprojection_error: 1.2109431741860688e+00

运行结果
如程序正常运行,无人机将逐渐向二维码正上方移动并逐步降落
达到一定高度后将直接降落完成降落过程
如降落过程出现二维码丢失会等待5s,若5s后还是未识别到则直接降落

上一个
二次开发
下一个
单二维码与自动跟随(改)
最近修改: 2025-09-04