创建的ros工作空间ros_ws
第一步:进入/ros_ws/src中,打开终端,克隆darknet_ros
包到该目录中:
git clone https://github.com/leggedrobotics/darknet_ros.git
第二步:需要进入darknet_ros
包的根目录,并更新子模块:
cd darknet_ros
git submodule update --init --recursive
但是我执行该命令时提示如下
xtark@xtark-robot:~/ros_ws/src/darknet_ros$ git submodule update --init --recursive Submodule 'darknet' (https://github.com/leggedrobotics/darknet) registered for path 'darknet' fatal: destination path '/home/xtark/ros_ws/src/darknet_ros/darknet' already exists and is not an empty directory. fatal: clone of 'https://github.com/leggedrobotics/darknet' into submodule path '/home/xtark/ros_ws/src/darknet_ros/darknet' failed Failed to clone 'darknet'. Retry scheduled fatal: destination path '/home/xtark/ros_ws/src/darknet_ros/darknet' already exists and is not an empty directory. fatal: clone of 'https://github.com/leggedrobotics/darknet' into submodule path '/home/xtark/ros_ws/src/darknet_ros/darknet' failed Failed to clone 'darknet' a second time, aborting
查询原因,如下所示:
根据提供的终端输出,提示`fatal: destination path '/home/xtark/ros_ws/src/darknet_ros/darknet' already exists and is not an empty directory.`提示当前目录下已经存在了名为'darknet'的子模块,并且不是个空目录,因此子模块无法被克隆。
这种情况可能是由于之前已经尝试过克隆子模块但未能成功,或者手动创建了'darknet'子目录导致的。可以尝试以下步骤来解决问题:
1. 在克隆的darknet_ros包中打开终端,删除'darknet'文件夹。
```
rm -rf /home/xtark/ros_ws/src/darknet_ros/darknet
```
2. 重新初始化子模块并更新。
```
cd /home/xtark/ros_ws/src/darknet_ros/
git submodule init
git submodule update
```
最终显示如下:
xtark@xtark-robot:~/ros_ws/src/darknet_ros$ git submodule update Cloning into '/home/xtark/ros_ws/src/darknet_ros/darknet'... Submodule path 'darknet': checked out 'd22bbf38bd012f13d2b50c8d98149cd4a9889b7a'
则命令git submodule update
已经成功地将'darknet'子模块克隆到了您的ROS工作空间中的'darknet_ros'目录下。
最后进入ros_ws的终端执行catkin_make完成编译即可。
不过此时编译时间比较久,因为ros_ws/src/darknet_ros/darknet_ros/yolo_network_config/weights文件下有没有weights权重文件
这个最好自己下载粘贴在文件夹中,否则编译会漫长到怀疑人生。。。。
到这里darknet_ros的编译就结束了。下面是把自己训练出来的模型搬移过去,修改相关参数了。
第一步:需要把训练出来的权重文件放在ros_ws/src/darknet_ros/darknet_ros/yolo_network_config/weights中,将cfg文件放在ros_ws/src/darknet_ros/darknet_ros/yolo_network_config/cfg文件夹中。
第二步:编写你自己的yaml文件,在ros_ws/src/darknet_ros/darknet_ros/config中创建一个新的yaml文件,格式可以参照原有的yolo.yaml,都差不多。把里面的权重和cfg文件换为自己的,把类别名称也换为自己的(注意:顺序得与训练时写在names文件中的顺序一致)
第三步:下载摄像头驱动
sudo apt-get install ros-melodic-usb-cam
然后发布摄像头话题roslaunch usb_cam usb_cam-test.launch
会成功显示一个界面显示摄像头前的东西。。。。
第四步:修改ros.yaml文件
打开darknet_ros/config/ros.yaml
修改 :
subscribers:
camera_reading:
topic: /camera/rgb/image_raw
queue_size: 1
改为:
subscribers:
camera_reading:
topic: /usb_cam/image_raw
queue_size: 1
第五步修改darknet_ros.launch 文件
文件详细如下:
<?xml version="1.0" encoding="utf-8"?>
<launch>
!-- Console launch prefix --> <arg name="launch_prefix" default=""/>
<!--<arg name="image" default="/camera/rgb/image_raw" />--> <arg name="image" default="/usb_cam/image_raw" /> <!-- Config and weights folder. -->
<arg name="yolo_weights_path" default="$(find darknet_ros)/yolo_network_config/weights"/> <arg name="yolo_config_path" default="$(find darknet_ros)/yolo_network_config/cfg"/>
<!-- ROS and network parameter files -->
<arg name="ros_param_file" default="$(find darknet_ros)/config/ros.yaml"/>
<arg name="network_param_file" default="$(find darknet_ros)/config/yolov3-tiny.yaml"/>
<!-- Load parameters -->
<rosparam command="load" ns="darknet_ros" file="$(arg ros_param_file)"/>
<rosparam command="load" ns="darknet_ros" file="$(arg network_param_file)"/>
<!-- Start darknet and ros wrapper -->
<node pkg="darknet_ros" type="darknet_ros" name="darknet_ros" output="screen" launch-prefix="$(arg launch_prefix)">
<param name="weights_path" value="$(arg yolo_weights_path)" />
<param name="config_path" value="$(arg yolo_config_path)" />
<remap from="camera/rgb/image_raw" to="$(arg image)" />
</node>
<!--<node name="republish" type="republish" pkg="image_transport" output="screen" args="compressed in:=/front_camera/image_raw raw out:=/camera/image_raw" /> -->
</launch>
黄色背景是修改的部分,红色字体是自己新建的yaml文件
执行该文件发现一直显示等待图像显示,怀疑无法正确连接摄像头,但是之前执行roslaunch usb_cam usb_cam-test.launch时,成功调用了摄像头。由此我在决定darknet_ros。launch文件中创建一个usb_cam节点,如下
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen">
</node>
大致是这样的,黄色背景是后面修改的部分,省略号表示内容与上文一致。
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen">
...
<!-- Start darknet and ros wrapper -->
<node pkg="darknet_ros" type="darknet_ros" name="darknet_ros" output="screen" launch-prefix="$(arg launch_prefix)">
<param name="weights_path" value="$(arg yolo_weights_path)" />
<param name="config_path" value="$(arg yolo_config_path)" />
<remap from="/usb_cam/image_raw" to="$(arg image)" />
</node>
<!--<node name="republish" type="republish" pkg="image_transport" output="screen" args="compressed in:=/front_camera/image_raw raw out:=/camera/image_raw" /> -->
</launch>
后边再执行roslaunch darknet_ros darknet_ros.launch 就成功啦
显示如下:
23年7月5日补充:本文中darknet_ros自动将输入的视频格式相互转换,实验中发现当输入视频格式为BRG时,它会自己转换为RGB格式的视频;反之,输入视频格式为RGB时,它会自己转换为BRG格式的视频,然后视频中原本红色就会变成蓝色。