文章目录
准备工作
- 下载并安装V-REP机器人仿真软件
- 熟悉软件界面与基本操作:用户手册
任务1:智能小车平台建模
- 参考文档中 Tutorial - BubbleRob tutorial 部分,学习:
- 车身与轮子物理模型的设计
- 动力学模型等参数的设置
- 传感器的添加与使用
- 驱动关节的设计与控制
- 控制脚本的编写
- …
- 实现要求:
- 搭建一个四轮小车,小车搭建一个单目彩色摄像头
- 尺寸(如长宽高)及底盘参数(如速度限制)可参考 DJI RoboMaster S1 进行设计
- 不采用麦克纳姆轮
- 编写简单脚本使得小车能呈S型路线行走,当碰到障碍物后能够绕行
- 提交内容:
- report/实验报告.pdf
- src/项目文件
实现
搭建四轮小车
1. 添加小车 carRob
在场景中添加一个 320 × 240 × 270 mm(长 × 宽 × 高)的长方体并命名为 carRob。在 Object Properties 中设置使能立方体的 Collidable、Measurable、Renderable 和 Detectable 属性,便于之后传感器计算物体之间的距离。将小车的位置沿 z 轴向上移动 2 cm。
2. 添加接近传感器 proximity sensor
在场景中添加一个锥形接近传感器,修改接近传感器的位置和方向,在 Object Properties 中修改传感器的参数。将其命名为 carRob_sensingNose,并添加到 carRob 目录下。
3. 添加车轮 wheel
在场景中添加一个半径为 0.1 m,高为 0.02 m 的圆柱体,像 carRob 一样调整圆柱体的 Collidable、Measurable、Renderable 和 Detectable 属性。修改车轮的位置和方向,绝对位置为(0.09,0.13,0.05),绝对欧拉角为(-90,0,0),将其命名为 carRob_front_leftWheel。复制粘贴前左轮,创建其余三个车轮,并修改相应的位置和名称。
4. 添加关节 revolute
在场景中添加一个关节,将前左轮的位置和角度信息添加到关节上,修改关节属性,并重命名为 carRob_front_leftMotor。以相同的方式创建其余的三个关节,并修改相应的位置、属性和名称。将四个车轮分别添加到对应的四个电机目录下,并添加到 carRob 目录下。
5. 使 carRob 具有稳定性
运行仿真,小车有微小的振动。将车轮的质量和惯性矩均放大八倍。再次进行仿真,可以看到增加了质量和惯性之后小车的稳定性增强。
6. 创建 carRob collection
将 carRob 设置为模型 carRob 中所有对象的基础。定义一个表示 carRob 的对象集合。创建 calculation module,为 carRob 添加一个最小距离函数。
7. 创建图表 graph
在场景中添加一个 graph 并重命名为 carRob_graph,将其添加到 carRob 目录下,设置绝对座标为(0,0,0.005)。将 carRob 的 X、Y 和 Z 的数据流添加进图表中,再添加一个数据流,跟踪机器人与其环境之间的最小距离,对四个数据流进行重命名,设置相应参数。建立一个三锥曲线来显示 carRob 的轨迹并设置相应参数。
8. 添加障碍物 obstacles
在场景中创建大小为(0.1,0.1,0.2)的圆柱体,设置障碍物的属性为静态,拖动圆柱体到合适的位置,再复制粘贴添加多个障碍物。
9. 完成模型构建 carRob model
选中 carRob,在 object properties 里面点击 Object is model base 和 Object/model can transfer or accept DNA。选中 motors、graph 和 proximity sensor,在 object properties 里面点击 ignored by model bounding box,后点击 Apply to selection。选中 motors,设置显示图层,隐藏 motors。选中 wheels、graph 和 proximity sensor,在 object properties 的 common 界面勾选 Select base of model instead,这样当选中其中的任何一个 object 的时候,选中的都是 carRob,保护模型。
10. 添加单目彩色摄像头 camera
在场景中添加一个 camera,设置相应属性。在场景中添加一个浮动视图并与 proximity sensor 联系起来。
编写脚本
基本思路:在前二分之一的时间中使小车左轮的速度为右轮的速度的四倍,实现向右转;在后二分之一时间中,使小车右轮的速度为左轮的速度的四倍,实现向左转。小车交替着向左转和向右转,实现 S 型前进。在小车上搭载接近传感器,使得小车碰到障碍物时能绕行。
完整代码如下:
function speedChange_callback(ui,id,newVal)
speed=minMaxSpeed[1]+(minMaxSpeed[2]-minMaxSpeed[1])*newVal/100
end
function sysCall_init()
-- This is executed exactly once, the first time this script is executed
carRobBase=sim.getObjectAssociatedWithScript(sim.handle_self) -- this is carRob's handle
fleftMotor=sim.getObjectHandle("carRob_front_leftMotor") -- Handle of the front left motor
frightMotor=sim.getObjectHandle("carRob_front_rightMotor") -- Handle of the front right motor
bleftMotor=sim.getObjectHandle("carRob_back_leftMotor") -- Handle of the back left motor
brightMotor=sim.getObjectHandle("carRob_back_rightMotor") -- Handle of the back right motor
noseSensor=sim.getObjectHandle("carRob_sensingNose") -- Handle of the proximity sensor
minMaxSpeed={50*math.pi/180,300*math.pi/180} -- Min and max speeds for each motor
backUntilTime=-1 -- Tells whether bubbleRob is in forward or backward mode
-- Create the custom UI:
xml = '<ui title="'..sim.getObjectName(carRobBase)..' speed" closeable="false" resizeable="false" activate="false">'..[[
<hslider minimum="0" maximum="100" onchange="speedChange_callback" id="1"/>
<label text="" style="* {margin-left: 300px;}"/>
</ui>
]]
ui=simUI.create(xml)
--speed=(minMaxSpeed[1]+minMaxSpeed[2])*0.5
speed=1
simUI.setSliderValue(ui,1,100*(speed-minMaxSpeed[1])/(minMaxSpeed[2]-minMaxSpeed[1]))
end
function sysCall_actuation()
result=sim.readProximitySensor(noseSensor) -- Read the proximity sensor
-- If we detected something, we set the backward mode:
if (result>0) then backUntilTime=sim.getSimulationTime()+4 end
if (backUntilTime<sim.getSimulationTime()) then
-- When in forward mode, we simply move forward at the desired speed
if(sim.getSimulationTime()%12<6) then
sim.setJointTargetVelocity(fleftMotor,speed*4)
sim.setJointTargetVelocity(bleftMotor,speed*4)
sim.setJointTargetVelocity(frightMotor,speed)
sim.setJointTargetVelocity(brightMotor,speed)
else
sim.setJointTargetVelocity(fleftMotor,speed)
sim.setJointTargetVelocity(bleftMotor,speed)
sim.setJointTargetVelocity(frightMotor,speed*4)
sim.setJointTargetVelocity(brightMotor,speed*4)
end
else
-- When in backward mode, we simply backup in a curve at reduced speed
sim.setJointTargetVelocity(fleftMotor,-speed/2)
sim.setJointTargetVelocity(bleftMotor,-speed/2)
sim.setJointTargetVelocity(frightMotor,-speed/8)
sim.setJointTargetVelocity(brightMotor,-speed/8)
end
end
function sysCall_cleanup()
simUI.destroy(ui)
end
添加脚本到 carRob 中,最后完成如图:
S 型路线行走:
当碰到障碍物后能够绕⾏: