Darknet+ros+realsenseD435i+yolo(ubuntu20.04)

一、下载Darknet_ros

mkidr -p yolo_ws/src
cd yolo_ws/src
git clone --recursive https://github.com/leggedrobotics/darknet_ros.git
#因为这样克隆的darknet文件夹是空的,将darknet_ros中的darknet的文件替换成如下
cd darknet_ros
git clone https://github.com/arnoldfychen/darknet.git
#进入darknet目录下进行make
cd darknet
make

修改darknet文件夹下的Makefile文件

修改 darknet_ros/darknet_ros/CMakeLists.txt

将这算力改成自己电脑的算力

make可能会报如下错误:

一、

fatal error:cudnn_ros_infer.h:没有那个文件或目录

解决办法:

根据官方链接cuDNN Archive | NVIDIA Developer,选择与cuda版本相匹配的cudnn下载tar文件。在这里,我下载的是v8.9.6,可与cuda 12.x等版本适配。

解压cudnn-linux-x86_64-8.9.7.29_cuda11-archive.tar.xz后,进入该目录,将lib内的文件都复制到目录/usr/local/cuda-11.6/lib64/中,将include内的文件都复制到目录/usr/local/cuda-11.6/include/中

cd ./cudnn-linux-x86_64-8.9.6.50_cuda11-archive
sudo cp ./lib/* /usr/local/cuda-12.2/lib64/
sudo cp ./include/* /usr/local/cuda-12.2/include/

二、

 fatal error:opencv2/opencvhpp:没有那个文件或目录

解决办法:修改修改darknet文件夹下的Makefile文件

三、

 error: ‘IplImage’ does not name a type    12 | IplImage *image_to_ipl(image im)

home/darknet/src/imageopencv.cpp 修改如下:

#ifdef OPENCV#include "stdio.h"
#include "stdlib.h"
#include "opencv2/opencv.hpp"
#include "image.h"using namespace cv;extern "C" {/*IplImage *image_to_ipl(image im)
{int x,y,c;IplImage *disp = cvCreateImage(cvSize(im.w,im.h), IPL_DEPTH_8U, im.c);int step = disp->widthStep;for(y = 0; y < im.h; ++y){for(x = 0; x < im.w; ++x){for(c= 0; c < im.c; ++c){float val = im.data[c*im.h*im.w + y*im.w + x];disp->imageData[y*step + x*im.c + c] = (unsigned char)(val*255);}}}return disp;
}image ipl_to_image(IplImage* src)
{int h = src->height;int w = src->width;int c = src->nChannels;image im = make_image(w, h, c);unsigned char *data = (unsigned char *)src->imageData;int step = src->widthStep;int i, j, k;for(i = 0; i < h; ++i){for(k= 0; k < c; ++k){for(j = 0; j < w; ++j){im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.;}}}return im;
}*//*Mat image_to_mat(image im)
{image copy = copy_image(im);constrain_image(copy);if(im.c == 3) rgbgr_image(copy);IplImage *ipl = image_to_ipl(copy);Mat m = cvarrToMat(ipl, true);cvReleaseImage(&ipl);free_image(copy);return m;
}image mat_to_image(Mat m)
{IplImage ipl = m;image im = ipl_to_image(&ipl);rgbgr_image(im);return im;
}*/Mat image_to_mat(image im)
{image copy = copy_image(im);constrain_image(copy);if(im.c == 3) rgbgr_image(copy);Mat m(cv::Size(im.w,im.h), CV_8UC(im.c));int x,y,c;int step = m.step;for(y = 0; y < im.h; ++y){for(x = 0; x < im.w; ++x){for(c= 0; c < im.c; ++c){float val = im.data[c*im.h*im.w + y*im.w + x];m.data[y*step + x*im.c + c] = (unsigned char)(val*255);}}}free_image(copy);return m;// free_image(copy);
// return m;
//     IplImage *ipl = image_to_ipl(copy);
//     Mat m = cvarrToMat(ipl, true);
//     cvReleaseImage(&ipl);
//     free_image(copy);
//     return m;
}image mat_to_image(Mat m)
{int h = m.rows;int w = m.cols;int c = m.channels();image im = make_image(w, h, c);unsigned char *data = (unsigned char *)m.data;int step = m.step;int i, j, k;for(i = 0; i < h; ++i){for(k= 0; k < c; ++k){for(j = 0; j < w; ++j){im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.;}}}rgbgr_image(im);return im;// IplImage ipl = m;// image im = ipl_to_image(&ipl);// rgbgr_image(im);// return im;
}void *open_video_stream(const char *f, int c, int w, int h, int fps)
{VideoCapture *cap;if(f) cap = new VideoCapture(f);else cap = new VideoCapture(c);if(!cap->isOpened()) return 0;//if(w) cap->set(CV_CAP_PROP_FRAME_WIDTH, w);//if(h) cap->set(CV_CAP_PROP_FRAME_HEIGHT, w);//if(fps) cap->set(CV_CAP_PROP_FPS, w);if(w) cap->set(CAP_PROP_FRAME_WIDTH, w);if(h) cap->set(CAP_PROP_FRAME_HEIGHT, w);if(fps) cap->set(CAP_PROP_FPS, w);return (void *) cap;
}image get_image_from_stream(void *p)
{VideoCapture *cap = (VideoCapture *)p;Mat m;*cap >> m;if(m.empty()) return make_empty_image(0,0,0);return mat_to_image(m);
}image load_image_cv(char *filename, int channels)
{int flag = -1;if (channels == 0) flag = -1;else if (channels == 1) flag = 0;else if (channels == 3) flag = 1;else {fprintf(stderr, "OpenCV can't force load with %d channels\n", channels);}Mat m;m = imread(filename, flag);if(!m.data){fprintf(stderr, "Cannot load image \"%s\"\n", filename);char buff[256];sprintf(buff, "echo %s >> bad.list", filename);system(buff);return make_image(10,10,3);//exit(0);}image im = mat_to_image(m);return im;
}int show_image_cv(image im, const char* name, int ms)
{Mat m = image_to_mat(im);imshow(name, m);int c = waitKey(ms);if (c != -1) c = c%256;return c;
}void make_window(char *name, int w, int h, int fullscreen)
{namedWindow(name, WINDOW_NORMAL); if (fullscreen) {//setWindowProperty(name, CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);setWindowProperty(name, WND_PROP_FULLSCREEN, WINDOW_FULLSCREEN);} else {resizeWindow(name, w, h);if(strcmp(name, "Demo") == 0) moveWindow(name, 0, 0);}
}}#endif

将之前在darknet文件进行make出错的文件删除,再重新编译

sudo make clean
make

在工作空间中安装realsense_ros与机械臂启动包

cd yolo_ws
cd src
#安装realsense_ros
git clone https://github.com/IntelRealSense/realsense-ros.git
git clone https://github.com/UniversalRobots/Universal_Robots_ROS_Driver.git Universal_Robots_ROS_Driver
git clone -b calibration_devel https://github.com/fmauch/universal_robot.git fmauch_universal_robotcd ..
catkin_make -DCMAKE_BUILD_TYPE=Release

使用VScode 在工作空间的src目录下创建新的文件夹std_msg,并添加相关的依赖:rospy roscpp std_msgs

在std_msg文件中创建scripts文件夹,创建两个py文件

一个为yolo目标检测文件及机械臂运动程序

#!/usr/bin/env python
# -*- coding: utf-8 -*-import rospy
from darknet_ros_msgs.msg import BoundingBoxes, BoundingBox
from sensor_msgs.msg import Image, CameraInfo
from cv_bridge import CvBridge
import numpy as np
import tf2_ros
import tf2_geometry_msgs
from geometry_msgs.msg import Pointclass Readyolo:def __init__(self):rospy.init_node('grasping_node', anonymous=True)self.bridge = CvBridge()self.tf_buffer = tf2_ros.Buffer()self.tf_listener = tf2_ros.TransformListener(self.tf_buffer)self.rgb_image_sub = rospy.Subscriber('/camera/color/image_raw', Image, self.rgb_image_callback)self.depth_image_sub = rospy.Subscriber('/camera/depth/image_rect_raw', Image, self.depth_image_callback)self.camera_info_sub = rospy.Subscriber('/camera/depth/camera_info', CameraInfo, self.camera_info_callback)self.object_detection = rospy.Subscriber('/darknet_ros/bounding_boxes', BoundingBoxes, self.yolo)self.pub = rospy.Publisher('/object_camera_coordinates', Point, queue_size=10)self.depth_intrinsics = Noneself.rgb_image = Noneself.depth_image = Nonedef camera_info_callback(self, msg):self.depth_intrinsics = msgprint(self.depth_intrinsics.K[0])print(self.depth_intrinsics.K[4])print()def rgb_image_callback(self, msg):self.rgb_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding="passthrough")def depth_image_callback(self, msg):self.depth_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding="passthrough")self.process_yolo_results()def process_yolo_results(self):if self.depth_intrinsics is None or self.rgb_image is None or self.depth_image is None:returnfor box in self.bounding_boxes:if box.Class == "bottle":yolo_center_point_x = (box.xmin + box.xmax) / 2yolo_center_point_y = (box.ymin + box.ymax) / 2depth = self.depth_image[int(yolo_center_point_y)][int(yolo_center_point_x)]camera_point = self.convert_pixel_to_camera_coordinates(yolo_center_point_x, yolo_center_point_y, depth)print("OI:",yolo_center_point_x,yolo_center_point_y)point_msg = Point(x=camera_point[0], y=camera_point[1], z=camera_point[2])self.pub.publish(point_msg)# self.pub.publish(box)def convert_pixel_to_camera_coordinates(self, u, v, depth):if self.depth_intrinsics is None:return Nonefx = self.depth_intrinsics.K[0]fy = self.depth_intrinsics.K[4]cx = self.depth_intrinsics.K[2]cy = self.depth_intrinsics.K[5]camera_x = (u - cx) * depth / fx/1000camera_y = (v - cy) * depth / fy/1000camera_z = float(depth)/1000print("camera_link:",camera_x,camera_y,camera_z)return [camera_x, camera_y, camera_z]def yolo(self, msg):self.bounding_boxes = msg.bounding_boxesself.process_yolo_results()def main():readyolo = Readyolo()rospy.spin()if __name__ == '__main__':main()
#!/usr/bin/env python
# -*- coding: utf-8 -*-import rospy, sys
import moveit_commander
from geometry_msgs.msg import PoseStamped, Pose
import tf2_geometry_msgs
import tf2_ros
from geometry_msgs.msg import Pointclass MoveItIkDemo:def __init__(self):# 初始化move_group的APImoveit_commander.roscpp_initialize(sys.argv)# 初始化ROS节点rospy.init_node('moveit_it_demo')# 初始化需要使用move group控制的机械臂中的arm groupself.arm = moveit_commander.MoveGroupCommander('manipulator')# 获取终端link的名称,这个在setup assistant中设置过了end_effector_link = self.arm.get_end_effector_link()# 设置目标位置所使用的参考坐标系reference_frame = "base"self.arm.set_pose_reference_frame(reference_frame)# 当运动规划失败后,允许重新规划self.arm.allow_replanning(True)# 设置位置(单位: 米)和姿态(单位:弧度)的允许误差# self.arm.set_goal_position_tolerance(0.001)# self.arm.set_goal_orientation_tolerance(0.01)self.arm.set_goal_position_tolerance(0.001000)self.arm.set_goal_orientation_tolerance(0.01000)# 设置允许的最大速度和加速度self.arm.set_max_acceleration_scaling_factor(0.5)self.arm.set_max_velocity_scaling_factor(0.5)# 控制机械臂先回到初始位置# self.arm.set_named_target('home')# self.arm.go(wait=True)# rospy.sleep(1)# 设置机械臂工作空间中的目标位姿,位置使用x y z坐标描述# 姿态使用四元数描述,基于base_link坐标系# target_pose = PoseStamped()# # 参考坐标系,前面设置了# target_pose.header.frame_id = reference_frame# target_pose.header.stamp = rospy.Time.now()# # 末端位置# target_pose.pose.position.x = 0.359300# target_pose.pose.position.y = 0.163600# target_pose.pose.position.z = 0.278700# # 末端姿态,四元数# target_pose.pose.orientation.x = 0.433680# target_pose.pose.orientation.y = 0.651417# target_pose.pose.orientation.z = 0.508190# target_pose.pose.orientation.w = 0.359611# # 设置机械臂当前的状态作为运动初始状态# self.arm.set_start_state_to_current_state()# # 设置机械臂终端运动的目标位姿# self.arm.set_pose_target(target_pose)# # 规划运动路径,返回虚影的效果# plan_success,traj,planning_time,error_code = self.arm.plan()# # traj = self.arm.plan()# # 按照规划的运动路径控制机械臂运动# self.arm.execute(traj)# # 执行完休息一秒# rospy.sleep(1)# 新建一个接收方用来接受话题并处理self.pose_sub = rospy.Subscriber("/object_camera_coordinates", Point, self.callback) def transform_pose(self, input_pose, from_frame, to_frame):try:tf_buffer = tf2_ros.Buffer()listener = tf2_ros.TransformListener(tf_buffer)transform = tf_buffer.lookup_transform(to_frame, from_frame, rospy.Time(0), rospy.Duration(1.0))transformed_pose = tf2_geometry_msgs.do_transform_pose(input_pose, transform)return transformed_poseexcept(tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationoException) as ex:rospy.logerr("TF2 error:%s",str(ex))return Nonedef callback(self, p):global object_position, grasp_poseobject_position = ptemp_pose = PoseStamped()temp_pose.header.frame_id = "camera_link"temp_pose.pose.position = ptemp_pose.pose.orientation.w = 1.0transformed_pose = self.transform_pose(temp_pose, "camera_link", "base")if transformed_pose is not None:grasp_pose = transformed_poseself.arm.set_start_state_to_current_state()self.arm.set_pose_target(grasp_pose)plan_success,traj,planning_time,error_code = self.arm.plan()self.arm.execute(traj)rospy.sleep(1)def main():moveitikdemo = MoveItIkDemo()rospy.spin()if __name__ == '__main__':main()

