最近在arm平台上部署 darknet_ros,出现了一些错误,这里记录一下。
首先在ARM平台上部署和在AMD平台上部署是不同的,首先应该考虑算力问题,在ARM下,加载yolov3.weight后,会出现进行死掉的现象,跑不起来,这时候可以换一些小权重进行尝试,记录一下编译时候发生的错误。
首先下载darknet_ros,资源在网上有很多,但是下载后不是完整的,需要替换里面的darknet包,之后在进行编译时,出现
解决办法有两种
1、不使用catkin_make编译,使用命令进行编译
catkin build darknet_ros --cmake-args -DCMAKE_CXX_FLAGS=-DCV__ENABLE_C_API_CTORS
2、修改源码, 对应的修改参照下面的代码
IplImageWithHeader_ YoloObjectDetector::getIplImageWithHeader() {
//IplImage* ROS_img = new IplImage(camImageCopy_);
IplImage ROS_img = cvIplImage(camImageCopy_);
//IplImageWithHeader_ header = {.image = ROS_img, .header = imageHeader_};
IplImageWithHeader_ header = {.image = &ROS_img, .header = imageHeader_};
return header;
}
运行之后,通过RVIZ可以查看发布的图像话题,可是会出现乱码现象,如图所示:
解决办法:
1、将ros.yaml文件中的enable_opencv: true参数改为false,这样就进入了else语句中,将检测结果buff_传给了ipl_。这算是最简单粗暴的方案。这样虽然检测结果不会实时显示(因为没有进入displayInThread(0)线程),但是在rviz中查看/darknet_ros/detection_image话题时能够正常显示结果。
2、
在不修改ros.yaml文件的前提下,将前面提到的if...else语句修改如下:
if (viewImage_) {
generate_image(buff_[(buffIndex_ + 1)%3], ipl_);
displayInThread(0);
} else {
generate_image(buff_[(buffIndex_ + 1)%3], ipl_);
}即在if判断条件内添加一条generate_image语句,这样就能将检测结果buff_传给了ipl_,然后ipl_以/darknet_ros/detection_image话题的形式发布出去,就能在rviz中正常显示了。