疫情让我使用V-rep仿真(结合pythonAPI)实现机器人视觉巡线+pid调速,

本文主要是介绍疫情让我使用V-rep仿真(结合pythonAPI)实现机器人视觉巡线+pid调速,,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

任务概要

1.背景介绍

1.1实现效果: 

2.V-REP仿真介绍

3.实现

     3.1选取机器人

3.2更改线形状操作

3.3视觉传感器

     3.3.1视觉传感器选择

     3.3.2视觉传感器介绍

 3.4PythonAPI调用

      3.4.1V-rep端通信配置

     3.4.2Python的配置

     3.4.3 函数库的导入

 3.5 Python程序编写

     3.5.1 仿真的步骤

 3.6视觉处理

      3.6.1算法解析

PID代码

算法不足分析

Reference



1.背景介绍

因为疫情原因,在家上网课。因为放假前完全没有想到会放如此长的‘假’,所以我把所有学习用的开发板、硬件、开发教程书籍都放在了学校实验室里,从而现在不但不能在家做实物,也不能去学校做实物的尴尬情形。随后因为一门课(计算机控制技术)改变了这种尴尬的情形。

      张老师推荐我们使用Vrep进行机器人仿真,并且实现pid控制,于是乎我马上利用空闲时间研究了这款软件,做了机器人视觉巡线+pid调速。

在实现视觉巡线之前我提交了多次作业,从简单的灰度巡线到视觉巡线。

作业提交图
作业提交图

1.1实现效果: 

疫情让我使用V-rep仿真实现机器人视觉巡线+pid调速


2.V-REP仿真介绍

V-REP 是机器人仿真器里的“瑞士军刀”:你不会发现一个比它拥有更多功能,特色或是更详尽应用编程接口的机器人仿真器:
• 跨平台 (Windows、MacOS、Linux)
• 六种编程方法 (嵌入式脚本、插件、附加组件、ROS节点、远程客户端应用编程接口、或自定义的解决方案)
• 七种编程语言 (C/C++、Python、Java、Lua、Matlab、Octave、和 Urbi)
• 超过400种不同的应用编程接口函数
• 100项ROS服务、30个发布类型、25个ROS订户类型、可拓展
• 4个物理引擎 (ODE, Bullet, Vortex, Newton)
• Integrated ray-tracer (POV-Ray)
• 完整的运动学解算器 (对于任何机构的逆运动学和正运动学)
• Mesh, octree, point cloud-网孔干扰检测
• Mesh, octree, point cloud-网孔最短距离计算
• 路径规划 (在2到6维中的完整约束、对于车式车辆的非完整约束)
• 嵌入图像处理的视觉传感器 (完全可拓展)
• 现实的接近传感器 (在检测区域中的最短距离计算)
• 嵌入式的定制用户接口、包括编辑器
• 完全集成的第四类Reflexxes运动库 + RRS-1 interface specifications
• 表面切削仿真
• 数据记录与可视化 (时距图、X/Y图或三维曲线)
• 整合图形编辑模式
• 支持水/气体喷射的动态颗粒仿真
• 带有拖放功能的模型浏览器 (在仿真中依旧可行)
• 多层 取消/重做、影像记录、油漆的仿真、详尽的文档等


 

接下来由我给大家一步步实现视觉检测和pid调速


 

3.实现

     3.1选取机器人

  • 我在这里为了方便选择的是V-rep仿真软件里自带的Khepera3机器人,如果大家想自己做一个机器人也是可以的。
k3
Khepera3
  • 这个机器人可以直接点击File/Open Scene找到C:\Program Files (x86)\V-REP3\V-REP_PRO_EDU\scenes路径下的Khepera3.ttt。

  •  也可以直接在现有的地图中从侧边的模型浏览器里找到robots/mobile下的Khepera3.

 我在下面会提供我的地图供大家下载使用。


 

3.2更改线形状操作

  1. 选好合适的角度,点击黑线,会显示蓝色的点:
  2. 按住Ctrl,并且点击蓝色的点,蓝色的点会变白
  3. 使用标签栏里的,对白点拖动,到这就完成了半
  4. 双击,弹出Scene Object Properties,并且选中
  5. 点击,弹出的框内容改成,随后确定就完成了改变线的形状。

 