修改py文件权限,并在CMakeLists.txt进行相对应的修改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/838377.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年湖北省安全员-B证证模拟考试题库及湖北省安全员-B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年湖北省安全员-B证证模拟考试题库及湖北省安全员-B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;湖北省安全员-B证证模拟考试题库是根据湖北省安全员-B证最新版教材&#xff0c;湖北省安全员-B证大…

错误: 找不到或无法加载主类问题(已解决)

今天在虚拟机中安装了idea2023.2的版本&#xff0c;运行代码时发现错误找不到主类&#xff01; 直接说结论&#xff1a; 我先clean了一下target&#xff0c;然后重新build&#xff0c;发现maven报错了&#xff0c;idea2023.2默认使用了内置的maven&#xff0c;然后我切换了一下…

Linux基础之僵尸进程与孤儿进程

目录 一、僵尸进程 1.1 什么是僵尸进程 1.2 为什么要有僵尸状态 1.3 观察我们的僵尸状态 1.4 关于僵尸进程的小Tip 二、孤儿进程 2.1 什么是孤儿进程 一、僵尸进程 1.1 什么是僵尸进程 在上一篇文章中&#xff0c;我们有提到过进程的死亡状态的概念&#xff0c;而我们的…

Transformer 模型

文章目录 前言一、模型结构 前言 Transformer 模型是由谷歌在 2017 年提出并首先应用于机器翻译的神经网络模型结构。机器翻译的目标是从源语言&#xff08;Source Language&#xff09;转换到目标语言&#xff08;Target Language&#xff09;。Transformer 结构完全通过注意力…

