python机器人编程——差速AGV机器、基于视觉和预测控制的循迹、自动行驶(下篇)

目录

  • 一、前言
  • 二、基于轨迹与路面重心偏离度误差的预测自动差速小车循迹控制策略
  • 三、轨迹图像的处理要点
  • 四、本篇部分核心控制策略python代码:
  • 五、结论

一、前言

基于最近的测试,得到了一种粗略控制的算法,其控制效果适合单线路和急转弯的情况,本人认为可以稍微进行改进适用于十字路口等复杂轨迹的单目视觉循迹运行,本篇是对python机器人编程——差速机器人小车的控制,控制模型、轨迹跟踪,轨迹规划、自动泊车(中)未完成部分给补充,也提供了一种比较可靠和新的思路——我们把它暂且命名为《基于轨迹与路面重心偏离度误差的预测自动差速小车循迹控制》。
在这里插入图片描述
如上图所示,该算法可以在速度360m/h的情况下,比较粗略的自动转过一个大于90度的急转弯。虽然线不是非常贴切,但是我们认为这个方法实际比较可行。下面详细对该方法做个说明:

二、基于轨迹与路面重心偏离度误差的预测自动差速小车循迹控制策略

该方法中差速小车的控制还是用前面提到的预测控制方法,程序是一个以步长为dt的不断根据接受到的图像进行小车正反方向进行未来时刻轨迹预测的过程,并在边界条件下搜索出误差最靠近图像采集轨迹的小车左右轮子对应的速度即为当前步序的最优小车速度设定值。具体的算法流程伪代码如下:

  1. while True:
  2. 	记录预测间隔累计时间con_Hz=con_Hz+1
    
  3. 	读取摄像头图像,并进行处理(具体方法见第三节)获得路径的重心图像坐标cu、cv
    
  4. 	 if 当时间间隔到达预测控制的步长时con_Hz=300毫秒:
    
  5. 			con_Hz=0
    
  6. 			进入预测控制模块best_move(处理过的轨迹,当前的速度状态clv,重心坐标):			
    
  7. 					定义最佳速度设定值bestv=clv
    
  8. 					定义预测的微增速度dv=0.001
    
  9. 					定义预测的边界范围vmax=10
    
  10.    				for i in vmax:#速度增加的方向预测vmax个dv
    
  11.    						左轮的速度sl_n=当前速度+i*dv
    
  12.    						根据恒定速度计算右轮速度
    
  13.    						计算当前速度下未来2.5秒后(可以调整)的轨迹线存在pv、pu的list中
    
  14.    						将当前预测轨迹按照摄像头内参转化到图像坐标
    
  15.    						计算预测轨迹的重心图像坐标(cpu、cpv)
    
  16.    						计算重心距离dei=sqrt((cpu-cu)**2+(cpv-cv)**2)
    
  17.    						if dei<de:
    
  18.    								更新误差de=dei
    
  19.    								更新bestv=sl_n
    
  20.    				for i in vmax:#速度减小的方向预测vmax个dv
    
  21.    						左轮的速度sl_n=当前速度-i*dv
    
  22.    						根据恒定速度计算右轮速度
    
  23.    						计算当前速度下未来2.5秒后(可以调整)的轨迹线存在pv、pu的list中
    
  24.    						将当前预测轨迹按照摄像头内参转化到图像坐标
    
  25.    						计算预测轨迹的重心图像坐标(cpu、cpv)
    
  26.    						计算重心距离dei=sqrt((cpu-cu)**2+(cpv-cv)**2)
    
  27.    						if dei<de:
    
  28.    								更新误差de=dei
    
  29.    								更新bestv=sl_n
    
  30.    			reurn  bestv#返回最优控制速度设定值
    
  31.    	将当前最优控制速度值下发至小车
    
  32.    	进入下一个循环。
    

以上是主要的算法描述。
在这里插入图片描述
根据这个算法,在仿真环境下,跑了很久,也没有大的偏离出轨道。如上图所示,中间的黑色图中:黄色为处理过的路径,蓝色的点为路径的重心点位置,红色的线在当前边界下最佳速度设定值时的预测未来行驶轨迹,当前轨迹是最靠近蓝色重心的,小车始终在这样的策略下运行。

三、轨迹图像的处理要点

对于获取的轨迹图像处理,主要流程如下:

  1. 获取摄像头当前的图像img
  2. 根据颜色选择算法留下黄色轨迹部分信息图像bimg
  3. 将bimg图像进行二值化,留下轨迹的像素为1,得到图binary
  4. 去除binary中小车部分的像素(图像的小下半部分)得到一个新的binary
  5. 计算当前轨迹的重心点cu、cv,供输入预测控制模块
    图像的重心计算代码示例如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt

# Load the binary image
img = cv2.imread('binary_image.png', 0)

# Calculate the moments of the image
M = cv2.moments(img)

# Calculate the centroid
cx = int(M['m10'] / M['m00'])
cy = int(M['m01'] / M['m00'])

# Print the centroid coordinates
print(f'Centroid: ({cx}, {cy})')