3.3视觉传感器

     3.3.1视觉传感器选择

  1. 右键场景,找到Add/Vision Sensor/perspective Type添加即可。

     3.3.2视觉传感器介绍

  Vision sensors, which can detect renderable entities(Renderable objects are objects that can be seen or detected by vision sensors), should be used over proximity sensors mainly when color, light or structure plays a role in the detection process. However, depending on the graphic card the application is running on, or on the complexity of the scene objects, vision sensors might be a little bit slower than proximity sensors. Following illustrates applications using vision sensors:

[(1) industrial robot observed by 2 vision sensors, (2) Line tracer vehicle equipped with 3 vision sensors]

 

  视觉传感器与摄像机都能显示场景中的图像但是也存在着区别(一个侧重视觉检测和处理,一个侧重场景显示):

  • A vision sensor has a fixed resolution. A camera has no specific resolution (i.e. it adjusts automatically to the view size).
  • A vision sensor's image content can be accessed via the API, and image processing filters are available. A camera's image content is not directly available via the API (but via a callback mechanism), and image processing not directly supported.
  • A vision sensor generally requires more CPU time and operates slower than cameras.
  • A vision sensor can only display renderable objects. A camera can display all object types.(只有设置了Renderable属性的物体才能被视觉传感器检测处理)
  • Vision sensors can only operate while a simulation is running; this means that a vision sensor's image content is only visible during simulation.

  视觉传感器可分为正交投影型和透视投影型,它们的视场形状不一样:

[Orthogonal projection-type and perspective projection-type vision sensors]

 

   视觉传感器有近端剪切平面(near clipping plane)和远端剪切平面,使用剪切平面可以排除场景的一些几何体,只查看或渲染场景的某些部分。比近端剪切平面近或比远端剪切平面远的对象是不可视的。可以通过传感器属性对话框中的"Near / far clipping plane"设置剪切平面的位置。

  透视模式下传感器的视场角(FOV)可以通过"Perspective angle [deg] / Orthographic size"来设置。Perspective angle: the maximum opening angle of the detection volume when the sensor is in perspective mode. 如下图所示设置视场角为60°,当X/Y分辨率一样时水平视场角和垂直视场角的大小相同。

   正交模式下传感器的视场大小可以通过"Perspective angle [deg] / Orthographic size"来设置。Orthographic size: the maximum size (along x or y) of the detection volume when the sensor is not in perspective mode. 设置为Orthographic size为1m,X/Y方向分辨率为64/32,则X方向视场为1m,Y方向为0.5m,如下图所示:

  • Vision sensor filter composition

  使用视觉传感器的目的就是进行图像检测与处理,VREP中的视觉传感器在仿真过程中可以产生两种数据流:彩色图像(color image )和深度图(depth map)。我们可以通过API函数获取数据,然后遍历图像的每个像素进行处理,这样做灵活性很大,但是使用起来比较麻烦而且处理速度不够快。VREP提供了一种内部的filter来对图像进行处理(It is much more convenient (and fast!) to use the built-in filtering and triggering capabilities)。最简单的图像处理流程由3部分组成:输入→滤波→输出:

[Vision sensor filter with 3 components]

 

  在Image processing and triggering对话框中可以添加30多种filter对图像进行快速处理,比如:

  • Selective color on work image:根据RGB/HSL值和公差选取图中指定颜色,进行保留或移除等操作
  • Rotate work image:对图像进行旋转
  • Resize work image:对图像进行缩放
  • Flip work image horizontally/vertically:对图像进行水平/竖直翻转
  • Edge detection on work image:对图像进行边缘检测
  • Sharpen work image:图像锐化
  • Binary work image and trigger:对图像进行二值化处理
  • 3×3 / 5×5 filter on work image:使用3×3或5×5的模板对图像进行滤波

  下面以均值滤波为例进行说明,3×3矩阵中各个分量设为1/9,则滤波器将会对原始图像每个像素周围的9个像素点取平均,对图像进行平滑,减小噪声:

  复杂的图像处理流程可由多个部分组成,处理环节能完成4种基本的操作:

  • Transfer data from one buffer to another (e.g. transfer input image to work image)——传输数据
  • Perform operations on one or more buffers (e.g. invert work image) ——对数据进行操作
  • Activate a trigger (e.g. if average image intensity > 0.3 then activate trigger)——激活触发
  • Return specific values that can be accessed through an API call (e.g. return the position of the center of mass of a binary image)——返回特定值

  下图显示了图像处理流程中的各种缓存和相互之间的操作:

[Vision sensor buffers and operations between buffers]

  The input image and input depth image are volatile buffers (易变缓存 i.e. normally automatically overwritten with new data at each simulation pass);The work image, buffer1 image and buffer2 image are persistent buffers (i.e. their content is not modified unless a component operates on them)

  下面看一个比之前复杂点的例子,将原始图像边缘提取后旋转90°再叠加到原始图像上进行输出:先将要进行操作的work image保存到buffer 1中,然后对work image进行图像处理操作,接着将buffer 1叠加到work image上,最后将合成的图像进行输出。


 

 3.4PythonAPI调用

      3.4.1V-rep端通信配置

  1. 双击打开中的
  2. 在function()下添加函数simExtRemoteApiStart(19999)

我们来介绍一下这个函数:simExtRemoteApiStart,

 功能描述:在指定端口上启动临时远程API服务器服务。当从模拟脚本启动时,服务将在模拟完成时自动结束
输入:
portNumber:安装服务器服务的端口。20000以上端口优先。为了使用共享内存,可以指定负端口号,而不是套接字通信。
maxPacketSize:套接字发送包的最大大小。确保将值保持在1300,除非客户端有不同的设置。
debug:如果为真,窗口将显示该端口上的数据流量。
preEnableTrigger:如果为真,将对来自客户机的同步触发信号预启用服务器服务。
输出:
num result:-1如果操作不成功。在未来的版本中,可能会有一个更差异化的回报价值

[有道词典翻译,服务于头疼英语的朋友]大致可以理解一下,这个函数通常输入一些端口等配置,来实现远程API与V-rep的临时通信(V-rep运行时才能通信!!!切记,划重点,要考)

以上完成了V-rep端的配置,下面介绍如何配置Python端。

     3.4.2Python的配置

笔者用的是Python 3.6,编译器是VS Studio

     3.4.3 函数库的导入

 

这些文件可以在Vrep的安装文件夹中找到,包括:

vrep.py
vrepConst.py
remoteApi.dll(win) remoteApi.dylib(mac) remoteApi.so(linux)

Vrep安装文件夹->programming->remoteApiBindings->
(1)->python->python-->vrep.py&vrepConst.py
(1)->lib->lib->(32/64 Bit)-->remoteApi.dll

将这些文件复制到VS定义的Project文件夹中,这样也省事,如图所示。


 

 3.5 Python程序编写

     3.5.1 仿真的步骤

1.引入头文件

import vrep
import time
import numpy as np
import cv2

2.连接vrep

# 连接vrep
def connection(num):print('program start')vrep.simxFinish(-1) # 关掉之前的连接while True:clientId = vrep.simxStart("127.0.0.1", 19999, True, True, 5000, 5)#建立和服务器的连接if clientId != -1:  #连接成功print('connect successfully')Get_Image(clientId)#获取传输的图像breakelse:time.sleep(0.2)print('connect failed')vrep.simxFinish(clientId)# 结束连接     print('program ended')    

 3.获取服务端发来的图像

