四、基于Dummy和path的路径规划

4.1 Dummy和path

  • Path用来自定义各种运动路径,从Path上我们可以给定某一个时刻机器人运动到某一点的位置以及其姿态,定义机器人在整个路径中每一时刻的运动过程,V-REP中默认的Path是通过给定一些关键的控制点,并在这些控制点中间采用贝塞尔曲线插值来得到光滑路径的。Path在创建以后,用户也可以通过添加自定义的控制点和设定它的属性来定义不同形状的路径,包括在三维空间中的运动。
  • Dummy是一种带有姿态信息的虚拟“质点”,Dummy可以沿着Path向前运动,实时获取当前时刻在Path上的位置和姿态,作为路径上的一个“领航者”。Dummy可以绑定到机械臂的末端上作为一个“引导点”.
  • 在V-REP中,使用鼠标右键->Add->…来快速新建Dummy和Path。如果想要Dummy跟随某一条Path运动,首先要将这个Dummy“绑定”到对应的Path下面,使用鼠标选中并将Dummy拉到Path的子目录下.
  • 在构建完Dummy和Path以后,需要为Dummy创建一个进程式的Child script来获取Dummy的运动信息。
function sysCall_threadmain()dummy_guider_handle = sim.getObjectHandle('DummyGuider')path_handle = sim.getObjectHandle('Path')print('start follow path')sim.followPath(dummy_guider_handle, path_handle, 3, 0, 0.1, 1)
end
  • 在仿真时,这个child script会启动一个新的进程,其中followpath指的是dummy跟随哪一个path运动,字3表示同时获取Path的位置和姿态信息(1表示只获取位置,2表示只获取姿态),0.1表示Dummy会以0.1m/s的速度前进,加速度为1
  • 在YouBot的Child script中调用sim.getObjectPosition和sim.getObjectOrientation两个函数来实时获取Dummy的位置和姿态。-1表示获取的是绝对信息,即在世界坐标系下的位置和姿态信息.
dummy_guider_position = sim.getObjectPosition(dummy_guider_handle, -1)
dummy_guider_orientation = sim.getObjectOrientation(dummy_guider_handle, -1)
  • 获取到了Dummy的位置和姿态以后,以Dummy的运动位置和姿态作YouBot机器人中心点运动的“领航者”,通过获取Dummy的速度来得到YouBot机器人的中心点目标运动速度。在本文的Circle型Path中,中心点的运动状态可以计算为:
-- Path 1: one circle
vx = 0
vy = dummy_guider_velocity
omega = dummy_guider_velocity / circle_path_R
  • 我们建立的YouBot运动学模型是基于YouBot机器人自身的局部坐标系建立的,而非全局世界坐标系,所以Dummy的运动状态要转换为YouBot机器人的局部坐标系中的运动状态才能使用,在这里,YouBot随Circle型路径运动的线速度为0.1m/s,在YouBot机器人的局部坐标系中,相当于vy = 0.1m/s,而vx = 0。

4.2 圆形路径规划

  • 跟path绑定的dummy点设置在path的圆心,dummy有自己的child script。而youbot机器人的dummy_bot设置在底盘的中心点
function sysCall_threadmain()--获取dummy和path的句柄,这个句柄就是指代这个物体自己dummy_guider_handle = sim.getObjectHandle('DummyGuider')path_handle = sim.getObjectHandle('Path')print('start follow path')sim.followPath(dummy_guider_handle, path_handle, 3, 0, 0.1, 1)
end

  • 机器人脚本初始化
