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中。