差速巡线机器人设计-良好(80+)的报告-2023

news/2024/5/14 10:14:03/文章来源:https://blog.csdn.net/ZhangRelay/article/details/129686090

如何提分?将一篇报告提升20分以上呢?

差速巡线机器人设计-及格(60+)的报告-2023_zhangrelay的博客-CSDN博客


姓名: 学号: 实践项目1名称:差速巡线机器人设计

60分:缺乏思考、没有对比、没有改进。

  1. 实验目的

简介:基于差速机器人底盘传感器,使用微处理器编程实现机器人快速巡线行驶。

详细描述:差速巡线机器人设计实验的目的是为了探索差速驱动技术在机器人巡线中的应用。通过设计和制作差速巡线机器人,可以测试其在不同地形和环境下的巡线能力和稳定性,同时也可以探索差速驱动技术在机器人运动控制中的优势和局限性。此外,该实验还可以促进自己对机器人控制和运动学的理解和应用能力的提升。

图1.1 差速巡线机器人场景设计

图1.2 差速巡线机器人仿真平台全景图

差速巡线机器人是一种能够自主巡线的机器人,其设计的实验目的是为了探究机器人在不同环境下的自主导航能力和巡线精度。通过对机器人的设计和实验,可以深入了解机器人的巡线原理和控制方法,进一步提高机器人的自主导航能力和巡线精度,为机器人在实际应用中的推广和应用提供技术支持。

  1. 实验意义或者动机

通过这个实验能够将自动控制原理的闭环控制,应用到巡线机器人案例上,真正理解并能够应用控制算法实现机器人的巡线任务。

差速巡线机器人设计实验的意义在于探索机器人在不同环境下的自主导航能力,特别是在复杂地形和障碍物较多的情况下。通过设计和实验,可以提高机器人的巡线精度和稳定性,同时也可以为机器人在工业、农业、医疗等领域的应用提供技术支持。

差速巡线机器人是一种能够自主巡线的机器人,其设计实验的意义在于探索机器人自主导航和控制的技术,以及应用于工业自动化、智能交通等领域。通过差速驱动和巡线传感器的结合,机器人能够实现精准的路径跟踪和避障,提高了机器人的自主性和智能化水平。此外,差速巡线机器人的设计实验还可以促进学生对机器人技术的理解和应用,培养学生的创新能力和实践能力。

表2.1 实验预期目标

巡线指标

稳定

速度

控制算法A

控制算法A+

控制算法A++

  1. 实验步骤

3.1底盘

差速巡线机器人地盘设计通常采用两个驱动轮和一个自由转动的支撑轮,驱动轮通过电机驱动,可以实现机器人的前进、后退、转弯等动作。此外,差速巡线机器人还需要配备差速装置,以便在行驶过程中能够灵活地调整两个驱动轮的转速,从而实现机器人的转向和平稳行驶。

在地盘的设计中,需要考虑机器人的重心平衡和稳定性,以及机器人的结构强度和耐用性。通常采用铝合金等轻质材料制作机器人的底盘和支架,同时采用橡胶轮胎和减震装置来提高机器人的稳定性和行驶平稳性。

此外,差速巡线机器人还需要配备传感器和控制系统,以便实现对机器人的自主导航和巡线功能。传感器通常包括红外线传感器、超声波传感器、光电传感器等,可以实现对机器人周围环境的感知和识别。控制系统则可以根据传感器的反馈信息,实现对机器人的运动轨迹和速度的控制和调整。

图3.1 机器人灰度传感器和两轮速度等可视化人机交互界面

图3.2 底盘左右轮和万向轮布局

3.2传感器

差速巡线机器人的传感器布局通常包括两个灰度传感器和两个轮速传感器。灰度传感器用于检测地面上的黑线,以便机器人能够沿着线路行驶。轮速传感器则用于测量机器人的轮子转速,以便控制机器人的速度和方向。这些传感器通常安装在机器人的底部,以便能够接触到地面并准确地检测黑线和轮子转速。

图3.3 灰度传感器布局

3.3 编程

1. 获取传感器的具体数值

simExtK3_getLineSensor(k3Handle,0)

simExtK3_getLineSensor(k3Handle,1)

