蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

时间:2021-03-16 01:05:19

参考资料:

蓝桥ROS机器人之v-rep_pro_edu_v3_6_2

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


这个案例全部在ROS云课中完成。

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

第一步:安装v-rep

第二步:复现差速巡线

git clone https://gitcode.net/ZhangRelay/v-rep_pro_edu_v3_6_2_ubuntu16_04.git

等待下载完成后,解压缩:

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

tar -xf v-rep_pro_edu_v3_6_2_ubuntu16_04/V-REP_PRO_EDU_V3_6_2_Ubuntu16_04.tar.xz

然后使用./vrep.sh打开:

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

使用案例:

修改对应代码

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

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

添加图表:

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

调试发现未能正常巡线,调整参数:

8.0 调整为 4.0。

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

左右轮和机器人拿起蓝色物料。

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

巡线过程中左右轮速度曲线。

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现


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

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


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

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

  1. 实验目的

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

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

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

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

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

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

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

  1. 实验意义或者动机

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

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

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

表2.1 实验预期目标

巡线指标

稳定

速度

控制算法A

控制算法A+

控制算法A++

  1. 实验步骤

3.1底盘

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

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

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

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

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

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

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

3.2传感器

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

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

图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. 实验结果和分析

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

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

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

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

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

图4.2 默认图表为黑色

选择adjust background color:

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

图4.3 设置背景为白色

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

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现
蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

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

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

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

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

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

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

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现

图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)

附加参考:自动评分如下

蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现
蓝桥ROS-差速巡线机器人设计-良好(80+)的报告-复现