# Draw a circle at the centroid
img_with_centroid = cv2.circle(img.copy(), (cx, cy), 5, (255, 0, 0), -1)

# Display the image with the centroid
plt.imshow(img_with_centroid, cmap='gray')
plt.show()

四、本篇部分核心控制策略python代码:

def best_move(sl,Pathimg,vc=0.1,dt=0.5,barycenter=(256,256)):
    #控制增量
    dvl=0.001
    #要预测的控制量     
    sl_n=sl

    #最优的控制量
    best_sl=sl
    mod="G"
    #方差
    de=500
    dei=e+100
    Gbest_sl=sl
    
    for i in range(10):#逐次减小控制量
        sl_n=sl_n-i*dvl
        #待入预测函数获取预测序列        
        xx,yy,tt=predicate(0,0,math.pi/2,sl_n,step=5,dt=dt,vc=vc,dspeed=True)
        #中心轨迹转化为车头轨迹        
        pv=[]
        pu=[]

        #将小车坐标转化到图像坐标
        for i in range(len(xx)):
            puv1=realxy2uv(xx[i],yy[i],Pathimg,xymax=0.5,zero="self_define",dzero=(256,286))
            pu.append(puv1[0])
            pv.append(puv1[1])

        cpu=np.average(pu)
        cpv=np.average(pv) 
        dei= np.sqrt((barycenter[0]-cpu)**2+(barycenter[1]-cpv)**2)   
        if dei<de:
            de=dei
            Gbest_sl=sl_n   

    sl_n=sl  
    for i in range(10):#逐次增大控制量
        sl_n=sl_n+i*dvl
        xx,yy,tt=predicate(0,0,math.pi/2,sl_n,step=5,dt=dt,vc=vc,dspeed=True)    

        #将小车坐标转化到图像坐标
        pv=[]
        pu=[]
        for i in range(len(xx)):
            puv1=realxy2uv(xx[i],yy[i],Pathimg,xymax=0.5,zero="self_define",dzero=(256,286))
            pu.append(puv1[0])
            pv.append(puv1[1])

        cpu=np.average(pu)
        cpv=np.average(pv)     
        
        dei= np.sqrt((barycenter[0]-cpu)**2+(barycenter[1]-cpv)**2)

        if dei<de:
            de=dei
            Gbest_sl=sl_n   
            print("Gbest_sll:",best_sl)
    #返回最优控制量

    if mod=="G":
        return Gbest_sl
    else:
        return best_sl,np

五、结论

后续还有对复杂轨迹的处理需要改进。如需要本篇的仿真环境和源代码,可以加入公众号或者私信留言。
在这里插入图片描述

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

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

相关文章

我们该如何提升测试效率?

在大部分研发项目经理心中&#xff0c;进度往往会放在第一位&#xff0c;其次是成本&#xff0c;最后是质量&#xff0c;当然人员队伍最好也要稳定。天下武功&#xff0c;唯快不破&#xff1a;进度 > 成本 > 质量 > 人。 这个说法并不是绝对&#xff0c;今天我们并不是…

高频前端React面试题汇总

近期整理了一下高频的前端面试题&#xff0c;分享给大家一起来学习。如有问题&#xff0c;欢迎指正&#xff01; 一、组件基础 1. React 事件机制 <div onClick{this.handleClick.bind(this)}>点我</div>React并不是将click事件绑定到了div的真实DOM上&#xff0…

DDOS攻击防御实战(威胁情报)

背景&#xff1a; 不知道大家最近有没有关注到&#xff0c;百度云CDN不支持免费了&#xff0c;网站安全问题越来越严重了…… 常见攻击 DDOS Distributed Denial of Service 分布式拒绝服务攻击可以使很多的计算机在同一时间遭受到攻击&#xff0c;使攻击的目标无法正常使用&…

css基础知识六:谈谈你对BFC的理解?

一、是什么 我们在页面布局的时候&#xff0c;经常出现以下情况&#xff1a; 这个元素高度怎么没了&#xff1f;这两栏布局怎么没法自适应&#xff1f;这两个元素的间距怎么有点奇怪的样子&#xff1f; 归根究底是元素之间相互的影响&#xff0c;导致了意料之外的情况&#…

C++完成淄博烧烤节管理系统

背景&#xff1a; 这次我们结合今年淄博烧烤做一个餐厅管理系统&#xff0c;具体需求如下&#xff0c;我们选择的是餐饮商家信息管理 问题描述&#xff1a; 淄博烧烤今年大火&#xff0c;“进淄赶烤”是大家最想干的事情&#xff0c;淄博烧烤大火特火的原因&#xff0c;火的…

X86架构与Arm架构区别

X86架构和ARM架构是主流的两种CPU架构&#xff0c;X86架构的CPU是PC服务器行业的老大&#xff0c;ARM架构的CPU则是移动端的老大。X86架构和arm架构实际上就是CISC与RISC之间的区别&#xff0c;很多用户不理解它们两个之间到底有哪些区别&#xff0c;实际就是它们的领域不太相同…