说明,0,1分别代表左和右两个传感器。

  1. 设置左右轮速度

simExtK3_setVelocity(k3Handle,velLeft,velRight)

3.4 巡线算法

依据左右灰度传感器与黑线的偏差值调整机器人左右轮速度。

算法a- bang-bang控制

if (simExtK3_getLineSensor(k3Handle,0)>0.5) then

velLeft=maxVel

else

velLeft=maxVel*0.5

end

if (simExtK3_getLineSensor(k3Handle,1)>0.5) then

velRight=maxVel

else

velRight=maxVel*0.5

end

将状态空间划分为两个区域(空白和黑线),一个区域对应于控制变量取控制量最大值maxVel,另一个区域对应于控制变量取控制量最小值maxVel*0.5,稳定范围(0.0-0.5)。这两个区域的分界面称为开关面(simExtK3_getLineSensor(k3Handle,0)>0.5),而决定砰-砰控制的具体形式的关键就是决定开关面。

算法a+ 线性控制器

PID(仅用P控制)

velLeft=maxVel*simExtK3_getLineSensor(k3Handle,0)

velRight=maxVel*simExtK3_getLineSensor(k3Handle,1)

简要介绍:

算法a++ 非线性控制线

PID(仅用P控制)

velLeft=8.0*maxVel*simExtK3_getLineSensor(k3Handle,0)*simExtK3_getLineSensor(k3Handle,0)

velRight=8.0*maxVel*simExtK3_getLineSensor(k3Handle,1)*simExtK3_getLineSensor(k3Handle,1)

简要介绍:

3.5 调试

需要自己补充的。

  1. 实验结果和分析

在环境中配置图表,显示机器人速度控制量,以左轮为例:

图4.1 添加图显示机器人左轮速度

将如下黑色背景,调整为白色:

图4.2 默认图表为黑色

选择adjust background color:

图4.3 设置背景为白色

算法a控制量不平滑,导致机器人巡线晃动较大。

图4.4 bang-bang控制-控制量变化大导致机器人晃动

图4.4上图不带环境,下图带环境,依据需要选择合适的。

算法a+控制量如下,平滑度大幅提升,但是峰值速度下降到24以下,参数还有优化空间。

图4.5 改进后的控制曲线克服抖震(以左轮为例)

算法a++控制量如下,平滑度小幅下降,但是峰值速度可以提高到35+。

图4.6 改进后的控制曲线提升最大速度(以左轮为例)

  1. 总结和展望

依据实验目标实现了移动机器人巡线,但是控制不平滑,机器人运动过程中晃动明显,需要后续继续完善。

  1. 参考文献

1 V-Rep参考手册

2 移动机器人巡线原理与实践

3 自动控制原理

