# offb **Repository Path**: Frederick_Y/offb ## Basic Information - **Project Name**: offb - **Description**: 《飞机综合控制系统设计与实践》课程—— ROS自主识别目标&投弹打击任务 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-12-02 - **Last Updated**: 2025-08-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ROS自主识别目标&投弹打击任务 本仓库是机载计算机上所需要的程序。 Python脚本放在了script文件夹下,C/C++源码放在src文件夹下。C++程序需要使用catkin_make命令进行编译,Python程序无需编译。 Launch文件在launch文件夹下,分为仿真用的(bombing_sitl.launch)和实际飞行时用的(bombing.launch) 使用launch文件可同时启动Realsense+Mavros+OpenCV+Bomber,运行命令: `roslaunch offb bombing.launch fcu_url:=/dev/ttyTHS0:115200 align_depth:=true` 或者单独运行: - offboard节点 rosrun offb offb_node - 仿真环境 roslaunch px4 mavros_posix_sitl_fpv_cam.launch(仅供参考,选择了一个带有摄像头的飞机模型,需要自行修改模型参数) - python脚本 python xxx.py ## offboard飞行节点 在编写时参考了PX4官方示例程序,MAVROS消息可以在MAVROS的wiki页面上查找到,在百度搜索MAVROS即可。该程序目前是单线程,在while循环中不断处理,可以理解为一个while循环就是一个“行为”,如起飞,寻找目标等。如果程序非常复杂和庞大,可以考虑使用多线程,在一个线程中专门发布消息。至于具体的程序解释,请看程序注释和PPT,这里不再重复。 另外,在编写自主飞行节点时,请注意: 首先是,程序中绝对不能反复请求进入offboard模式或解锁。在飞行中,一旦遇到飞机行为和预期不符,应该能立刻切回手动模式,如自稳或定点等。假如程序此时又尝试进入offboard模式将会是非常危险的。 第二,在用真机外场测试前,尽量先进行仿真实验。虽然真机和仿真环境还存在很多区别,但是仿真环境至少可以帮助排除一些低级错误,避免损失。 ## 图像识别节点 在地面上,首先使用color_pick.py文件提取图像中心点的HSV数据,供目标识别节点使用。然后将这些数据填入cv_test_add_color.py中对应位置。 ## 投弹节点 投弹节点程序为bomber.py, 主要包括目标的坐标转换部分和投弹时机预测部分 首先订阅目标和飞行器数据,将目标位置转换到以弹舱为中心平行于地面的弹舱坐标系中,获得目标的竖直高度和水平距离 投弹预测采用标准的斜抛运动算法,在接收到进入投弹航线的指令后,将投弹距离与实际(预测)距离比较,满足投弹条件时向串口发送投弹信号。 ## 图像处理节点 用于追踪目标的图像识别程序使用OpenCV开发,并且编写成python脚本的形式在上位机中运行。 程序实现的功能主要为:读入图像、提取图像中的颜色、识别相应颜色的图像中的形状以及返回形状在图像中的位置 1. 读入图像: ``` cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8") cv_image = cv2.resize(cv_image, (640, 480)) ``` 通过使用Cv_Bridge()将ROS的图像类数据转换OpenCV的mat类型的数据。 2. 提取图像中符合条件的颜色 首先进行灰度化和HSV色彩空间转换 ``` imgGray = cv2.cvtColor(cv_image,cv2.COLOR_BGR2GRAY) imgHSV = cv2.cvtColor(cv_image,cv2.COLOR_BGR2HSV) ``` 接着通过筛选特定的颜色范围创建掩膜并提取出原图像中符合要求的颜色 ``` lower = np.array([160,70,170]) upper = np.array([180,230,255]) mask = cv2.inRange(imgHSV,lower,upper) mask = cv2.dilate(mask, np.ones((3, 3), np.uint8)) mask = cv2.erode(mask,np.ones((3,3),np.uint8)) imgColor = cv2.bitwise_and(cv_image,cv_image,mask=mask) ``` 过程中对掩膜进行了膨胀和腐蚀运算来消除噪声 3. 识别相应颜色中的图形形状 主要通过以下函数实现 `def getContours(img,imgContour,imgColor,mask):` 首先寻找图像中的轮廓 `a,contours,hierarchy= v2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)` 采用多边形近似获得大致形状 `approx = cv2.approxPolyDP(cnt,0.02*peri,True)` 通过近似多边形边数判断形状类型 `objCor = len(approx)` 4. 返回形状在图像中的位置 在符合要求的形状上打上外界矩形,并通过矩形中点坐标返回目标在图像中的位置 ``` cv2.rectangle(imgColor,(x,y),(x+w,y+h),(0,255,0),2) return x+(w//2),y+(h//2) ```