智能小车-轮趣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之间的值变成255

        kernel = 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=0
            lowerbS=0
            lowerbV=0
            upperbH=255
            upperbS=255
            upperbV=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.shape

        search_top = h - 150
        # 原search_top = h-20

        search_bot = h

        #??????
        mask[0:search_top, 0:w] = 0
        mask[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.z
                d_erro=erro-last_erro

                #设置机器人的线速度为0.18
                self.twist.linear.x = 0.18


                if erro!=0:

                    #这里需要改
                    self.twist.angular.z = -float(erro)*0.005-float(d_erro)*0.000
                else :
                    self.twist.angular.z = 0
                last_erro=erro
        else:
            self.twist.linear.x = 0
            self.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)


        #显示图像
        #显示掩码图像mask
        cv2.imshow("Adjust_hsv", mask)
        #通过cv2.waitKey(3)函数暂停3毫秒,以便用户可以看到图像。
        cv2.waitKey(3)


rospy.init_node("opencv")
follower = Follower()
rospy.spin()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RBA认证是什么?RBA认证的流程是怎么样的

RBA认证,即“责任商业联盟”认证,英文全称是Responsible Business Alliance。这是一个为电子行业或以电子为主要组成部分的行业及其供应链制定的社会责任审核标准。该标准旨在确保工作环境的安全、工人受到尊重并富有尊严、商业营运合乎环保性质并遵守道…

DenseDiffusion:Dense Text-to-Image Generation with Attention Modulation

1 研究目的 该文献的研究目的主要是: 探讨一种更为广泛的调制方法,通过设计多个正则化项来优化图像合成过程中的空间控制。论文的大致思想是,在现有的基于数据驱动的图像合成系统基础上,通过引入更复杂的调制策略,实现…

2024.4.23

1.const 修饰 *p。 p所指向地址内的值不可变,p指向的地址可以改变 2.const 修饰 p。 p指向的地址不可变,p所指向的地址的值可变 3.const 修饰 p。 p指向的地址不可变,p所指向地址的值可变 4.const 修饰 *p 和p。p指向的地址和p所指向地址的…

[激光原理与应用-90]:光功率计基本原理

目录 一、光功率计原理 二、光功率计硬件电路 三、光功率计探头 四、接口信号 一、光功率计原理 光功率计是用来测量光功率的仪器,其原理基于光电效应和电信号的检测与处理。 下面是光功率计的基本原理: 光电效应: 光功率计使用光敏元件…

链表的分割

题目 现给定一链表的头指针 phead 以及值 x,需编写一段代码将所有小于 x 节点的排在其余节点之前,且不能改变原来的数据顺序,最后返回重新排列后的链表的头指针。 算法思想 将小于x的尾插在第一个链表 将大于等于x的尾插在第二个链表 最后…

1142 - SELECT command denied to user ···

MySql子账户操作数据库权限不够,提示错误 1142 - SELECT command denied to user database 1142 - ALTER command denied to user database 以下命令可以解决 GRANT SELEC your_database_name TO mysql_account%;

centos7上搭建mongodb数据库

1.添加MongoDB的YUM仓库: 打开终端,执行以下命令来添加MongoDB的YUM仓库: sudo vi /etc/yum.repos.d/mongodb-org-4.4.repo 在打开的文件中,输入以下内容: [mongodb-org-4.4] nameMongoDB Repository baseurlh…

【Mysql】用frm和ibd文件恢复mysql表数据

问题 总是遇到mysql服务意外断开之后导致mysql服务无法正常运行的情况,使用Navicat工具查看能够看到里面的库和表,但是无法获取数据记录,提示数据表不存在。 这里记录一下用frm文件和ibd文件手动恢复数据表的过程。 思路 1、frm文件&…

第一个Spring Boot程序

目录 一、Spring Boot介绍 二、创建Spring Boot项目 1、插件安装(专业版不需要) 2、创建SpringBoot项目 (1)这里如果插件下载失败,解决方案: (2)项目启动失败,解决…

Docker镜像与容器操作

一、Docker 镜像操作 1.1 搜索镜像 格式:docker search 关键字 docker search nginx 1.2 获取镜像nginx 格式:docker pull 仓库名称[:标签] 如果下载镜像时不指定标签,则默认会下载仓库中最新版本的镜像,即选择标签为 latest…

SwiftUI 5.0(iOS 17.0)触摸反馈“震荡波”与触发器模式趣谈

概览 要想创作出一款精彩绝伦的 App,绚丽的界面和灵动的动画并不是唯一吸引用户的要素。有时我们还希望让用户真切的感受到操作引发的触觉反馈,直击使用者的灵魂。 所幸的是新版 SwiftUI 原生提供了实现触觉震动反馈的机制。在介绍它之后我们还将进一步…

HBase的简单学习三

一 过滤器 1.1相关概念 1.过滤器可以根据列族、列、版本等更多的条件来对数据进行过滤, 基于 HBase 本身提供的三维有序(行键,列,版本有序),这些过滤器可以高效地完成查询过滤的任务,带有过滤…

Redis中的缓存击穿、缓存穿透、缓存雪崩问题

1.什么是缓存击穿? 客户端恶意访问一个不存在的数据,从而造成穿透缓存,请求直接到达数据库,频繁的发送这一类的请求,直接查询数据库,数据库的压力变大。 1.1如何解决缓存击穿呢? 1&#xff0…

基于harris角点和RANSAC算法的图像拼接matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ....................................................................... I1_harris fu…

【MySQL]】数据库操作指南之数据库的基础操作

🌱博客主页:青竹雾色间 🌱系列专栏:MySQL探险日记 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 ✨人生如寄,多忧何为 ✨ 文章目录 1. 创建数据库2.数据库的编码集与校验集2.1 编码集 (Character…

嵌入式Python基础1-2

嵌入式Python基础1-2 条件语句 if elif else 随机数random eval while循环 for循环 水仙花数 循环else list 列表常用方法 增删改查 加排序 append remove pop index() 升序sort()降序 sort(reverseTrue) 反转 reverse()…

ESP32开发

1、简介 1.1 种类 WIFI模块在PC上做为客户端、服务器,在STM32上做服务器的通讯。在物联网应用开发有重要作用,种类居多,如下图 红色方框的esp8266-01s型号的无限wifi模块就是本章学习的主要对象。 1.2 特点 小巧的尺寸:ESP-01…

SpanBert学习

SpanBERT: Improving Pre-training by Representing and Predicting Spans 核心点 提出了更好的 Span Mask 方案,也再次展示了随机遮盖连续一段字要比随机遮盖掉分散字好;通过加入 Span Boundary Objective (SBO) 训练目标,增强了 BERT 的性…

python自动生成SQL语句自动化

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python自动生成SQL语句自动化 在数据处理和管理中,SQL(Structured …

WAF防范原理

目录 一、什么是WAF 二、纵深安全防御 WAF的组网模式 WAF配置全景 WAF端 服务器 攻击端 拦截SQL注入,XSS攻击,木马文件上传 要求: 使用WAF,通过配置策略要求能防御常见的web漏洞攻击(要求至少能够防御SQL、XSS、文…