-- This script runs in a thread. You can also use a non-threaded script instead-- Following commands are implemented:
--
-- k3Handle=simExtK3_create(table_2 wheelMotorHandles,table_2 colorSensorHandles,table_9 IrSensorHandles,table_5 usSensorHandles,table_6 armMotorHandles,table_3 fingerMotorHandles,table_2 gripperDistSensHandles,table_2 gripperColSensHandles,number uiHandle) 
-- boolean result=simExtK3_destroy(number k3Handle)
-- distance_inMeters=simExtK3_getInfrared(k3Handle,index_of_ir_sensor_0_to_8)
-- distance_inMeters=simExtK3_getUltrasonic(k3Handle,index_of_us_sensor_0_to_5)
-- intensity_0_to_1=simExtK3_getLineSensor(k3Handle,index_of_line_sensor_0_to_1)
-- distance_inMeters=simExtK3_getGripperProxSensor(k3Handle,index_of_finger_prox_sensor_0_to_1)
-- boolean result=simExtK3_setVelocity(k3Handle,velocityLeft_radPerSec,velocityRight_radPerSec)
-- boolean result=simExtK3_setArmPosition(k3Handle,position_300_to_900)
-- boolean result=simExtK3_setGripperGap(k3Handle,gap_0_to_170)threadFunction=function()while simGetSimulationState()~=sim_simulation_advancing_abouttostop doif (simExtK3_getLineSensor(k3Handle,0)>0.5) then velLeft=maxVel         -- left sensor intensity > 0.5elsevelLeft=maxVel*0.5    -- left sensor intensity <= 0.5endif (simExtK3_getLineSensor(k3Handle,1)>0.5) then velRight=maxVel        -- right sensor intensity > 0.5elsevelRight=maxVel*0.5    -- right sensor intensity <= 0.5endsimExtK3_setVelocity(k3Handle,velLeft,velRight) -- Set desired left and right motor velocitiesif (simExtK3_getGripperProxSensor(k3Handle,0)<0.015)or(simExtK3_getGripperProxSensor(k3Handle,1)<0.015) then-- Something was detected between the fingerssimExtK3_setGripperGap(k3Handle,0) -- close the fingerssimExtK3_setArmPosition(k3Handle,900) -- move the arm upendend
end-- Initialization:
-- Check if the required extension module is there:
-- ************************************************
moduleName=0
moduleVersion=0
index=0
kheperaModuleNotFound=true
while moduleName domoduleName,moduleVersion=simGetModuleName(index)if (moduleName=='K3') thenkheperaModuleNotFound=falseendindex=index+1
end
if (kheperaModuleNotFound) thensimDisplayDialog('Error','Khepera3 plugin was not found. (v_repExtK3.dll)&&nSimulation will not run properly',sim_dlgstyle_ok,true,nil,{0.8,0,0,0,0,0},{0.5,0,0,1,1,1})
end
-- ************************************************-- Create the K3 object:
local wheelMotorHandles={simGetObjectHandle('K3_leftWheelMotor'),simGetObjectHandle('K3_rightWheelMotor')}
local colorSensorHandles={simGetObjectHandle('K3_colorSensorLeft'),simGetObjectHandle('K3_colorSensorRight')}
local irSensorHandles={}
for i=1,9,1 doirSensorHandles[#irSensorHandles+1]=simGetObjectHandle('K3_infraredSensor'..i)
end
local usSensorHandles={}
for i=1,5,1 dousSensorHandles[#usSensorHandles+1]=simGetObjectHandle('K3_ultrasonicSensor'..i)
end
local armMotorHandles={-1,-1,-1,-1,-1,-1}
armMotorHandles[1]=simGetObjectHandle('K3_gripper_armJoint1')
armMotorHandles[2]=simGetObjectHandle('K3_gripper_armJoint2')
armMotorHandles[3]=simGetObjectHandle('K3_gripper_armAuxJoint1')
armMotorHandles[4]=simGetObjectHandle('K3_gripper_armAuxJoint2')
armMotorHandles[5]=simGetObjectHandle('K3_gripper_armAuxJoint3')
armMotorHandles[6]=simGetObjectHandle('K3_gripper_armAuxJoint4')
local fingerMotorHandles={-1,-1,-1}
fingerMotorHandles[1]=simGetObjectHandle('K3_gripper_fingers')
fingerMotorHandles[2]=simGetObjectHandle('K3_gripper_fingersAux')
fingerMotorHandles[3]=simGetObjectHandle('K3_gripper_fingersAux0')
local gripperDistSensHandles={simGetObjectHandle('K3_gripper_leftDistanceSensor'),simGetObjectHandle('K3_gripper_rightDistanceSensor')}
local gripperColSensHandles={simGetObjectHandle('K3_gripper_leftColorSensor'),simGetObjectHandle('K3_gripper_rightColorSensor')}
local uiHandle=simGetUIHandle('K3_stateVisualization')k3Handle=simExtK3_create(wheelMotorHandles,colorSensorHandles,irSensorHandles,usSensorHandles,armMotorHandles,fingerMotorHandles,gripperDistSensHandles,gripperColSensHandles,uiHandle)simExtK3_setVelocity(k3Handle,6,6) -- set target velocity to 6 rad/sec for each wheel
simWait(5) -- Wait 5 seconds
simExtK3_setVelocity(k3Handle,0,0) -- stop
simWait(1) -- Wait 1 second
simExtK3_setGripperGap(k3Handle,0) -- close the fingers
simWait(2) -- Wait 2 seconds
simExtK3_setGripperGap(k3Handle,170) -- open the fingers
simWait(2) -- Wait 2 seconds
simExtK3_setArmPosition(k3Handle,300) -- put the arm down
simWait(6) -- Wait 6 seconds-- Now follow the black line and grasp an object:
maxVel=2*math.pi-- Here we execute the regular thread code:
res,err=xpcall(threadFunction,function(err) return debug.traceback(err) end)
if not res thensimAddStatusbarMessage('Lua runtime error: '..err)
end-- Clean-up:
-- Destroy the K3 object:
simExtK3_destroy(k3Handle)

附加参考:自动评分如下

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

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

相关文章

攻防世界-first

题目下载&#xff1a;下载 IDA载入 __int64 __fastcall main(int a1, char **a2, char **a3) {__useconds_t *v3; // rbpunsigned int v4; // eaxint *v5; // rcxint v6; // edxunsigned int v7; // eaxsigned __int64 v8; // rcx__int64 v9; // raxchar v10; // blchar v11;…

为知笔记私有化部署

前言 原来一直买的为知笔记vip&#xff0c;但是随着内容越来越&#xff0c;并且不好整理。同时还不能一键全部导出&#xff0c;最后决定将数据迁移到自己服务器上。为止笔记提供了docker镜像&#xff0c;这也方便了部署&#xff08;其实吧&#xff0c;从产品层面&#xff0c;可…

C++ Lambda表达式的常见用法

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三…

【Django 网页Web开发】05. 数据库操作,实战用户管理(保姆级图文)

目录1. 安装第三方模块2. ORM2.1 自己手动创建数据库2.2 django连接数据库2.3 建表语句写在哪里&#xff1f;2.4 建表语句写好后如何运行生效&#xff1f;3. 操作表3.1 创建数据表3.2 修改数据表4. 操作数据4.1 插入数据4.2 删除数据4.3 修改数据4.4 查询数据5. 实战&#xff1…

pytest学习和使用22-allure特性 丨总览中的Environment、Categories设置以及Flaky test使用

22-allure特性 丨总览中的Environment和Categories设置1 Environment设置1.1 设置方法1.2 创建文件2 Categories设置2.1 设置方式2.2 创建文件3 关于Flaky test3.1 Flaky test介绍3.2 产生Flaky Tests的原因3.3 Flaky安装3.4 Flaky使用3.5 小结小结1小结2如下图&#xff0c;我们…

开始学习HTML5

HTML5 简介 HTML5是HTML最新的修订版本&#xff0c;2014年10月由万维网联盟&#xff08;W3C&#xff09;完成标准制定。 HTML5的设计目的是为了在移动设备上支持多媒体。 HTML5简单易学。 什么是 HTML5? HTML5 是下一代 HTML 标准。 HTML , HTML 4.01的上一个版本诞生于 1…

如何将3张图片横向拼在一起

如何将3张图片横向拼在一起&#xff1f;遇到这个情况你可能马上就会说出很多图片处理的app&#xff0c;比如用某秀秀来操作&#xff0c;但是也有很多时候某秀秀也处理不了的。当我们的图片非常大&#xff0c;图片数量很多&#xff0c;图片的格式不是jpg那种通用的格式&#xff…

如何监控和诊断JVM堆内和堆外内存使用?

第26讲 | 如何监控和诊断JVM堆内和堆外内存使用&#xff1f; 上一讲我介绍了 JVM 内存区域的划分&#xff0c;总结了相关的一些概念&#xff0c;今天我将结合 JVM 参数、工具等方面&#xff0c;进一步分析 JVM 内存结构&#xff0c;包括外部资料相对较少的堆外部分。 今天我要…

Java栈和队列·下

Java栈和队列下2. 队列(Queue)2.1 概念2.2 实现2.3 相似方法的区别2.4 循环队列3. 双端队列 (Deque)3.1 概念4.java中的栈和队列5. 栈和队列面试题大家好&#xff0c;我是晓星航。今天为大家带来的是 Java栈和队列下 的讲解&#xff01;&#x1f600; 继上一个讲完的栈后&…

视听场景理解经典任务

文章目录1. 视听场景理解简介2. 主要任务2.1 Audio-visual Event Localization (AVE) 2.2 Audio-visual Video Parsing &#xff08;AVVP&#xff09;2.3 Audio-visual Question Answering &#xff08;AVQA&#xff09;2.4 Audio-visual Segmentation &#xff08;AVS&#xf…

STM32中systick中断的优先级

1、systick中断的优先级 systick为内核外设中断&#xff0c;与普通外设中断的优先级有些区别&#xff0c;并没有抢占优先级和子优先级的说法。 对于M3来说内核外设的中断优先级由内核SCB这个外设的寄存器&#xff1a;SHPRx&#xff08;x1.2.3&#xff09;来配置。 内核外设的中…

佳明安夺(Garmin Enduro)续航简单测试

文章目录&#xff08;一&#xff09;结论&#xff08;二&#xff09;测试条件&#xff08;2.1&#xff09;Garmin Connect APP 日历&#xff08;2.2&#xff09;具体运动记录&#xff08;2.3&#xff09;步数情况&#xff08;三&#xff09;补充和探讨&#xff08;3.1&#xff…

信捷PLC通过EtherCat与松下伺服通讯时的断电重启时会产生巨大异响的Bug原因及解决办法

信捷PLC支持ethercat通讯协议,可以和支持ethercat的从站通讯,像伺服驱动器或IO站点等。 其中,信捷XLH系列PLC在与松下伺服驱动器通讯时,有一个比较严重的问题,就是PLC断电再上电时,有时候会出现bug,这个bug的现象是,使用PLC的指令方式去控制伺服轴动作时,会产生巨大的…

kali内置超好用的代理工具proxychains

作者&#xff1a;Eason_LYC 悲观者预言失败&#xff0c;十言九中。 乐观者创造奇迹&#xff0c;一次即可。 一个人的价值&#xff0c;在于他所拥有的。所以可以不学无术&#xff0c;但不能一无所有&#xff01; 技术领域&#xff1a;WEB安全、网络攻防 关注WEB安全、网络攻防。…

Mybatis的课程总结

1.mybatis Mybatis主要是对代码进行少写&#xff0c;分别加入核心配置文件和mapper映射文件&#xff0c; 核心配置文件主要是为了连接数据库&#xff0c;mapper映射文件是为了编写sql语句 1.如何配置mybatis ①先创建一个moudle ②然后配置jar包 ③然后进行mybatis的分层 bean…

pcb成型板aoi检测,6种PCB板常用的检测方法

6种PCB板常用的检测方法&#xff0c;主要包括&#xff1a;PCB板人工目测、PCB板在线测试、PCB板功能测试、自动光学检测、自动X光检查、激光检测系统1、PCB板人工目测使用放大镜或校准的显微镜&#xff0c;利用操作人员视觉检查来确定电路板合不合格&#xff0c;并确定什么时候…

我们再次看看 ARB 女巫空投策略,做到知彼知己,不敢说百战不殆

女巫检测选项该项目旨在从 Arbitrum 空投中删除 Sybil 地址&#xff0c;确保只有合法用户才能收到空投代币。方法我们使用链上数据来识别同一用户拥有的相关地址&#xff0c;并使用来自 Nansen、Hop 和 OffChain Labs 的数据删除实体地址&#xff0c;例如网桥、交易所和智能合约…

Verilog学习之触发器与modelsim仿真

目录 一、前言 二、触发器介绍 三、测试文件代码 一、前言 ​ ​本文将学习常见类型触发的verilog编写&#xff0c;结合仿真结果来熟悉。 二、触发器介绍 ​ ​触发器在verilog中的作用主要是具有存储作用&#xff0c;由时钟信号来触发改变存储内容&#xff0c;较常见…

银河麒麟v10系统硬盘挂载

一、查看磁盘 近期由于centos系统停止更新用户服务器要更换银河麒麟v10&#xff0c;拿到服务器后使用lsblk -f或fdisk -l命令查看磁盘名称 可以看到sdb200G就是要挂载的硬盘&#xff0c;还没有uuid需要初始化才可以挂载。 二、分区 分区命令&#xff1a; fdisk /dev/【你的…

【LeetCode每日一题】——面试题17.21.直方图的水量

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【时间频度】八【代码实现】九【提交结果】一【题目类别】 双指针 二【题目难度】 困难 三【题目编号】 面试题17.21.直方图的水量 四【题目描述】 给定一个直方图(也称…