function sysCall_init()-- 机器人、机器人dummy点、领航的dummy点you_bot = sim.getObjectHandle('youBot')you_bot_dummy = sim.getObjectHandle('youBotDummy')dummy_guider_handle = sim.getObjectHandle('DummyGuider')-- 轮子初始值wheel_joints = {-1,-1,-1,-1} -- front left, rear left, rear right, front rightwheel_joints[1] = sim.getObjectHandle('rollingJoint_fr')wheel_joints[2] = sim.getObjectHandle('rollingJoint_fl')wheel_joints[3] = sim.getObjectHandle('rollingJoint_rl')wheel_joints[4] = sim.getObjectHandle('rollingJoint_rr')-- 设置五个关节臂的初始值arm_joints = {-1,-1,-1,-1,-1} -- set default valuesfor i=0,4,1 doarm_joints[i+1] = sim.getObjectHandle('youBotArmJoint'..i)end-- 五个关节臂的目标初始值desired_joint_angles = {180*math.pi/180, 30.91*math.pi/180, 52.42*math.pi/180, 72.68*math.pi/180, 0}-- 关节臂到达目标初始值for i = 1,5,1 dosim.setJointPosition(arm_joints[i], desired_joint_angles[i])end-- 最大速度max_joint_velocity = 100*math.pi/180omega_1 = 0omega_2 = 0omega_3 = 0omega_4 = 0-- youBot size parameterswheel_R = 0.05a = 0.165b = 0.228dummy_guider_position = {0, 0, 0}dummy_guider_orientation = {0, 0, 0}circle_path_R = 1target_pos = {0, 0, 0}-- 初始化机器人youbot_init_orientation = {-1.57, 0, -1.57}sim.setObjectOrientation(you_bot, -1, youbot_init_orientation)-- 为圆形路径做初始化youbot_init_position = {1, 0, 9.5341e-02}
end
  • 机器人控制
-- Control joints of YouBot
function sysCall_actuation()-- 保持五个关节臂的运动状态for i = 1,5,1 dosim.setJointPosition(arm_joints[i], desired_joint_angles[i])endsimu_time = sim.getSimulationTime()-- dummy的速度dummy_guider_velocity = 0.1-- Path 1: one circlevx = 0vy = dummy_guider_velocityomega = dummy_guider_velocity / circle_path_R center_velocity = {vx, vy, omega}chassisInverseKinematics(center_velocity[1], center_velocity[2], center_velocity[3], wheel_R, a, b)-- print('time=', simu_time, 'target_pos[1]=', target_pos[1], 'center_velocity=', center_velocity)-- Apply the desired wheel velocitiessim.setJointTargetVelocity(wheel_joints[1], v_wheel_1)sim.setJointTargetVelocity(wheel_joints[2], v_wheel_2)sim.setJointTargetVelocity(wheel_joints[3], v_wheel_3)sim.setJointTargetVelocity(wheel_joints[4], v_wheel_4)
end
  • 在八字形路径下,机器人要根据dummy点的位置,来变换角速度的方向
    -- Path 2: two circlesvx = 0vy = dummy_guider_velocity_2target_pos_2  = sim.getObjectPosition(dummy_guider_handle_2, -1)if target_pos_2[1] > 0 thenomega = dummy_guider_velocity_2 / circle_path_R elseomega = -dummy_guider_velocity_2 / circle_path_R end

五、机械臂轨迹规划

5.1 Dummy在path上运动

  • 增加一个circle path ,可以点击item shift,利用鼠标改变整个path的空间位置和姿态。
  • 选中path后,点击path edit可以编辑path中的控制点,可以新增控制点、移动原有控制点,改变控制点的位置和姿态。

  • 设置完path后,可以新增一个dummy点,将dummy点拖拽到path下方,为dummy点创建一个child script,设置dummy随这个path而运动。
function sysCall_threadmain()dummy_handle = sim.getObjectHandle('Dummy')path_handle = sim.getObjectHandle('Path0')print('start follow path')sim.followPath(dummy_handle, path_handle, 1, 0, 0.1, 1)
end


5.2 使用vrep自带的逆运动学模块

  • V-REP自带的逆运动学(IK)模块不仅可以支持官方提供的模型,也支持用户自己设计的机器人模型,所以用户在设计好自己的机器人模型以后可以导入到V-REP中,定义好机器人模型连杆和关节的约束关系,构建好机器人模型的“树结构”,然后就可以使用V-REP自带的逆运动学模块了。在V-REP官方提供的模型当中,许多需要使用IK模块的机器人模型的关节已经被设定为IK模式了,例如YouBot机器人,因此我们可以直接使用。但是对于一个新设计的机器人模型来说,V-REP逆运动学模块的使用过程大致可以分为以下6个步骤:
  1. 将所有参与逆运动学计算的关节设定为IK模式;

  2. 添加target dummy、tip dummy;

  3. 添加Path,并让target dummy跟随Path运动;

  4. Link target dummy 和 tip dummy;

  5. 添加IK group和IK element;

  6. 添加script,开始仿真。

