# bs_gd_single **Repository Path**: luzer/bs_gd_single ## Basic Information - **Project Name**: bs_gd_single - **Description**: 基于红外特征点的视觉定位算法 - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-07-14 - **Last Updated**: 2025-08-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 这是为空中加油视觉定位代码所写的readme文件。 硬件上的操作基本没有:插上三个相机的USB线,插上串口的USB线,连接电源运行脚本。**所有密码均为.*** 在bs_gd_single这个ros工作空间下创建了两个包,分别为 1. bs_multi_solver:解算位置用 2. daheng_camera_pkg:获取相机图像用 所有脚本都保存在bs_gd_single/src目录下。 # Warning 1. 现在基本用的**版本2**,版本1已经弃用,但版本1中bs_module中定义的函数仍然使用 2. 不知道为什么,在测试时发现无论是用网线进行远程连接还是使用外接屏幕,在断掉他们进行飞行后部分ROS进程会暂停,重新插上之后ROS进程继续执行。不知所以然的解决方法:**先外接屏幕运行sh文件打开ROS进程->NUC上插上显卡欺骗器->拔掉外接屏幕的HDMI线->飞行->降落->插上外接屏幕的HDMI线->拔下显卡欺骗器,通过屏幕观察运行结果。** ******************** **版本1** 图像获取后通过ros发布,其他脚本订阅话题后处理图像得到位置 ## _scripts文件夹 存储运行系统的.sh脚本文件,其中solve_3cam.sh一键运行整个系统 ## bs_multi_solver文件夹 包含相机驱动程序,相机图像获取程序。 ### ./scripts下存储py脚本文件 1. publisher_dhcam_lf(sf/wa).py分别为长焦、短焦和广角相机的图像读取程序 ### ./launch下存储launch文件 1. daheng_lf(sf/wa)cam.launch分别为长焦、短焦和广角相机的相机驱动程序的roslaunch文件。要读取正确的相机图像,需要在脚本内设定相机编号“sn”,以及可以设定相机曝光时间“ExposureTime”。 ## daheng_camera_pkg文件夹 包含相机相对位置解算程序。 ### ./scripts下存储py脚本文件 1. bs_solver_lf(sf/wa).py分别为长焦、短焦和广角相机的相对位置解算程序 2. serial_pack.py为定义的串口通信模块 3. serial_transfer_data_with_filter.py为串口数据传输程序,将复眼系统最终结果传输给串口 4. bs_module是一些utls,下面具体介绍。 ### ./launch下存储launch文件 1. bs_solver_lf(sf/wa).launch分别为长焦、短焦和广角相机的roslaunch文件 ## bs_multi_solver/bs_module文件夹 包含一些工具类,主要是特征点提取,位置解算等,通过setup.py安装rospython路径下。 ### ./bs_img 1. bs_cfg_real_5m.py 预保存飞机靶标点实际坐标**plane_real_ptL**(原点在飞机尾部,z指向机头,y指向下)、飞机靶标点形状向量**plane_real_val**、锥套半径**r_drogue**、相机内参**camK_lf、distortion_coeffs_lf**,**camK_sf、distortion_coeffs_sf**,**mapping_coeffs、stretch_matrix、distortion_center**(第三个为鱼眼,matlab标定出,按matlab模型走)等参数。 2. bs_img_real_airsim.py AirSim仿真时写的辅助函数,实际系统并未使用。 3. bs_img_base.py 飞机位置解算,使用**solve_plane_pt_new**函数,输入特征点图像位置、相机内参矩阵、相机畸变系数和特征点相应的面积;相较于**solve_plane_pt**函数来说,增加特征点的面积用于误差判断,以更方便分离飞机和锥套特征点 4. bs_img_real.py **img_to_pts**函数,从经过阈值分割的图片中提取靶标点坐标;**fit_ellipse**和**least_square_circle**分别使用椭圆和圆拟合锥套特征点,最终使用的是椭圆;**solve_drogue**和**solve_drogue_wa**分别是解算针孔(长短焦相机)和鱼眼(广角)相机中锥套位置的函数。 5. bs_lie_solve.py 仅用到**find_matched_pts**函数,寻求前后两帧飞机特征点的匹配关系。 ### ./bs_imu 仅使用到了./bs_imu.py中四元数、Euler角、旋转矩阵之间的相互转换。 gps_process.m 脚本是用来处理RTK的测量值获得前后两架飞机之间相对位置在后机本体系下坐标真值的解算程序。(这边提供的相对位置值也不知道为什么在yz轴上解算不准确) ******************* **版本2** 图像获取后在同一脚本中处理图像得到位置,省去ros发布图像,大致会降低图像传输带来的延时,以及降低多相机同时通过ros发布时有限的带宽带来的速率的降低,同时避免读入大量未用到的图像所带来的计算资源的浪费 同样需要安装bs_module ,仍然需要使用这些函数,原理都一样,命名类似,不再赘述 *************************** **版本3** 长焦和短焦图像融合后再进行求解,之前分别求解再融合总感觉是两个相机求解结果误差分布的问题融合结果波动比较大,我这边只有位置数据滤波效果也不会太好 算了,不折腾了,有几个大问题: 1. resize后长短焦图像尺寸差的太大,很难配准 2. 短焦resize到九千多之后只融合一帧就要耗时0.2s,太慢了 ***************** ## 可调参数 使用该系统时需要实际调节的参数,目前文件中的参数预设值经过目前的检验并无问题,更换场景后若系统无法正常工作则需要重新调节。 可调参数包括: 1. 相机相关:序列号,曝光时间,均在/daheng_camera_pkg/launch下;相机内参,/bs_multi_solver/bs_module/bs_cfg_real_5m.py下 2. 靶标点提取最大最小靶标点面积设置 2. 锥套靶标点拟合误差:锥套拟合函数中 3. 飞机靶标点重投影误差:飞机相对位置估计函数中 4. 阈值分割操作阈值设置 # 所使用库的版本 1. 需要预先安装大恒相机驱动,[大恒相机SDK下载](https://www.daheng-imaging.com/index.php?m=content&c=index&a=lists&catid=59&czxt=9&sylx=&syxj=44#mmdhttps://www.daheng-imaging.com/index.php?m=content&c=index&a=lists&catid=59&czxt=9&sylx=&syxj=44#mmd) 2. Python版本为3.8.10,ROS版本为noetic。 2. 其余Python库的版本如下(挑必要的写): ``` Package Version ----------------------------- -------------------- camera-calibration 1.17.0 camera-calibration-parsers 1.12.0 catkin 0.8.10 catkin-pkg 1.0.0 catkin-pkg-modules 1.0.0 catkin-tools 0.9.2 cv-bridge 1.16.2 GitPython 3.1.43 gxipy 2.0.2105.9261 image-geometry 1.16.2 importlib_metadata 7.1.0 importlib_resources 6.4.0 matplotlib 3.7.5 matplotlib-inline 0.1.7 numba 0.58.1 numpy 1.24.4 nvidia-cublas-cu12 12.1.3.1 nvidia-cuda-cupti-cu12 12.1.105 nvidia-cuda-nvrtc-cu12 12.1.105 nvidia-cuda-runtime-cu12 12.1.105 nvidia-cudnn-cu12 8.9.2.26 nvidia-cufft-cu12 11.0.2.54 nvidia-curand-cu12 10.3.2.106 nvidia-cusolver-cu12 11.4.5.107 nvidia-cusparse-cu12 12.1.0.106 nvidia-nccl-cu12 2.20.5 nvidia-nvjitlink-cu12 12.5.40 nvidia-nvtx-cu12 12.1.105 oauthlib 3.1.0 olefile 0.46 onnx 1.16.1 onnxruntime 1.18.0 opencv-contrib 1.0.0.14 opencv-contrib-python 4.8.0.74 opencv-python 4.9.0.80 osrf-pycommon 2.0.2 packaging 24.0 pandas 2.0.3 pillow 10.3.0 pip 23.2 rosbag 1.16.0 rosboost-cfg 1.15.8 rosclean 1.15.8 roscreate 1.15.8 rosdep 0.24.0 rosdep-modules 0.24.0 rosdistro 0.9.1 rosdistro-modules 0.9.1 rosgraph 1.16.0 rosinstall 0.7.8 rosinstall-generator 0.1.23 roslaunch 1.16.0 roslib 1.15.8 roslint 0.12.0 roslz4 1.16.0 rosmake 1.15.8 rosmaster 1.16.0 rosmsg 1.16.0 rosnode 1.16.0 rosparam 1.16.0 rospkg 1.5.1 rospkg-modules 1.5.1 rospy 1.16.0 rosservice 1.16.0 rostest 1.16.0 rostopic 1.16.0 rosunit 1.15.8 roswtf 1.16.0 rqt_action 0.4.9 rqt_bag 0.5.1 rqt_bag_plugins 0.5.1 rqt-console 0.4.12 rqt_dep 0.4.12 rqt_graph 0.4.14 rqt_gui 0.5.3 rqt_gui_py 0.5.3 rqt-image-view 0.4.17 rqt_launch 0.4.9 rqt-logger-level 0.4.12 rqt-moveit 0.5.11 rqt_msg 0.4.10 rqt_nav_view 0.5.7 rqt_plot 0.4.13 rqt_pose_view 0.5.11 rqt_publisher 0.4.10 rqt_py_common 0.5.3 rqt_py_console 0.4.10 rqt-reconfigure 0.5.5 rqt-robot-dashboard 0.5.8 rqt-robot-monitor 0.5.15 rqt_robot_steering 0.5.12 rqt-runtime-monitor 0.5.10 rqt-rviz 0.7.0 rqt_service_caller 0.4.10 rqt_shell 0.4.11 rqt_srv 0.4.9 rqt-tf-tree 0.6.4 rqt_top 0.4.10 rqt_topic 0.4.13 rqt_web 0.4.10 rviz 1.14.23 scipy 1.10.1 seaborn 0.13.2 sophuspy 1.2.0 torch 2.3.0 torchvision 0.18.0 tornado 6.4 ```