darknet_ros就是darknet在ros操作系统下的版本,即在ros下使用yolo进行目标检测。
首先对其文件分类:.launch文件是ros格式的roslaunch文件;src文件夹下的就是它的主要代码,把ros和darknet结合起来的部分;cfg文件是放各种yolo网络的配置,weights文件夹是放置网络权重。
这些yaml文件是设置ros参数以及决定在ros下调用darknet的哪些配置文件和权重。ros.yaml如下
定义了接受图片的订阅者话题名称/avt_camera,和发送出去的发布者话题名称,包括物体类别和物体框(中心座标和长宽)两个话题。
在ros中是以节点为单位进行基本功能的,这个代码相当于把整个darknet定义为一个节点,然后给这个节点输入图片,节点能输出相应的检测出的目标类别和位置信息,现在看到源码yolo_object_detector_node.cpp
/*
* yolo_obstacle_detector_node.cpp
*
* Created on: Dec 19, 2016
* Author: Marko Bjelonic
* Institute: ETH Zurich, Robotic Systems Lab
*/
#include <darknet_ros/YoloObjectDetector.hpp>
#include <ros/ros.h>
int main(int argc, char** argv) {
ros::init(argc, argv, "darknet_ros");//初始化
ros::NodeHandle nodeHandle("~");//创建节点类
darknet_ros::YoloObjectDetector yoloObjectDetector(nodeHandle);//创建yoloObjectDetector类
ros::spin();//ROS消息回调处理函数,相当于一个循环进入后就不会继续往下执行主函数了,而是一直将回调函数队列里的回调函数输出
return 0;
}
代码很短,主要就是定义了一个ros节点,并在这个节点中创建一个YoloObjectDetector的类,所以关键就是这个类是干什么的。
而这个类的创建在YoloObjectDetector.cpp中,代码很长,是把darknet移植到ros的核心部分,大概600行,里面基本都是函数,比较乱,花了一两天时间才理清楚直接的关系并画了一个流程图来梳理其结构。
其中主要功能在YoloObjectDetector::yolo中。