Vrep学习笔记(二)相关推荐

  1. qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7851 ...

  2. [转载]dorado学习笔记(二)

    原文地址:dorado学习笔记(二)作者:傻掛 ·isFirst, isLast在什么情况下使用?在遍历dataset的时候会用到 ·dorado执行的顺序,首先由jsp发送请求,调用相关的ViewM ...

  3. PyTorch学习笔记(二)——回归

    PyTorch学习笔记(二)--回归 本文主要是用PyTorch来实现一个简单的回归任务. 编辑器:spyder 1.引入相应的包及生成伪数据 import torch import torch.nn ...

  4. tensorflow学习笔记二——建立一个简单的神经网络拟合二次函数

    tensorflow学习笔记二--建立一个简单的神经网络 2016-09-23 16:04 2973人阅读 评论(2) 收藏 举报  分类: tensorflow(4)  目录(?)[+] 本笔记目的 ...

  5. V-rep学习笔记:机器人模型创建2—添加关节

    下面接着之前经过简化并调整好视觉效果的模型继续工作流,为了使模型能受控制运动起来必须在合适的位置上添加相应的运动副/关节.一般情况下我们可以查阅手册或根据设计图纸获得这些关节的准确位置和姿态,知道这些 ...

  6. Scapy学习笔记二

    Scapy学习笔记二 Scapy Sniffer的用法: http://blog.csdn.net/qwertyupoiuytr/article/details/54670489 Scapy Snif ...

  7. Ethernet/IP 学习笔记二

    Ethernet/IP 学习笔记二 原文链接:http://wiki.mbalib.com/wiki/Ethernet/IP 1.通信模式 不同于源/目的通信模式,EtherNet/IP 采用生产/消 ...

  8. Java学习笔记二:数据类型

    Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...

  9. 吴恩达《机器学习》学习笔记二——单变量线性回归

    吴恩达<机器学习>学习笔记二--单变量线性回归 一. 模型描述 二. 代价函数 1.代价函数和目标函数的引出 2.代价函数的理解(单变量) 3.代价函数的理解(两个参数) 三. 梯度下降- ...

  10. ASP.NET MVC 2 学习笔记二: 表单的灵活提交

    ASP.NET MVC 2 学习笔记二:  表单的灵活提交 前面说到有做到公司内部的一个请假系统,用的是ASP.NET MVC 2+Entity Framework.虽然EF(Entity Frame ...

最新文章

  1. matlab计算位温,大气物理学复习资料
  2. 大学学好高数的爆炸性意义!
  3. 第四课 脱壳必备知识要点及方法
  4. Learning to Rank算法介绍:GBRank
  5. 【转】使用Mysql-connector-c++插入数据时乱码解决
  6. 数据结构试卷及答案(二)
  7. Project Tungsten:将Apache Spark更接近裸机
  8. 【ELM预测】基于蝴蝶算法优化极限学习机预测附matlab代码
  9. Cyclone IV系列FPGA串口远程烧写详解
  10. 计算机系统运行太慢,电脑系统启动变慢是什么原因造成的以及解决方法
  11. 编译原理_P1003
  12. 罗素156句名言:人之所以有道德,是因为受到的诱惑还不够大
  13. ListView--QQ联系人样式
  14. 讨伐Cucumber行为驱动
  15. JKS 密钥库使用专用格式。建议使用 “xxx“ 迁移到行业标准格式 PKCS12
  16. CVPR 2022 Oral|港中文开源PoseC3D:基于3D-CNN的骨骼动作识别框架
  17. 斐讯n1做服务器性能,斐讯N1:系统配置优化
  18. 【论文笔记】:CornerNet: Detecting Objects as Paired Keypoints
  19. 【交通数据(1)——加州高速路网PeMS交通数据】
  20. 单词接龙acwing

热门文章

  1. 利用手机基站获取位置
  2. 现浇板弹性计算还是塑性计算_双向板按弹性方法还是按塑性方法计算
  3. IEC 61131 标准系列
  4. java多个点求连线_实现简单的粒子连线
  5. 台式计算机如何连接投影仪,台式机怎么接投影仪 台式机接投影仪方法【详解】...
  6. linux下ssh下载命令,SSH 登录工具常用命令
  7. 【转自52v6】教你如何走IPv6下载百…
  8. ARM 汇编基础教程系列
  9. 国内免费CMS系统大全
  10. 冰点还原离线激活_冰点还原密钥,小编告诉你如何激活冰点还原