一、任务:智能小车平台建模
(1)参考⽂档中Tutorial - BubbleRob tutorial 部分,学习:
        a、⻋⾝与轮⼦物理模型的设计
       b、 动⼒学模型等参数的设置
        c、传感器的添加与使⽤
        d、驱动关节的设计与控制
       e 、控制脚本的编写
     
(2)实现要求:
       a、 搭建⼀个四轮⼩⻋,⼩⻋搭载⼀个单⽬彩⾊摄像头
        b、尺⼨(如⻓宽⾼)及底盘参数(如速度限制)可参考DJI RoboMaster S1进⾏设计
        https://www.dji.com/cn/robomaster-s1/specs
        c、不采⽤⻨克纳姆轮
        d、编写简单脚本使得⼩⻋能呈S型路线⾏⾛,当碰到障碍物后能够绕⾏

二、设计内容

1. 总体设计

机器人由长方体车身和四个轮子、 传感器、 彩色摄像头组成, 两个前轮主要负责转向和
动力输出,两个后轮作为从动轮, 传感器负责检测前方障碍物并绕行。
        以下是 MyBot 机器人的总体设计层次图。 其中 FLwheel_Steering 和 FRwheel_Steering 为
前轮; RLwheel_Motor 和 RRwheel_Motor 为后轮; Nose_Sensor 为传感器,搭载单目彩色摄
像头; AutoFittingCamera 为自适应摄像头,用于拍摄机器人运动时的姿态。

1 机器人总体设计

2. 车身构建

我们使用 Cuboid 作为车身主体, 为避免主体与其他部件冲突, 我们需要设置其 Object
属性,关闭 Collidable 等属性。

2 车身 Object 属性

同时,我们需要关闭 Local Respondable Mask 属性。

3 车身 Object 属性

3. 车轮构建

我们将机器人的车轮划分为两组:前轮组(Front)和后轮组(Rear) 。 前轮组负责转向
和动力,后轮组则为从动轮。
        由于我们希望前轮组既负责转向功能,又负责动力输出。为实现这两个功能,我们需要
两个转动关节,其中一转动关节竖向放置,用于控制转向角度,另一转动关节横向放置,用
于输出动力。


4 转向轮示意图

以下是 MyBot 的各车轮的层次图。注意到,以前左轮(FLwheel)为例, 其由竖向关节
(Steering)和横向关机(Motor)构成;与之不同的是,后左轮(RLwheel)则由横向关节
(Motor)构成。

以下是机器人的车轮拆解示意图(已设置各部件的可视状况)。拥有两个转动关节的即
为前轮组,仅拥有一个转动关节的为后轮组。

4. 直线运动

为实现直线运动,我们需要编写脚本。而在这里, 我们使用 Threaded Child Script 进行
脚本的填写,其涉及到一个很重要的函数,名为 sysCall_threadmain,这是一个需要用户填
充自定义代码的函数模板,模板如下。

在 sysCall_threadmain 函数模板中,我们需要将变量的初始化放置在主循环之外,机器
人的运动逻辑放置在主循环之中,这是需要注意的地方。
        现在,我们进行直线运动的脚本编写。 我们知道, 在前面的车轮构建部分中,我们添加
了两个前进电机。所以, 我们可通过 setJointTargetVelocity 设置这两个前进电机同样的运行
速度,实现机器人的直线运动。
        为此, 我们实现了 motor 工具函数,该函数用于两个前进电机的动力设置,其相关代码
如下。

在上述脚本中,我们通过 getObjectHandle 获取两个前进电机的实例。在 motor 工具函
数中,我们使用 setJointTargetVelocity 设置两个电机同样的运行速度。由于我们所添加的脚
本是 Threaded 类型,我们需要在 while 主循环内,执行了 motor(0.8) 命令。 按下模拟按钮
后,我们即可观察到机器人进行直线运动。
        下面是直线运动的全部脚本代码,后续由于篇幅限制,只贴出关键部分的代码。

5. S 型运动

在实现机器人的直线运动后,我们需要在其基础上, 使得机器人能够以 S 型路线前进。
我们的思想很简单:在电机启动的情况下,控制转向角度,使其按照余弦函数变化,即可控
制机器人的前进路线为 S 型路线。
        我们使用的是 Ackermann 转向运动学模型。根据该运动学模型, 车辆在转弯时,其两个
转向轮的转向角度是不一致的,但其角度可由数理公式推导而出。为此, 我们实现了 steer
转向工具函数,实现两个转向轮能够按照模型进行不同角度的转向。

在 steer 工具函数中, 我们为其传入 d 和 l 参数,它们分别与左右轮间距和前后轮间距
有关,是转向运动学模型所必需的参数。 我们通过 getObjectHandle 获取两个转向关节的实
例,通过 setJointTargetPosition 控制两个转向关节的角度,进而控制机器人的前进方向。

6. 传感器

我们在 Body 添加 Proximity Sensor,用于搭载单目彩色摄像头,用于避障算法的障碍物
检测。
        下面是 Nose Sensor 的 Volume 的各项属性,我们将 Volume Type 设置为 Disc,并配置
其的角度和半径等参数。

在设置好 Nose Sensor 的属性后,我们为其添加单目彩色摄像头,并设置好摄像头属性,
最后添加 Floating View 用于显示摄像头的视野。

7. 简单避障

我们使用这样的避障算法:当机器人在往左边运动的过程中,探测到了障碍物,则将转
向角度设置为往右边运动的最大角度,该操作持续一段时间,直至无探测到障碍物或达到阈值时间,随后设置转向角度为往左边运动的最大角度,继续原有的运动。
        我们使用 Nose_Sensor 作为障碍物的探测感应器,通过获取其探测结果,来决定是否采
取避障措施。

若探测到障碍物,设置避障操作的阈值时间,同时我们根据当前的运动方向,设置避障
所需要的最大转动角度和方向。

在超出阈值时间后,即机器人已远离障碍物后,我们重新设置机器人的转动方向为原有
的运动方向,且转动角度设置为最大转动角度。

若机器人在前进过程中,未探测到障碍物,则其转动角度一直按余弦函数变化。

三、代码

function sysCall_threadmain()-- Initialization-- Get FL Steering Motor.FLwheel_Steering = sim.getObjectHandle('MyBot_FLwheel_Steering')-- Get FR Steering Motor.FRwheel_Steering = sim.getObjectHandle('MyBot_FRwheel_Steering')-- Get FL Motor.FLwheel_Motor = sim.getObjectHandle('MyBot_FLwheel_Motor')-- Get FR Motor.FRwheel_Motor = sim.getObjectHandle('MyBot_FRwheel_Motor')-- Get Sensing Nose.Nose_Sensor = sim.getObjectHandle('MyBot_Nose_Sensor')-- d = 0.2 * distance (cm) between left and right wheels.-- l = 0.2 * distance (cm) between front and rear wheels.d = 28 * 0.2l = 30 * 0.2-- It represents the abs value of the max steering angle.steeringAngleAbs = 30-- It's used to generate cos-like angle sequence.tick = 0lock = 0-- Angle to steer.-- +: left-- -: rightsteeringAngle = -steeringAngleAbs-- It's used to control the total time of avoiding.avoidUntilTime = 0-- Steer Tool Functionsteer = function(angle)-- Conversionangle = angle * math.pi / 180leftAngle = math.atan(l / (-d + l / math.tan(angle)))rightAngle = math.atan(l / (d + l / math.tan(angle)))sim.setJointTargetPosition(FLwheel_Steering, leftAngle)sim.setJointTargetPosition(FRwheel_Steering, rightAngle)end-- Motor Tool Functionmotor = function(speed)sim.setJointTargetVelocity(FLwheel_Motor, speed)sim.setJointTargetVelocity(FRwheel_Motor, speed)end-- The Main Loopwhile sim.getSimulationState() ~= sim.simulation_advancing_abouttostop doresult = sim.readProximitySensor(Nose_Sensor)if (result > 0) thenavoidUntilTime = sim.getSimulationTime() + 5endif (avoidUntilTime < sim.getSimulationTime()) thenif (lock == 1) thenlock = 0if steeringAngle > 0 thensteeringAngle = steeringAngleAbselsesteeringAngle = -steeringAngleAbsend-- Restore the corresponding tick.tick = math.acos(steeringAngle / steeringAngleAbs) / 0.05endtick = tick + 0.1steeringAngle = steeringAngleAbs * math.cos(tick * 0.05)-- Normal speed.motor(0.5)elseif (lock == 0) thenlock = 1if steeringAngle > 0 then-- When obstacle is in the left side, turn right.steeringAngle = -steeringAngleAbselse-- When obstacle is in the right side, turn left.steeringAngle = steeringAngleAbsend-- Speed up when avoids obstacle.motor(1)endend-- Steer for specific angle.steer(steeringAngle)-- Since this script is threaded, don't waste time here.sim.switchThread()end
end

