参考资料:
这个案例全部在ROS云课中完成。
第一步:安装v-rep
第二步:复现差速巡线
git clone https://gitcode.net/ZhangRelay/v-rep_pro_edu_v3_6_2_ubuntu16_04.git
等待下载完成后,解压缩:
tar -xf v-rep_pro_edu_v3_6_2_ubuntu16_04/V-REP_PRO_EDU_V3_6_2_Ubuntu16_04.tar.xz
然后使用./vrep.sh打开:
使用案例:
修改对应代码
velLeft=8.0*maxVel*simExtK3_getLineSensor(k3Handle,0)*simExtK3_getLineSensor(k3Handle,0)
velRight=8.0*maxVel*simExtK3_getLineSensor(k3Handle,1)*simExtK3_getLineSensor(k3Handle,1)
添加图表:
调试发现未能正常巡线,调整参数:
8.0 调整为 4.0。
左右轮和机器人拿起蓝色物料。
巡线过程中左右轮速度曲线。
如何提分?将一篇报告提升20分以上呢?
差速巡线机器人设计-及格(60+)的报告-2023_zhangrelay的博客-CSDN博客
姓名: 学号: 实践项目1名称:差速巡线机器人设计
60分:缺乏思考、没有对比、没有改进。
实验目的
简介:基于差速机器人底盘和传感器,使用微处理器编程实现机器人快速巡线行驶。
详细描述:差速巡线机器人设计实验的目的是为了探索差速驱动技术在机器人巡线中的应用。通过设计和制作差速巡线机器人,可以测试其在不同地形和环境下的巡线能力和稳定性,同时也可以探索差速驱动技术在机器人运动控制中的优势和局限性。此外,该实验还可以促进自己对机器人控制和运动学的理解和应用能力的提升。
图1.1 差速巡线机器人场景设计
图1.2 差速巡线机器人仿真平台全景图
差速巡线机器人是一种能够自主巡线的机器人,其设计的实验目的是为了探究机器人在不同环境下的自主导航能力和巡线精度。通过对机器人的设计和实验,可以深入了解机器人的巡线原理和控制方法,进一步提高机器人的自主导航能力和巡线精度,为机器人在实际应用中的推广和应用提供技术支持。
实验意义或者动机
通过这个实验能够将自动控制原理的闭环控制,应用到巡线机器人案例上,真正理解并能够应用控制算法实现机器人的巡线任务。
差速巡线机器人设计实验的意义在于探索机器人在不同环境下的自主导航能力,特别是在复杂地形和障碍物较多的情况下。通过设计和实验,可以提高机器人的巡线精度和稳定性,同时也可以为机器人在工业、农业、医疗等领域的应用提供技术支持。
差速巡线机器人是一种能够自主巡线的机器人,其设计实验的意义在于探索机器人自主导航和控制的技术,以及应用于工业自动化、智能交通等领域。通过差速驱动和巡线传感器的结合,机器人能够实现精准的路径跟踪和避障,提高了机器人的自主性和智能化水平。此外,差速巡线机器人的设计实验还可以促进学生对机器人技术的理解和应用,培养学生的创新能力和实践能力。
表2.1 实验预期目标
巡线指标 |
稳定 |
速度 |
控制算法A |
√ |
? |
控制算法A+ |
√ |
√ |
控制算法A++ |
√ |
√ |
实验步骤
3.1底盘
差速巡线机器人地盘设计通常采用两个驱动轮和一个*转动的支撑轮,驱动轮通过电机驱动,可以实现机器人的前进、后退、转弯等动作。此外,差速巡线机器人还需要配备差速装置,以便在行驶过程中能够灵活地调整两个驱动轮的转速,从而实现机器人的转向和平稳行驶。
在地盘的设计中,需要考虑机器人的重心平衡和稳定性,以及机器人的结构强度和耐用性。通常采用铝合金等轻质材料制作机器人的底盘和支架,同时采用橡胶轮胎和减震装置来提高机器人的稳定性和行驶平稳性。
此外,差速巡线机器人还需要配备传感器和控制系统,以便实现对机器人的自主导航和巡线功能。传感器通常包括红外线传感器、超声波传感器、光电传感器等,可以实现对机器人周围环境的感知和识别。控制系统则可以根据传感器的反馈信息,实现对机器人的运动轨迹和速度的控制和调整。
图3.1 机器人灰度传感器和两轮速度等可视化人机交互界面
图3.2 底盘左右轮和万向轮布局
3.2传感器
差速巡线机器人的传感器布局通常包括两个灰度传感器和两个轮速传感器。灰度传感器用于检测地面上的黑线,以便机器人能够沿着线路行驶。轮速传感器则用于测量机器人的*转速,以便控制机器人的速度和方向。这些传感器通常安装在机器人的底部,以便能够接触到地面并准确地检测黑线和*转速。
图3.3 灰度传感器布局
3.3 编程
1. 获取传感器的具体数值
simExtK3_getLineSensor(k3Handle,0) simExtK3_getLineSensor(k3Handle,1) |
说明,0,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 调试
需要自己补充的。
实验结果和分析
在环境中配置图表,显示机器人速度控制量,以左轮为例:
图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 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)
附加参考:自动评分如下