V-rep机器人仿真软件学习笔记

常用的机器人仿真软件有哪些?为什么选择V-rep?
目前常用的机器人物理仿真软件有Gazebo、V-rep、Webots等,这三款都是开源软件,自己使用过前两种,Gazebo配合ROS使用功能十分强大,但是要在Linux系统下使用,会有些不方便;V-rep是一个跨平台的仿真软件,在windows和Linux下都可以很稳定的运行,而且软件体积较小。考虑到要在windows下使用仿真软件,以及V-rep方便的Python API接口和易用性,最终选择使用V-rep。
V-rep在自己项目的应用情况?
自己使用V-rep主要用来进行机械臂规划和控制方面算法的验证和仿真实验,主要用于以下两个方面:
利用V-rep的物理仿真环境,建立类似OpenAI Gym的交互环境,进行基于强化学习的机械臂规划和控制方法方面的仿真实验。
利用V-rep进行双臂机器人协作规划和控制算法研究
V-rep中内置了很多商用机械臂模型。如果使用Gazebo,可以搭配ROS Moveit!进行机械臂相关的仿真和实物规划与控制。

一、V-rep 基本知识
1.Tutorials: Building a clean model tutorial
1.1 Building the visible shapes
建议使用的CAD模型包含的triangles少于20000个,这样有利于快速计算
导入CAD模型后使用V-rep进一步简化
Automatic mesh division: [Menu bar --> Edit --> Grouping/Merging --> Divide selected shapes] 和[Menu bar --> Edit -> Grouping/Merging --> Merge selected shapes]
Extract the convex hull: [Menu bar --> Edit --> Morph selection into convex shapes]
Decimate the mesh: [Menu bar --> Edit --> Decimate selected shape...]
Remove the inside of the mesh: [Menu bar --> Edit --> Extract inside of selected shape]
可以再shape属性中查看模型的triangle数
将一个整体模型按照连接关系(关节)分割:
Automatic mesh division: [Menu bar --> Edit --> Grouping/merging --> Divide selected shapes].
Manual mesh division: 通过 triangle edit mode分割
1.2 Building the joints
使用Models/tools/Denavit-Hartenberg joint creator.ttm通过D-H参数创建关节
1.3 Building the dynamic shapes
1.4 Model definition
2.关于V-rep内置Lua脚本的学习

Lua中的脚本包括:

main script
child script
Tips:v-rep是默认打开19997端口

2.1 main script
main script主脚本相当于主函数,有且只有一个。主脚本由以下几个函数组成:

初始化函数sysCall_init:在仿真开始阶段执行一次
执行函数sysCall_actuation:在每个仿真回合都会执行,用于控制所有仿真对象的执行函数。有三个函数比较重要:
sim.launchThreadedChildScripts
sim.resumeThreads
sim.handleChildScripts
传感器函数sysCall_sensing:在每个仿真回合都会执行,用于控制所有传感器函数。有三个函数比较重要:
sim.resumeThreads
sim.handleChildScripts
恢复函数sysCall_cleanup:仅在仿真结束时执行一次,用于将仿真环境恢复为仿真开始前的状态。
2.2 child scripts
child script数量不限,与仿真场景中的物体相关联,被main scripts调用。child script与场景中物体的关联有以下优势:很好的可移植性和继承性、不同版本模型间没有冲突、和仿真循环很好的进行同步。

child script有两种类型 non-threaded child scripts(非线程子脚本) 和threaded child scripts(线程子脚本):


2.2.1 non-threaded child scripts
non-threaded child scripts包含一组阻塞函数,即每次被调用时将执行一些任务,然后返回控制权,如果没有返回则整个仿真一直停滞。每个仿真间隔中non-threaded child scripts将被main script调用两次:main script’s actuation and sensing 。
Tip:优先选择non-threaded child scripts来写子脚本。

non-threaded child scripts应当被分为4个函数来写:

初始化函数sysCall_init:仅在child script被调用时执行一次
执行函数sysCall_actuation:每个仿真循环都被调用
传感器函数sysCall_sensing:每个仿真循环都被调用
恢复函数sysCall_cleanup:仅在仿真结束被调用一次
2.2.2 threaded child scripts
threaded child scripts将会启用一个线程,线程的启用和恢复由主脚本的sim.launchThreadedChildScripts和sim.resumeThreads函数控制。当线程子脚本正在执行时,不会二次启动它。
Tips:threaded child scripts存在耗时的问题

threaded child scripts包括两个函数部分:

线程主部分函数sysCall_threadmain
恢复函数sysCall_cleanup
可以通过以下三个函数控制threaded child scripts的执行: sim.setThreadSwitchTiming、sim.setThreadAutomaticSwitch、sim.switchThread

2.3 Script simulation parameters
脚本仿真参数,在脚本中可以通过以下函数读取和设置仿真参数:

sim.getScriptSimulationParameter
sim.setScriptSimulationParameter
2.4 Customization scripts
自定义脚本主要用于对仿真场景的拓展,比如控制仿真地面的大小:


2.5 Callback functions
回调函数包括以下三种;

