智能小车-轮趣wheeltec(原版代码)

上一届大佬的 红绿灯识别代码,此代码需要在ubuntu系统下,与ROS配合使用:

Xtrak 塔克小车巡线代码以及红绿灯识别相关小改动_search_top=0 mask-CSDN博客

line.follow原版 源代码:
 

#------------------------------------------------------------------------------------------
#!/usr/bin/env python
# coding=utf-8#######################################################################
# 巡线   源代码
#######################################################################import rospy
from sensor_msgs.msg import Image #表示图像数据
import cv2, cv_bridge #在ROS图像消息和OpenCV图像之间的桥接库
import numpy
from geometry_msgs.msg import Twist #消息类型,表示线性速度和角速度,控制机器人移动#颜色跟踪 或 机器人控制算法中的误差计算或状态更新
last_erro=0#空函数,用作cv2.createTrackbar的回调函数。
#在OpenCV的滑动条(trackbar)上移动滑块时,函数会被调用。实际它不会被调用
def nothing(s):pass#定义不同颜色在HSV色彩空间中的范围,每个颜色由六个值定义;可考虑多定义几个颜色 或者放宽颜色范围,以识别更多种类的颜色
col_black = (0,0,0,180,255,46)# black
col_red = (0,100,80,10,255,255)# red
col_blue = (90,90,90,110,255,255)# blue
col_green= (65,70,70,85,255,255)# green
col_yellow = (26,43,46,34,255,255)# yellow# 创建OpenCV窗口和滑动条
#创建一个名为'Adjust_hsv'的OpenCV窗口,并且设置窗口的大小可以自由调整(cv2.WINDOW_NORMAL)
cv2.namedWindow('Adjust_hsv',cv2.WINDOW_NORMAL)#定义字符串,表示不同颜色选项,每个选项对应一个索引
Switch = '0:Red\n1:Green\n2:Blue\n3:Yellow\n4:Black'#在'Adjust_hsv'窗口中创建一个滑动条。滑动条名称:Switch,窗口名称:'Adjust_hsv'
# 滑动条的初始值是0,最大值是4 ,回调函数是nothing。
cv2.createTrackbar(Switch,'Adjust_hsv',0,4,nothing)#处理从摄像头获取的图像,根据图像中的颜色信息来发布机器人的移动指令
class Follower:def __init__(self):#初始化一个CvBridge对象,用于在ROS图像消息和OpenCV图像之间进行转换self.bridge = cv_bridge.CvBridge()#cv2.namedWindow("window", 1)# 订阅usb摄像头图像 该话题发布的是摄像头捕获的图像数据self.image_sub = rospy.Subscriber("/usb_cam/image_raw", Image, self.image_callback)# self.image_sub = rospy.Subscriber("cv_bridge_image", Image, self.image_callback)# 订阅深度相机# self.image_sub = rospy.Subscriber("/camera/rgb/image_raw", Image, self.image_callback)# self.image_sub = rospy.Subscriber("/camera/depth/image_raw", Image,self.image_callback)#发布机器人的移动指令。发布的话题cmd_vel_ori,消息类型:Twist,队列大小为1。self.cmd_vel_pub = rospy.Publisher("cmd_vel_ori", Twist, queue_size=1)#初始化Twist消息对象,用于存储机器人的线性和角速度指令self.twist = Twist()def image_callback(self, msg):global last_erro #全局变量#转换图像格式 使用CvBridge对象将ROS图像消息转换为OpenCV图像格式。image = self.bridge.imgmsg_to_cv2(msg, desired_encoding='bgr8')#调整图像大小 为提高帧率(图像处理速度) 插值image = cv2.resize(image, (320,240), interpolation=cv2.INTER_AREA)# hsv将RGB图像分解成色调H,饱和度S,明度V,易基于颜色范围进行图像分割。hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 颜色的范围  # 第二个参数:lower指的是图像中低于这个lower的值,图像值变为0# 第三个参数:upper指的是图像中高于这个upper的值,图像值变为0# 而在lower~upper之间的值变成255kernel = numpy.ones((5,5),numpy.uint8)#对HSV图像进行腐蚀和膨胀操作,以消除噪声和强调颜色边界hsv_erode = cv2.erode(hsv,kernel,iterations=1)hsv_dilate = cv2.dilate(hsv_erode,kernel,iterations=1)#读取滑动条位置,从名为Adjust_hsv的窗口中获取名为Switch的滑动条的位置。m=cv2.getTrackbarPos(Switch,'Adjust_hsv')#根据滑动条的位置m,从预定义的颜色范围中选择相应的HSV值范围if m == 0:lowerbH=col_red[0]lowerbS=col_red[1]lowerbV=col_red[2]upperbH=col_red[3]upperbS=col_red[4]upperbV=col_red[5]elif m == 1:lowerbH=col_green[0]lowerbS=col_green[1]lowerbV=col_green[2]upperbH=col_green[3]upperbS=col_green[4]upperbV=col_green[5]elif m == 2:lowerbH=col_blue[0]lowerbS=col_blue[1]lowerbV=col_blue[2]upperbH=col_blue[3]upperbS=col_blue[4]upperbV=col_blue[5]elif m == 3:lowerbH=col_yellow[0]lowerbS=col_yellow[1]lowerbV=col_yellow[2]upperbH=col_yellow[3]upperbS=col_yellow[4]upperbV=col_yellow[5]elif m == 4:lowerbH=col_black[0]lowerbS=col_black[1]lowerbV=col_black[2]upperbH=col_black[3]upperbS=col_black[4]upperbV=col_black[5]else:lowerbH=0lowerbS=0lowerbV=0upperbH=255upperbS=255upperbV=255#处理从摄像头获取的图像,并通过颜色范围来检测特目标物体# 计算该对象在图像中的位置,并根据位置信息控制机器人的移动#创建掩码图像:目标颜色范围内的像素值为255(白色),其他像素值为0(黑色)mask=cv2.inRange(hsv_dilate,(lowerbH,lowerbS,lowerbV),(upperbH,upperbS,upperbV))#应用掩码到原始图像masked = cv2.bitwise_and(image, image, mask=mask)#绘制指示并计算重心#在图像某处绘制一个指示,因为只考虑20行宽的图像,所以使用numpy切片将以外的空间区域清空h, w, d = image.shapesearch_top = h - 150# 原search_top = h-20search_bot = h#??????mask[0:search_top, 0:w] = 0mask[search_bot:h, 0:w] = 0# 计使用cv2.moments函数计算mask图像的重心(cx,cy),即几何中心M = cv2.moments(mask)#在图像上绘制一个以重心为圆心的红色圆圈,用于可视化重心的位置if M['m00'] > 0:cx = int(M['m10']/M['m00'])cy = int(M['m01']/M['m00'])cv2.circle(image, (cx, cy), 10, (255, 0, 255), -1)#cv2.circle(image, (cx-75, cy), 10, (0, 0, 255), -1)#cv2.circle(image, (w/2, h), 10, (0, 255, 255), -1)#计算偏移量和发布移动指令#????????if cv2.circle:# 计算图像中心线和目标指示线中心的距离#15可以调整erro = cx - w/2-15 #计算重心cx和图像中心线w/2的偏移量erro#根据偏移量erro和偏移量的变化d_erro来设置机器人的角速度self.twist.angular.zd_erro=erro-last_erro#设置机器人的线速度为0.18self.twist.linear.x = 0.18if erro!=0:#这里需要改self.twist.angular.z = -float(erro)*0.005-float(d_erro)*0.000else :self.twist.angular.z = 0last_erro=erroelse:self.twist.linear.x = 0self.twist.angular.z = 0# 发布移动指令self.cmd_vel_pub.publish(self.twist)#cv2.imshow("window", image)#cv2.imshow("window1", hsv)#cv2.imshow("window2", hsv_erode)#cv2.imshow("window3", hsv_dilate)#cv2.imshow("window4", mask)#显示图像#显示掩码图像maskcv2.imshow("Adjust_hsv", mask)#通过cv2.waitKey(3)函数暂停3毫秒,以便用户可以看到图像。cv2.waitKey(3)rospy.init_node("opencv")
follower = Follower()
rospy.spin()

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

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

相关文章

现代C++新特性——constexpr

在计算机科学中,字面量(literal)是在源代码中的 value 的文本表示。字面量和变量、常量是同一个级别的概念,常被用于初始化变量。字面量是编译期常量,效率极高。 常量表达式(const expression)是…

【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍 ​ 每当我们要对一条记录做改动时(这里的改动可以指 INSERT 、 DELETE 、 UPDATE ),都需要留一手 -> 把回滚时所需的东西都给记下来 ​ 你插入一条记录时,至少要把这条记录的主键值记下来,之后回滚的…

【后端】django查询时的性能优化技巧

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、为什么需要性能优化二、性能优化的常用技巧三、总结 前言 随着开发语言的不断普及,越来越多的项目建设场景会遇到性能瓶颈,本文就介…

自定义数据 微调CLIP (结合paper)

CLIP 是 Contrastive Language-Image Pre-training 的缩写,是一个擅长理解文本和图像之间关系的模型,下面是一个简单的介绍: 优点: CLIP 在零样本学习方面特别强大,它可以(用自然语言)给出图像…

【深度学习】行人跌倒行为检测软件系统

行人跌倒检测系统在各个领域的应用都对社会的整体健康、安全和福祉产生积极影响,为人们的生活和工作提供了更加安全和可靠的环境, 本文主要使用YOLOV8深度学习框架自训练了一个“行人跌倒检测模型”,基于此模型使用PYQT5实现了一款界面软件用…

Visual Studio2022中使用水晶报表

1.创建水晶报表项目 选择需要的表 自动生成连接 选项:可跳过 后续还有一些 都能跳过 看你自己的需求 自己选的样式

Linux中的高级IO函数(三)fcntl

Linux提供了很多高级的I/O函数。它们并不像Linux基础I/O函数(比如open和read)那么常用(编写内核模块时一般要实现这些I/O函数),但在特定的条件下却表现出优秀的性能。这些函数大致分为三类: 用于创建文件描…

39. 【Android教程】触摸事件分发

用户在使用 Andriod 系统的时候会不断的和我们的 App 进行各种类型的交互(类似点击、滑动等等),“事件”就是一个非常有效的用来收集用户行为的方式。在前面章节有提到过:Android 系统采用一个先进先出(FIFO&#xff0…

使用IPEX-LLM加速大语音模型LLM

IPEX-LLM是一个用于在英特尔CPU和GPU(如本地PC的iGPU、独立显卡如Arc、Flex和Max)上加速本地LLM推理和微调的PyTorch库。 IPEX-LLM是BigDL-LLM的升级版。IPEX-LLM基于英特尔PyTorch扩展库(IPEX)以及llama.cpp、bitsandbytes、vLL…

PostgreSQL 免费的对象-关系数据库

目录 一、什么是数据库 二、ORDBMS 的一些术语 三、PostgreSQL 概述 四、PostgreSQL数据库优点和缺点 4.1PostgreSQL数据库的优点 4.2PostgreSQL数据库的缺点 4.3PostgreSQL 特征 五、Linux 上安装 PostgreSQL 5.1Yum 安装 PostgreSQL 5.1.1安装postgreSQL的官方yum仓…

54、图论-实现Trie前缀树

思路: 主要是构建一个trie前缀树结构。如果构建呢?看题意,应该当前节点对象下有几个属性: 1、next节点数组 2、是否为结尾 3、当前值 代码如下: class Trie {class Node {boolean end;Node[] nexts;public Node(…

Jammy@Jetson Orin - Tensorflow Keras Get Started

JammyJetson Orin - Tensorflow & Keras Get Started 1. 源由2. 步骤3. 预期&展望4. 总结5. 参考资料 1. 源由 之前过年的时候,花了两周的时间过了一遍 《ubuntu22.04laptop OpenCV Get Started》。 后续更多的时间需要再GPU算法上下功夫,目前…

如何在PostgreSQL中使用索引覆盖扫描提高查询性能?

文章目录 解决方案1. 创建合适的索引2. 确保查询能够使用索引覆盖扫描3. 调整查询以利用索引覆盖扫描4. 监控和调优 示例代码1. 创建索引2. 编写查询3. 检查是否使用索引覆盖扫描4. 调整索引 总结 在PostgreSQL中,索引是提高查询性能的关键工具之一。索引允许数据库…

Mybatis-plus 分页 自定义count方法

起因 使用了mybatisplus语句中有order by 语法mybatisplus会使用 select count(*) from (子语句) TOTAL 算出total但是会报错 查询条件QueryWrapper中还有order by排序条件,则生成的select count(*) from(sql) 就会报错 除非另外还指定了 TOP、OFFSET 或 FOR XML,否…

文章生成器免费版有哪些,哪个好用?

作为一个长期需要写作的人,对文章生成器自然是非常了解,如果搜文章生成器互联网上多到让人应接不暇,但小编今天要谈的是文章生成器免费版,因为看到很多写手朋友都想找一个免费的文章生成器来用,但是大家在网上搜可能很…

GITHUB的VB代码无法加载的问题解决

GITHUB里有不少好的VB代码,但是下载之后,经常出现工程加载出错的问题,例如: LOG文件为: 不能加载 0 行 0: 不能加载文件 D:\xxxx\Semi VB API Loader\frmMain.frm 。 原因其实很简单,github里的换行符是u…

巧用Stream流解决Page分页连表查询一对多展示错误的问题

1. 简介 在数据库一对多的情况下,使用Page分页查询这种Vo的时候如果直接查询会导致每页展示的条数不一致。 简单的代码如下 用户类 public class User{private Integer id; }地址类 public class UserAddress {private Integer id;private String address;private…

Promise.all 的方法还没执行完就执行了.then

碰见一个问题,接盘了一个有问题的页面修改。 改变日期后 查询很多数据再去重新加载页面上的数据显示相关的组件。 问题就来了。 加载异常捏…… 最后我一通查: 重点来了 是因为这个Promise.all(数组),里边这个数组的问题。现在是在数据中…

【机器学习】分类与预测算法的评价与优化

以实际案例解析F1值与P-R曲线的应用 一、分类算法与性能评价的重要性二、F1值与P-R曲线的概念与意义三、实例解析:以垃圾邮件检测为例四、代码实现与结果分析五、结论与展望 在数据驱动的时代,机器学习算法以其强大的数据处理和分析能力,成为…

Java单例模式的五种实现方式 懒汉式 饿汉式 双重校验锁 静态变量 静态内部类 枚举实现单例模式等

1、什么是单例模式? Java单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问点以获取该实例。它通常用于需要共享资源或控制某些共享状态的情况下。 2、实现方式 懒汉式:在类加载的时候就创建对象,…