ROS YOLOv8 目标检测节点:实时距离和角度计算
import rospy
from darknet_ros_msgs.msg import BoundingBoxes
import numpy as np
class ObjectDetector:
def __init__(self):
# 初始化订阅者,订阅 YOLOv8 检测结果
self.bounding_box_sub = rospy.Subscriber('/yolov8/BoundingBoxes', BoundingBoxes, self.on_bounding_boxes,
queue_size=1)
# 初始化距离和角度信息
self.dist_1 = 0
self.beta3 = 0
def on_bounding_boxes(self, message):
'回调函数:处理收到的边框消息'
# 存储边框消息
self.bounding_boxes = message
# 解析目标检测结果
num_boxes = len(message.bounding_boxes)
object_detected = False
for i in range(num_boxes):
if message.bounding_boxes[i].Class == '1':
object_detected = True
x_min = message.bounding_boxes[i].xmin
x_max = message.bounding_boxes[i].xmax
y_min = message.bounding_boxes[i].ymin
y_max = message.bounding_boxes[i].ymax
break
if object_detected:
x_center = (x_min + x_max) / 2
y_center = (y_min + y_max) / 2
self.dist_1 = 1 / (x_center + 1e-6) # 与目标距离的倒数作为距离信息
self.beta3 = -np.arctan((y_center - 240) / x_center) # 与目标中心点连线与车辆前进方向的夹角
alpha = 0.2 # 平滑参数
self.dist_1 = alpha * x_center + (1 - alpha) * self.dist_1 # 距离指数移动平均
self.beta3 = alpha * self.beta3 + (1 - alpha) * self.beta3 # 角度指数移动平均
else:
self.dist_1 = 0
self.beta3 = 0
# 在需要运行该节点的地方,调用以下代码:
if __name__ == '__main__':
rospy.init_node('yolov8_object_detector') # 初始化节点
detector = ObjectDetector() # 创建 ObjectDetector 对象
rospy.spin() # 进入 ROS 循环,等待消息的到来
使用说明:
- 安装依赖库:
pip install rospy darknet_ros_msgs numpy
- 修改代码:
- 将
your_node_name替换为你的节点名称。 - 将
ObjectDetector替换为你的类名称。 - 如果需要检测不同的目标类别,请修改
if message.bounding_boxes[i].Class == '1':中的'1'为目标类别的编号。 - 可以根据实际情况调整距离和角度的计算方式。
- 运行节点:
rosrun your_package_name your_node_name.py
注意事项:
- 确保你的 ROS 环境已配置好,并且 YOLOv8 检测节点已正常运行。
- 需要将 YOLOv8 的输出主题改为
/yolov8/BoundingBoxes。 - 距离和角度的计算方式可能需要根据实际情况进行调整。
- 请确保
240是图像中心点 Y 坐标的值。 - 距离信息的计算使用了目标中心点 X 坐标的倒数,可以根据实际情况调整。
- 角度的计算使用了
np.arctan函数,可以根据实际情况选择不同的三角函数。 - 指数移动平均的平滑参数
alpha可以根据实际情况进行调整。
原文地址: https://www.cveoy.top/t/topic/oSIP 著作权归作者所有。请勿转载和采集!