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

news2024/11/24 3:48:03

如何提分?将一篇报告提升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 do
        if (simExtK3_getLineSensor(k3Handle,0)>0.5) then 
            velLeft=maxVel         -- left sensor intensity > 0.5
        else
            velLeft=maxVel*0.5    -- left sensor intensity <= 0.5
        end

        if (simExtK3_getLineSensor(k3Handle,1)>0.5) then 
            velRight=maxVel        -- right sensor intensity > 0.5
        else
            velRight=maxVel*0.5    -- right sensor intensity <= 0.5
        end

        simExtK3_setVelocity(k3Handle,velLeft,velRight) -- Set desired left and right motor velocities

        if (simExtK3_getGripperProxSensor(k3Handle,0)<0.015)or(simExtK3_getGripperProxSensor(k3Handle,1)<0.015) then
            -- Something was detected between the fingers
            simExtK3_setGripperGap(k3Handle,0) -- close the fingers
            simExtK3_setArmPosition(k3Handle,900) -- move the arm up
        end
    end
end

-- Initialization:
-- Check if the required extension module is there:
-- ************************************************
moduleName=0
moduleVersion=0
index=0
kheperaModuleNotFound=true
while moduleName do
    moduleName,moduleVersion=simGetModuleName(index)
    if (moduleName=='K3') then
        kheperaModuleNotFound=false
    end
    index=index+1
