Vrep的安装与小车建模

准备工作

任务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 型路线行走:
在这里插入图片描述
当碰到障碍物后能够绕⾏:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

仿真视频

传送门

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章