vrep小车模型搭建相关推荐

  1. 阿克曼小车urdf模型搭建与gazebo仿真

    阿克曼小车urdf模型搭建与gazebo仿真 参考: 一.urdf模型 1.urdf 模型搭建 1.1 link标签 1.2 joint相关 1.3 偏移关系讲解 2. xacro描述机器人 3. r ...

  2. Gazebo构建小车模型并通过ROS控制

    Gazebo构建小车模型并通过ROS控制 介绍 编写车子的URDF文件 编写控制小车移动的插件(与ROS交互) 结尾 介绍  突然想试试Gazebo这款仿真软件,因为它可以让你在任何时候都有机器人玩. ...

  3. Gazebo仿真平台模型搭建与修改

    ROS进阶教程(一)Gazebo仿真平台模型搭建与修改 文件讲解 Models 文件 World文件 Launch文件 模型编辑 可视化操作 配置文件编辑 仿真操作流程 完成model建模 world ...

  4. 倒立摆的simulink模型搭建

    倒立摆的simulink模型搭建 1.倒立摆基本背景: 倒立摆,Inverted Pendulum ,是典型的多变量.高阶次 ,非线性.强耦合.自然不稳定系统.倒立摆系统的稳定控制是控制理论中的典型问 ...

  5. ROS | Gazebo仿真—阿克曼(Ackermann)四轮小车模型

    ROS | Gazebo仿真-阿克曼(Ackermann)四轮小车模型 1. 仿真描述 2. Gazebo简介 2.1 Gazebo的典型用途 2.2 Gazebo的主要特点 3. ros_contr ...

  6. 【教程一】基于Jackal底盘模型搭建ROS Gazebo仿真

    一.创作背景 现在到网上搜索"Gazebo小车仿真"这个关键词,出来的内容要么就是Turtlebot系列或者Husky系列,要么就是从零搭建自己的小车模型...那么如果你既不想使用 ...

  7. Webots 机器人仿真平台(五) 新建四轮小车模型

    新建机器人模型 1 添加机器人本体 1.1 添加Body 1.2 添加机器人轮子 2 添加距离传感器 3 小结 参考资料 下图为我们这篇博客创建的小车效果,接下来我们一步一步的实现在webots中搭建 ...

  8. (ROS)差分轮式机械臂机器人(一)模型搭建

    模型搭建 文章目录 源码地址 ROS版本:noetic 文件结构 创建功能包 编写模型描述文件.xacro 基本语法 描述文件为 显示机器人模型 显示坐标系 保存配置 每次打开rviz并加载上次保存 ...

  9. 从零开始仿真ROS小车(二)在gazebo中显示小车模型

    一.实现过程 1. 从零开始仿真ROS小车(一)urdf模型+rviz可视化 2.从零开始仿真ROS小车(二)在gazebo中显示小车模型 优化xacro文件,并为模型添加碰撞参数.惯性矩阵.颜色,在 ...

  10. Darknet_Yolov3模型搭建

    Darknet_Yolov3模型搭建 YOLO(You only look once)是目前流行的目标检测模型之一,目前最新已经发展到V3版本了,在业界的应用也很广泛.YOLO的特点就是"快 ...

最新文章

  1. 和12岁小同志搞创客开发:手撕代码,做一款节拍电子鼓
  2. 2020年涨薪26-30%,能实现吗?18%数据科学家是这么期待的
  3. CCS中各个项目文件的作用
  4. 生产上第一使用线程池后的总结与反思
  5. Python学习笔记-模块介绍
  6. Codeforces 947E Perpetual Subtraction (线性代数、矩阵对角化、DP)
  7. 网友力荐教子名言 只有50句却能改变儿女一生
  8. 程序员求职面试丨面试必备之终极指导篇,掌握这些,面试不再困难!
  9. 从os.cpus()来分析nodejs源码结构
  10. 最新pvz服务器补偿码,阴阳师:补偿来了!大量活动导致服务器崩溃,现已修复且下发补偿...
  11. LINUX下载编译libgsm
  12. Java编写HTTP请求发送XML报文数据
  13. 浅谈VMD---变分模态分解
  14. 证券市场的法律法规体系
  15. java短信接口开发完整项目_java项目接入第三方短信接口
  16. oracle 先决条件失败,linux安装oracle先决条件检查全部失败
  17. JVM内存和垃圾回收-02.类加载子系统
  18. CorelDRAW2023最新版本图像设计软件
  19. 特斯拉被曝低级漏洞:用树莓派DIY车钥匙,开锁仅需90秒
  20. javaweb学生竞赛管理系统

热门文章

  1. MNE example《Motor imagery decoding from EEG data using the Common Spatial Pattern (CSP)》
  2. Error in cool_function[1] : object of type ‘closure‘ is not subsettable
  3. 企业仓库管理软件免费版要把处理好三个问题 利用凌云仓库管理软件免费版的智能补货功能可以快速的指定采购策略,这里面就需要及时了解每一张采购订单的执行情况,不但要防止遗漏订单情况的发生,更要防止情绪化采购
  4. 通信原理及系统系列3—— 基于卷积编码的2ASK通信系统设计(非相干解调)
  5. amr转换成mp3 java_微信开发-将amr格式转换为mp3格式
  6. 有道词典java下载电脑版下载不了_网易有道词典电脑版下载
  7. 2020年注册电气工程师基础考试大纲:专业基础(供配电、发输变电相同)
  8. 驱动精灵w8ndows xp sp2,爱普生Epson TM-T90打印机驱动官方正式版下载,适用于winxp,winvista,win7,win8,win10-驱动精灵...
  9. 计算机组成原理与汇编语言设计,计算机组成原理与汇编语言网络教学整体设计方案...
  10. 5.1.2全景声音箱摆位_杜比全景声7.1.2和7.1.4音箱摆位有什么区别