IDC:2023年中国IT安全软件市场同比增长4.7%

IDC最新发布的《中国IT安全软件市场跟踪报告&#xff0c;2023H2》显示&#xff0c;2023年下半年中国IT安全软件市场厂商整体收入约为169.8亿人民币&#xff08;约合23.5亿元美元&#xff09;&#xff0c;同比上升2.7%。结合全年数据&#xff0c;2023全年中国IT安全软件市场规模…

Linux命令使用

一、ls tree clear 1.1 ls ls&#xff1a;查看当前目录下的文件名ls 目录名&#xff1a;查看指定目录下的文件名ls /&#xff1a;查看根目录下的文件名ls -a&#xff1a;查看当前目录下的所有文件名&#xff0c;包括隐藏文件ls -l&#xff1a;查看当前目录下文件的详细信息…

Java中的数组、Set、List、Map类型的互相转换总结

序言 数组、Set、List、Map是Java语言非常常用的几种数据类型&#xff0c;他们之间存在着千丝万缕的联系。关于底层的数据结构我这里就不再多说啦&#xff0c;直接从应用出发&#xff0c;总结他们之间的转换方法&#xff0c;并给出推荐方法。 大家可以点赞收藏等到需要的时候…

【JAVA】嵌入式软件工程师-2025校招必备-详细整理