【前端 - CSS】第 15 课 - 复合选择器

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、复合选择器 2.1、后代选择器 2.2、子代选择器 2.3、并集选择器 2.4、交集选择器&#xff08;了解&#xff09…

【华为自研】| 国产数据库 GaussDB崛起

目录 GaussDBGaussDB 简介产品优势GaussDB(for openGauss)GaussDB(for MySQL)GaussDB(for Cassandra)GaussDB(for Mongo)GaussDB(for Redis)GaussDB(for Influx) GaussDB GaussDB采用一体化架构&#xff0c;同时支持关系型和非关系型数据库引擎&#xff0c;能够满足政企全方位…

【前端布局篇】响应式布局 Bootstrap 移动端布局

前言 1. 布局介绍 布局:layout 对事物的全面规划和安排 页面布局&#xff1a;对页面的文字、图形或表格进行格式设置。包括字体、字号、颜色纸张大小和方向以及页边距等。 网页布局&#xff1a;利用html搭建结构与内容&#xff0c;使用CSS添加装饰 网页布局有很多种方式&a…

Binder对象的流转(系统服务的调用过程、AIDL的使用过程)

零、Binder的传递 Android系统中&#xff0c;存在大量的 IPC 交互&#xff0c;同时也使用了大量的 Binder&#xff0c;那么Binder是怎么在各进程中进行对象的传递&#xff1f; 一、调用系统服务时&#xff0c;Binder的传递 回忆一下&#xff0c;Android系统的启动流程&#x…

数据结构--》从数据结构开始,打好算法基础

目录 数据结构的基本概念 数据结构的三要素 算法的基本概念 数据结构的基本概念 在学习某个知识之前&#xff0c;我们是否都有问过自己我们到底在学习的目的是什么&#xff1f;学习数据结构也一样&#xff0c;我们学习数据结构主要是为了用程序把现实世界的问题信息化&#…

Fiddler之日常使用简介

目录 前言&#xff1a; Fiddler界面简介 一、Fiddler抓取http、https请求配置 二、抓取指定域名会话 三、http请求统计试图 前言&#xff1a; Fiddler是一款功能强大的Web调试工具&#xff0c;它可以帮助开发人员在开发和测试过程中捕获、修改和检查HTTP请求和响应。 使用Fiddl…

leetcode111. 二叉树的最小深度(java)

二叉树的最小深度 leetcode111. 二叉树的最小深度题目描述 DFS 深度优先遍历解题思路代码演示 BFS 广度优先遍历解题思路代码演示 往期经典 leetcode111. 二叉树的最小深度 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problem…

leetcode46. 全排列(回溯算法-java)

全排列 leetcode46. 全排列题目描述解题思路代码演示 回溯算法专题 leetcode46. 全排列 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/permutations 题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有…

pandas---文件读取与存储(csv、hdf、json、excel、sql)

数据大部分存在于文件当中&#xff0c;所以pandas会支持复杂的IO操作&#xff0c;pandas的API支持众多的文件格 式&#xff0c;如CSV、SQL、EXCEL、JSON、 HDF5。 1. csv文件 pandas.read_csv(filepath_or_buffer, sep ,, usecols ) filepath_or_buffer:文件路径 sep :…

组合式API - provide和inject、Vue3小案例【Vue3】

组合式API - provide和inject 作用和场景&#xff1a;顶层组件向任意的底层组件传递数据和方法&#xff0c;实现跨层组件通信 跨层传递普通数据 顶层组件通过provide函数提供数据 provide(key, 顶层组件中的数据)底层组件通过inject函数获取数据 const message inject(key) …

Windows 禁止 IE 自动跳转 Edge「整合方案」

前言 IE 已经合并进 Edge 浏览器&#xff0c;IE「正式入土」 RESPECT ​ 昨晚&#xff0c;公司系统更新&#xff08;Edge&#xff09;结束后&#xff0c;原本正常运行的 RPA 全部下线&#xff0c;原因如图&#xff1a; ​ 早上起来&#xff0c;又是充满希望的一天&#xff0c;于…

走进人工智能|机器学习 解码未来的科技革命

前言: 机器学习的发展为我们提供了更智能、高效和便捷的科技产品和服务&#xff0c;可以改善我们的生活和工作方式。 文章目录 序言背景解码未来的科技革命技术支持应用领域程序员如何学总结 序言 机器学习是一种人工智能领域的技术&#xff0c;它让计算机通过数据自动地学习和…

微服务SpringCloudday1 认识微服务与服务注册(Eureka与nacos)

SpringCloud01 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#xff…

基于立创EDA的原理图设计

目录 学习目标 一、开发中原理图的作用 1.1 原理图 1.2 产品开发原理图设计阶段 1.3 原理图中的具体工作内容 二、 立创EDA软件使用基础 2.1 立创EDA电路设计软件 2.2 新建工程 2.3 设计元件原理图封装 三、项目实战&#xff08;单片机最小系统&#xff09; 学习目标…