Dynamics callback functions:动态回调函数,通常被non-threaded child script或customization script使用。
Joint callback functions:关节回调函数,通常用于编写低级的控制程序(PID控制),每个仿真间隔将被调用10次以上。
The contact callback function:用于物理引擎检测障碍物,满足某个条件时触发contact callback function。
2.5 Script dialog
可以通过脚本对话框Script dialog:[Menu bar --> Tools --> Scripts]自行添加脚本文件。

2.6 Script execution order
脚本的执行顺序如下:

threaded child scripts are launched/resumed (order can be adjusted via sim.setThreadResumeLocation)
non-threaded child scripts are called
customization scripts are called
add-on scripts are called

3.遇到的Vrep中Python Api函数–>属于client端的远程API函数
simxCallScriptFunction: 调用Vrep中Lua脚本中的函数
simxStart:其中timeOutInMs参数为正数时,表示初次连接等待时间,而函数执行的阻塞时间为默认5000ms;当该参数为负数时,正数部分为函数执行的阻塞时间,而初次连接的等待时间为5000ms。
simxStartSimulation:启动仿真。vrep端可以不用提前启动,而通过该函数来启动仿真。
simxGetObjectHandle:获取物体句柄函数,物体名字后需要添加“#”,因为vrep默认的取名风格objectName#x。
4.遇到的Vrep中Lua Api函数–>属于server端的常规API函数,在Regular API目录下查找API文档
单位使用说明:所有API的单位都是米、千克、秒和弧度,或者它们的组合(除非另有明确说明)。用户界面的单位是米、千克、秒和度。

一般函数:

sim.getObjectName:获取物体名称,得到的名称带有下标(e.g. “myRobot#42”)
sim.getNameSuffix:从带有下标的物体名称中取出下标和名称前部分
sim.getObjectHandle:获取物体句柄
sim.getJointPosition:获取关节位置
sim.displayDialog:显示消息对话框
sim.getObjectMatrix:获取物体的位姿矩阵,以table形式返回,表中元素数为12(类似作用的函数有:sim.getObjectOrientation,sim.getObjectPosition)
sim.setObjectMatrix: 设置物体的变换矩阵
sim.getCollectionHandle:根据集合句柄的名称获取集合句柄
sim.getObjectSpecialProperty:获取场景对象的特殊属性,:collidable、measurable.etc
sim.boolOr32:在两个数字之间执行32位布尔或运算
sim.addDrawingObject:添加将在场景中显示的绘图对象
sim.setJointPosition:设置关节的固有位置
sim.addDrawingObjectItem:向之前的绘图对象插入新的属性,绘图主函数
getObjectAssociatedWithScript:获取脚本所对应的对象的句柄
sim.getSimulationState:获取当前的仿真状态
sim.setThreadAutomaticSwitch:是否允许控制线程进行自动切换
sim.switchThread:允许指定当前线程切换到另一个线程的确切时刻
sim.clearStringSignal:清除字符串信号
路径规划相关函数:

sim.getIkGroupHandle:获取逆运动学解算IK组的句柄
sim.getConfigForTipPose:随机搜索与给定末端执行器位置/方向匹配的机械手关节配置,若存在则返回一组关节角。通过返回值判断目标位置对应的末端执行器是否存在且是否产生碰撞。
sim.generateIkPath:生成一条直线(即笛卡尔空间中的最短路径)驱动机器人从当前配置到目标配置的路径。
sim.setStringSignal: 设置字符串信号的值
sim.getStringSignal:获取字符串信号的值
sim.packFloatTable:将浮点数表打包成字符串
常见的常量:

sim.objectspecialproperty_collidable:物体可碰撞属性
OMPL API:
目录:V-REP API framework–>Other Interfaces–>OMPL Plugin API reference或者More details here.

使用OMPL进行运动规划的一般步骤
创建任务–>选定规划算法–>设置状态空间–>设置碰撞对–>设置开始和目标状态–>计算出一条或多条路径–>销毁创建的任务

常见函数

simOMPL.createTask:创建任务
simOMPL.setAlgorithm:选定规划算法
simOMPL.createStateSpace:为每个关节创建状态空间
simOMPL.setStateSpace:设置整个任务的状态空间
simOMPL.setCollisionPairs:设置碰撞对
simOMPL.setStartState/simOMPL.setGoalState:设置起始和目标状态
simOMPL.addGoalState:添加目标状态,但不清除以前设置的目标状态(如果有)。
simOMPL.setStateValidityCheckingResolution:设置状态有效性检验的分辨率,表示为状态空间范围的分数
simOMPL.compute:使用OMPL找到此运动规划任务的解决方案。
OMPL运动规划库中常见的规划器介绍
规划器非常多,根据不同的用途和要求进行选择。中文介绍参考网站:https://zhenshenglee.github.io/2016/09/03/160903-ompl1/

5.Vrep中子脚本线程执行
Vrep中thread script的执行是以协程模拟多线程的方式进行的,即执行多线程过程分为很多个时间片,自动在不同的线程中切换,实现多线程的效果。所以在实际使用thread script时,要合理控制线程切换,使程序执行时间合理。
在目录:Writing code in and around V-REP–>Embedded scripts–>Simulation scripts–>The main and child scripts–>Child scripts
参考博客,线程切换控制的常用函数:

sim.setThreadAutomaticSw

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值