一、Java 基础 1.JDK 和 JRE 有什么区别&#xff1f; jdk&#xff1a;java development kit jre&#xff1a;java runtime Environment jdk是面向开发人员的&#xff0c;是开发工具包&#xff0c;包括开发人员需要用到的一些类。 jre是java运行时环境&#xff0c;包括java虚拟机…

SVDD(Singing Voice Deepfake Detection,歌声深度伪造检测)挑战2024

随着AI生成的歌声快速进步&#xff0c;现在能够逼真地模仿自然人类的歌声并与乐谱无缝对接&#xff0c;这引起了艺术家和音乐产业的高度关注。歌声与说话声不同&#xff0c;由于其音乐性质和强烈的背景音乐存在&#xff0c;检测伪造的歌声成为了一个特殊的领域。 SVDD挑战是首个…

电脑常用的PDF阅读器-嗨动PDF编辑器!带你详细了解它

电脑常用的PDF阅读器-嗨动PDF编辑器&#xff01;在数字化信息爆炸的时代&#xff0c;PDF格式的文件因其易于打印和保留原始格式等优点&#xff0c;成为了人们日常工作和学习的常用格式。而对于PDF文件的处理&#xff0c;一款功能强大、操作简便的PDF阅读器是必不可少的。今天&a…

SprintBoot案例-增删改查