def Get_Image(clientId):errorCode,visionSensorHandle = vrep.simxGetObjectHandle(clientId,'VS3',vrep.simx_opmode_oneshot_wait)#获取VS3的handle# 第一次获取数据无效errprCode,resolution,image = vrep.simxGetVisionSensorImage(clientId,visionSensorHandle,0,vrep.simx_opmode_streaming)time.sleep(0.1)#获取有效数据while True:errprCode,resolution,image = vrep.simxGetVisionSensorImage(clientId,visionSensorHandle,0,vrep.simx_opmode_buffer)sensorImage = np.array(image,dtype = np.uint8)sensorImage.resize([resolution[0],resolution[1],3])#整理矩阵cv2.imshow('sensorImage',sensorImage)#显示图像if cv2.waitKey(1)==27:break

4.首先运行Vrep(!!!)

5.再运行python文件(!!!)

6.运行结果

 

左边是vrep中的图像,右边是获取到的图像

 

 3.6视觉处理

      3.6.1算法解析

将整个画面分割为若干的检测区域,并给每个区域设定一个权值。

很容易理解, 距离越远的,重要性越高/越小, 根据自己的需求来设定不同的权值

最后算出来的偏移量带入pid进行计算,pid的教程网上有很多,就不再赘述了。

一文读懂PID控制算法(抛弃公式,从原理上真正理解PID控制)


 

PID代码

pid.py

import time
class PositionalPID:def __init__(self, P, I, D):self.Kp = Pself.Ki = Iself.Kd = Dself.SystemOutput = 0.0#系统输出值self.ResultValueBack = 0.0self.PidOutput = 0.0#PID控制器输出self.PIDErrADD = 0.0self.ErrBack = 0.0#设置一阶惯性环节系统  其中InertiaTime为惯性时间常数def SetInertiaTime(self, InertiaTime,SampleTime):self.SystemOutput = (InertiaTime * self.ResultValueBack + SampleTime * self.PidOutput) / (SampleTime + InertiaTime)self.ResultValueBack = self.SystemOutput#设置PID控制器参数def SetStepSignal(self,StepSignal):Err = StepSignal - self.SystemOutputKpWork = self.Kp * ErrKiWork = self.Ki * self.PIDErrADDKdWork = self.Kd * (Err - self.ErrBack)self.PidOutput = KpWork + KiWork + KdWorkself.PIDErrADD += Errself.ErrBack = Err

 use_pid()

def use_pid(P, I, D,signal1):PositionalPid = PID.PositionalPID(P, I, D)PositionalPid.SetStepSignal(signal1)return PositionalPid.PidOutput
pid效果

算法不足分析

只适用于单条线, 如果是多条线,就不能识别

如何识别直角?

问题其实还有很多, 这个算法比较简单, 但是适用的情景比较局限。

可以移步至我的个人博客顶顶我的博客:锡城小凯的博客

我会把地图放在里面,也会逐步更新到github


 

Reference

[1].https://blog.csdn.net/weixin_41754912/article/details/82353012#2-v-rep%E9%85%8D%E7%BD%AE

[2].https://www.cnblogs.com/21207-iHome/p/7115487.html

 

这篇关于疫情让我使用V-rep仿真(结合pythonAPI)实现机器人视觉巡线+pid调速,的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/367853

相关文章

如何使用celery进行异步处理和定时任务(django)

《如何使用celery进行异步处理和定时任务(django)》文章介绍了Celery的基本概念、安装方法、如何使用Celery进行异步任务处理以及如何设置定时任务,通过Celery,可以在Web应用中... 目录一、celery的作用二、安装celery三、使用celery 异步执行任务四、使用celery

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

Jsoncpp的安装与使用方式

《Jsoncpp的安装与使用方式》JsonCpp是一个用于解析和生成JSON数据的C++库,它支持解析JSON文件或字符串到C++对象,以及将C++对象序列化回JSON格式,安装JsonCpp可以通过... 目录安装jsoncppJsoncpp的使用Value类构造函数检测保存的数据类型提取数据对json数

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

springboot整合 xxl-job及使用步骤

《springboot整合xxl-job及使用步骤》XXL-JOB是一个分布式任务调度平台,用于解决分布式系统中的任务调度和管理问题,文章详细介绍了XXL-JOB的架构,包括调度中心、执行器和Web... 目录一、xxl-job是什么二、使用步骤1. 下载并运行管理端代码2. 访问管理页面,确认是否启动成功

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min