end
if (kheperaModuleNotFound) then
    simDisplayDialog('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 do
    irSensorHandles[#irSensorHandles+1]=simGetObjectHandle('K3_infraredSensor'..i)
end
local usSensorHandles={}
for i=1,5,1 do
    usSensorHandles[#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 then
    simAddStatusbarMessage('Lua runtime error: '..err)
end

-- Clean-up:
-- Destroy the K3 object:
simExtK3_destroy(k3Handle)

附加参考:自动评分如下

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

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

相关文章

恒生电子面试题总结

CPU突然飙升&#xff0c;如何排查 1.监控cpu运行状态&#xff0c;显示进程运行信息列表 top -c 2. 按CPU使用率排序&#xff0c;键入大写的P P 3.用 top -Hp 命令查看占用 CPU 最高的线程 上一步用 top命令找到了那个 Java 进程。那一个进程中有那么多线程&#xff0c;不可…

[oeasy]python0132_[趣味拓展]emoji_表情符号_抽象话_由来_流汗黄豆

emoji表情符号 回忆上次内容 上次了解了unicode 和 utf-8 unicode是字符集utf-8是一种可变长度的编码方式utf-8是实现unicode的存储和传输的现实的方式 "拜"字 unicode编码是0x62dcutf-8字节形式是b"\xe6\x8b\x9c" 如果我想看看 b"\x62\xdc"用…

准确率、精确率、召回率、F1score和混淆矩阵

准确率和PR、confusion matrix的概念初次接触是在六年前&#xff0c;2017着手在做激光雷达点云处理的相关事宜&#xff0c;六年时光不长&#xff0c;却有很多事情发生。 精确率 precision 也叫查准率&#xff0c;即正确预测为正的占全部预测为正的比例(不准错&#xff0c;宁愿…

图解redis发布和订阅

目录 1.什么是发布订阅 1.1概念 1.2发布订阅过程 1.3发布订阅分为两类 2. 频道的订阅与退订 2.1subcribe 2.2退订频道 3. 模式的订阅和退订 3.1模式的订阅 3.2punsubscribe 4.频道和模式的发布 4.1频道的发布 4.2模式的发布 1.什么是发布订阅 1.1概念 1.发布订阅…

【电源专题】案例:充电芯片如何配置NTC偏置网络设定充电温度区间

背景 充电芯片是需要检测电池内部的NTC电阻来得到电池此时的温度,然后根据温度来判断自己是否要进行充电。因此在导入充电芯片过程中,我们需要设置NTC的偏置网络来设定能充电的温度范围。如下图所示为SGM41523芯片的典型应用图: RT1和RT2为NTC的偏置网络。 在规格书的更详细…

【U8+】修改用友U8+填制凭证界面字体大小

【问题描述】 在使用用友U8软件填制凭证功能时&#xff0c; 觉得【填制凭证】界面字体太小&#xff0c;看着不方便。 想要进行调整。 【解决方法】 1、打开填制凭证界面&#xff0c; 点击最上方【选项】按钮&#xff1b; 2、在弹出的凭证选项设置窗口中&#xff0c; 找到【凭…

PHP语言请求示例,电商商品详情接口(item_get-根据ID取商品详情)代码封装教程

item_get-根据ID取商品详情接口 通过代码封装该接口可以拿到商品标题&#xff0c;商品价格&#xff0c;商品促销信息&#xff0c;商品优惠价&#xff0c;商品库存&#xff0c;sku属性&#xff0c;商品图片&#xff0c;desc图片&#xff0c;desc描述&#xff0c;sku图片&#xf…

抓包工具Wireshark安装与使用

windows下安装 下载安装包 Npcap wireshark依赖于Npcap或者Winpcap软件捕获网络实时数据。这里选择Npcap。下载地址&#xff1a;https://npcap.com/#download。Wireshark Wireshark是一个开源的网络数据包分析器。该分析器尽可能详细地展示捕获的包数据。下载地址&#xff1a…

C++ 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值

C 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值C 数组、指针、数组指针、指针数组、多级指针、STL-map、结构体 的 初始化 及其 初始化赋值C 数组、指针、数组指针、指针数组、多级指针数组一维数组初始化&#xff1a;二维数组初始化…

8.1 假设验证的基本概念

学习目标&#xff1a; 要学习假设检验的基本概念&#xff0c;我会按照以下步骤进行&#xff1a; 了解假设检验的基本概念&#xff1a;假设检验是一种统计推断方法&#xff0c;用于判断某个假设是否成立。一般来说&#xff0c;假设检验包括原假设和备择假设两个假设&#xff0c…

语雀笔记备份导出

参考: https://www.cnblogs.com/ssslinppp/p/17020303.htmlhttps://github.com/yuque/yuque-exporterhttps://zhuanlan.zhihu.com/p/582287220https://www.yuque.com/duzh929/blog/ocffqghttps://www.yuque.com/hijiaobu/datalife/onf6sy#BKajf 现在需要超级管理员,若是没有超级…

JDK8新特性 (Lambda表达式和Stream流式编程)

目录 一&#xff1a;JDK8新特性 1. Java SE的发展历史 2. 了解Open JDK 和 Oracle JDK 3. JDK 8新特性 3.1 Lambda表达式&#xff08;重点&#xff09; 3.2 接口的增强 3.3 函数式接口 3.4 方法引用 3.5 集合之Stream流式操作&#xff08;重点&#xff09; 3.6 新的时…

Windows wsl连接网络代理

使用 WSL 访问网络应用程序 | Microsoft Learn 为 WSL2 一键设置代理 - 知乎 (zhihu.com) 介绍 本文介绍开通了Windows WSL子系统之后&#xff0c;怎么在两者之间进行网络通讯&#xff1b;对在windows系统中开启了代理以后&#xff0c;如何在WSL中设置网络代理问题进行了详细…

光萤CEO陈海洲:平台模式将成为户用分布式光伏市场的主流 | 爱分析调研

近两年来&#xff0c;随着国家“双碳”目标的确立&#xff0c;清洁能源迎来重要发展机遇&#xff0c;其中户用分布式光伏因其对土地资源占用少、离用电侧距离近以及与国家乡村振兴战略共振的效果而受到显著的政策倾斜性支持。2020-2022年户用分布式光伏新增装机量持续攀升&…

【C++基础】auto关键字(C++11)(auto的使用细则;auto不能推导的场景;auto的使用场景;基于范围的for循环)

九、auto关键字 9.1 auto简介 在早期C/C(C98)中auto的含义是&#xff1a;使用auto修饰的变量&#xff0c;是具有自动存储器的局部变量&#xff0c;但遗憾的是一直没有人去使用它。因为在函数内定义的变量默认就是局部变量。 C11中&#xff0c;标准委员会赋予了auto全新的含义…

目标检测基础之IOU计算

目标检测基础之IOU计算概念理解——什么是IOUdemo后记概念理解——什么是IOU IOU 交并比&#xff08;Intersection over Union&#xff09;&#xff0c;从字面上很容易理解&#xff1a;计算交集在并集的比重。从网上截张图看看 IOUA∩BA∪BIOU \frac{A \cap B}{A \cup B} IO…

【Java版oj】day32淘宝网店、斐波那契凤尾

目录 一、淘宝网店 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 二、斐波那契凤尾 &#xff08;1&#xff09;原题再现 &#xff08;2&#xff09;问题分析 &#xff08;3&#xff09;完整代码 一、淘宝网店…

idea将本地项目上传git

idea将本地项目上传git 第一步&#xff1a;菜单栏 VCS——>import into Version control——>Create git Repository——>弹出框找到选中自己项目——>点击OK 第二步&#xff1a;选中项目右键 ——>git——>Add 文件会变成绿色表示成功 第三步:VCS——>co…

Nginx的概述与配置

一、Nginx概述 1、Nginx的特点 一款高性能、轻量级web服务 • 稳定性高 • 系统资源消耗低高 • 对HTTP并发连接的处理能力 单台物理服务器可支持30000~50000个并发请求 2、 Nginx编译安装 • 安装支持软件 • 创建运行用户、组 • 编译安装Nginx 3、Nginx运行控制 …

Java面试突击班(抓住金九银十) 持续更新中

文章目录1.Java中线程的实现方式&#xff1f;2. Java线程中的状态&#xff1f;3. Java中如何停止线程&#xff1f;4. Java中Sleep和wait方法的区别&#xff1f;5.扩展—— P5典型 P6典型 P7典型6.并发编程的三大特性原子性什么时并发编程得原子性保证并发编程得原子性可见性什么…