黑马程序员JavaWeb开发教程 文章目录 一、准备工作1. 准备数据库表1.1 新建数据库mytlias1.2 新建部门表dept1.3 新建员工表emp 2. 准备一个Springboot工程2.1 新建一个项目 3. 配置文件application.properties中引入mybatis的配置信息&#xff0c;准备对应的实体类3.1 引入myb…

weblogic 任意文件上传 CVE-2018-2894

一、漏洞简介 在 Weblogic Web Service Test Page 中存在一处任意文件上传漏洞&#xff0c; Web Service Test Page 在"生产模式"下默认不开启&#xff0c;所以该漏洞有一定限制。利用该 漏洞&#xff0c;可以上传任意 jsp 文件&#xff0c;进而获取服务器权限。 二…

[链表专题]力扣141, 142

1. 力扣141 : 环形链表 题 : 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾…

数据结构------二叉树经典习题1

博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1判断相同的树 OJ链接 这道题相对简单,运用我们常规的递归写法就能轻松写出 所以我们解题思路应该这样想: 1.如果p为空&#xff0c;q为空&#xff0c;那么就是两颗空树肯定相等 2.如果一个树为空另一棵树不为空那么…

2024年,诺基亚手机发售仅一天就售罄

在智能手机越来越同质化的今天&#xff0c;各家都只卷性能和相机&#xff0c;大火的 AI 对于咱来说好像实用性又不太大&#xff0c;机圈属实整的有点儿无聊。 不过在阿红这两天上网冲浪的时候&#xff0c;一个陌生又熟悉的名字闯入了我的视线&#xff0c;——诺基亚&#xff08…

维护表空间中的数据文件

目录 向表空间中添加数据文件 从表空间中删除数据文件 删除users表空间中的users02.dbf数据文件 对数据文件的自动扩展设置 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 维护表空间中的数据文件主要包括向表空间中添…

8个迹象表明你需要一台新笔记本电脑,看一下你的笔记本是否有其中一个

序言 当你第一次打开你的笔记本电脑的盒子时,它会以最高性能运行,电池寿命更长,过热最小,资源使用效率高。然而,随着笔记本电脑的老化,它将不能满足预期用途。以下几个迹象表明,可能是时候寻找并投资一款新设备了。 你的设备不再具有预期用途 如果你的笔记本电脑不再…

“图生视频”技术创新:剪贴画秒变动画生成的实验验证与分析

在最近的研究进展中&#xff0c;AniClipart系统的问世标志着文本到视频生成技术的一个重要里程碑。这一系统由香港城市大学和莫纳什大学的研究者们共同开发&#xff0c;旨在解决将静态剪贴画图像根据文本提示自动转换成动画序列的挑战。传统的动画制作流程繁琐且耗时&#xff0…

2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办

2024中国(重庆)商旅文化川渝美食暨消费品博览会8月举办 邀请函 主办单位&#xff1a; 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 展会背景&#xff1a; 2024中国航空科普大会暨第八届全国青少年无人机大赛在重庆举办&#xff…

用友GRP-U8 bx_dj_check.jsp SQL注入漏洞复现(XVE-2024-10537)

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…