解析c++版本
API官网
v-repAPI是安类堆放的,需要和什么相关的API,只需到与之相关的API处寻找即可。
各种对象类型
解释几个难懂的:
sim.object_dummy_type--亚节点(虚拟对象)
虚拟对象的作用:
详情查看文档的----entities--->Dummies
对象类型
sim.object_shape_type //枚举值为0
sim.object_joint_type //枚举值为1,以下递增
sim.object_graph_type
sim.object_camera_type
sim.object_light_type
sim.object_dummy_type
sim.object_proximitysensor_type
sim.object_octree_type
sim.object_pointcloud_type
sim.object_visionsensor_type
sim.object_forcesensor_type
1. `sim.object_shape_type`:表示基于形状的对象类型,例如立方体、球体等。
2. `sim.object_joint_type`:表示关节类型的对象,例如旋转关节、移动关节等。
3. `sim.object_graph_type`:表示图形对象类型,例如模型、点云等。
4. `sim.object_camera_type`:表示摄像头类型的对象,例如透视相机、立体相机等。
5. `sim.object_light_type`:表示光源类型的对象,例如点光源、聚光灯等。
6. `sim.object_dummy_type`:表示虚拟对象类型,例如坐标系。
7. `sim.object_proximitysensor_type`:表示接近传感器类型的对象,用于检测物体的距离和方向。
8. `sim.object_octree_type`:表示八叉树类型的对象,用于高效地存储和查询大型数据结构。
9. `sim.object_pointcloud_type`:表示点云类型的对象,用于表示 3D 点云数据。
10. `sim.object_visionsensor_type`:表示视觉传感器类型的对象,例如相机、激光雷达等。
11. `sim.object_forcesensor_type`:表示力传感器类型的对象,用于检测物体受到的力和力矩。
场景
simGetSelectedID()
获取被选中场景的ID
simGetSceneCount()
获取场景的数量
simSaveScene
保存场景。
simCloseScene
关闭场景
simLoadScene
下载以及保存的场景文件。
仿真
simGetSimulationState()
获取仿真状态;
模型
simSaveModel
保存模型。
simLoadModel
加载已经保存过的模型。
文件
simDoesFileExist
判断文件是否存在。
形状
simImportShape
导入一个形状。
网格---mesh
simImportMesh
导入一个已经存在网格。
simExportMesh
保存一个网格到文件。
纹理
simCreateTexture
创建一个平面形状,然后为这个形状添加纹理。
句柄
simGetObject(path,)
path:对象的路径;
注意:这个接口一定要对象的路径;
simGetObjectHandle(name,...)
这个是老版本的,只需要一个名字。
simGetObjects
获取场景中指定类型对象的索引。
一般用在循环中。
simGetObjectsInTree(int treebaseHandle)
int* simGetObjectsInTree(int treeBaseHandle, int objectType, int options, int* objectCount)
从一个节点开始,获取这个节点以及之下的子对象的指定类型的句柄,并且可以进行排除获取。
treeBaseHandle:开始检索的树的根;
objectType:
共11种类型,枚举值为:0---10
sim_object_shape_type:
哪些对象属于形状呢?
整个机器人,link--连杆,各种形状--rectangle矩形,Cykinder圆柱等;
options:
1,
a:如果第一个参数不是sim_handle_scene,返回的数组句柄中,排除树的根节点,即使是目标对象;
b:如果第一个参数是sim_handle_scene,那么这个1就没有作用,会返回场景中所有对象的句柄。
sim_handle_scene--1---返回所有句柄。
2:
a:只返回第一级子节点对象的句柄;
b:如果第一个参数是sim_handle_scene,那么只会返回没有父亲节点的对象的句柄。
sim_handle_scene---2----没有父亲节点的对象
因为没有joint对象是没有父亲节点的,所以返回为空:
有两个形状对象没有父亲节点:
什么是tree:
v-rep中的对象以及对象中的内部对象,都是以树的方式组织起来的。
simGetObjectFromUid
根据对象唯一标识符获取对象句柄。
simIsHandle
检查常规对象句柄是否仍然有效。
一般对象被销毁时 (例如,以编程方式或通过用户界面),则其相关句柄不再有效 并在使用时触发错误。使用此函数可避免触发错误。
simGetScriptHandleEx
第一个参数,一般都应该是子脚本,枚举定义为1。
所以第二个参数,一般可为-1。
第三个, Can be nullptr.
simGetCollectionObjects
simGetReferencedHandles
simSetReferencedHandles
获取字符串参数
simGetStringParam
只有一个参数:
0,获取执行的coppeliasim执行所在的路径;
获取脚本文件对象的相关参数
simGetScriptStringParam
第二个参数有以下几种枚举值:
sim.scriptstringparam_description---0--String attribute, describes the script
sim.scriptstringparam_name------1------String attribute
sim.scriptstringparam_text--------2-------String attribute
sim.scriptstringparam_textext------3------String attribute
simGetScriptInt32Param
第二个参数有很多值,用的比较多的可能就是:
sim.scriptintparam_objecthandle---获取脚本对象的句柄。
获取标识对象本身的参数
simReadCustomBlock(handle,param,len)
注意:这个接口返回的指针中的字符串没有后缀'\0',所以如果不做处理直接读取其中的字符串,字符串后面部分会出现乱码。
所以需要:
char* param_val=simReadCustomBlock(handle,"TCP",&len)
std::string name=std::string(param_val,len);
simWriteCustomBlock()
写入参数。
对象唯一标识符
名称
simGetObjectName(int handle)
获取对象名称。
simGetObjectAlias(handle,option)
这个和simGetObjectName都可以用来获取对象的名称;只是这个是新版本中的接口;
option默认值为-1,表示仅获取名称,不加任何修饰。
0,如果这棵树下不存同名的对象,同-1;如果存在同名的对象,会以数组的方式返回对象名称和下标;
3,如果这棵树下存在相同对象的名称,返回名称和句柄;否则只需要返回名称;
4,返回名称和句柄;
1,2,用于获取对象的路径;
simSetObjectAlias--设置对象的别名
第三个参数虽然有默认值,但是调用的时候必须设置。
碰撞
simCheckCollision
检查两个实体是否发生碰撞。
simCheckCollisionEx
检查两个实体是否发生碰撞,返回两个实体之间的所有交集。如果实体是对象,则实体的可碰撞标志将被覆盖。
距离
simCheckDistance
检查两个图元之间的最小距离。
如果实体是对象,则实体的可测量标志将被覆盖。如果实体都是相同的集合(即具有相同的集合句柄),则不会根据它们检查相同的对象
路径
simGetExecutablePath()
获取v-rep可执行文件所在的路径。
获取一个指定名称的对象的路径
创建路径
sim.createPath(atrribute,intParams,floatParams,color)
利用老版本的接口。
这个函数仅仅创建一个路径对象,不会在场景中渲染出路径,因为还没有路径控制点,无法渲染。
attribute:
Path object properties (can be combined with the OR operator)
enum { /* Path properties: */
sim_pathproperty_show_line =0x0001,
sim_pathproperty_show_orientation =0x0002,
sim_pathproperty_closed_path =0x0004,
sim_pathproperty_automatic_orientation =0x0008,
sim_pathproperty_invert_velocity_deprecated =0x0010,
sim_pathproperty_infinite_acceleration_deprecated =0x0020,
sim_pathproperty_flat_path =0x0040,
sim_pathproperty_show_position =0x0080,
sim_pathproperty_auto_velocity_profile_translation_deprecated =0x0100,
sim_pathproperty_auto_velocity_profile_rotation_deprecated =0x0200,
sim_pathproperty_endpoints_at_zero_deprecated =0x0400,
sim_pathproperty_keep_x_up =0x0800
};
attribute==-1
创建具有默认的路径。
默认属性:
CPathCont_old::CPathCont_old()
{
......
_attributes=sim_pathproperty_show_line|sim_pathproperty_show_orientation|sim_pathproperty_automatic_orientation| sim_pathproperty_show_position|sim_pathproperty_endpoints_at_zero_deprecated|sim_pathproperty_infinite_acceleration_deprecated;
......
}
attribute==0
void CPathCont_old::setAttributes(int attrib)
{
if ((attrib&sim_pathproperty_flat_path)&&((_attributes&sim_pathproperty_flat_path)==0))
{
_attributes=attrib;
for (int i=0;i<getSimplePathPointCount();i++)
_simplePathPoints[i]->setTransformation(_simplePathPoints[i]->getTransformation(),_attributes);
}
_attributes=attrib;
if ( (_simplePathPoints.size()<3)&&(_attributes&sim_pathproperty_closed_path) )
_attributes-=sim_pathproperty_closed_path;
actualizePath();
}
计算出来的结果是不具有任何属性---创建出来的路径看不见。
intParams:
intParams[0]:
指定路径这条线(bezier curve)的宽度,单位:
值的大小限制:
void CPathCont_old::setLineSize(int size)
{
tt::limitValue(1,8,size);
_lineSize=size;
}
void tt::limitValue(int minValue,int maxValue,int &value)
{
if (value>maxValue) value=maxValue;
if (value<minValue) value=minValue;
}
默认情况下,不设置intParams的情况下,line size=1.
intParams[1]:
总的这条曲线的长度的计算方法。
1. `sim.distcalcmethod_dl=0:路径长度=所有线路段长度之和。
2. `sim.distcalcmethod_dac`:路径长度=所有线路段长度和角度之积的加权和。
3. `sim.distcalcmethod_max_dl_dac`:路径长度=所有线路段长度和角度之积的加权和和每段线路长度的最大值之和取较大值。
4. `sim.distcalcmethod_dl_and_dac`:路径长度=所有线路段长度之和与所有线路段长度和角度之积的加权和之和。
5. `sim.distcalcmethod_sqrt_dl2_and_dac2`:路径长度=所有线路段长度的平方和与所有线路段长度和角度之积的加权和的平方和的开方之和。
6. `sim.distcalcmethod_dl_if_nonzero`:路径长度=所有线路段长度,并忽略角度为0的线路段。
7. `sim.distcalcmethod_dac_if_nonzero`:路径长度=所有线路段长度和角度之积的加权和,并忽略线路长度为0的线路段
intParmasp[2]:
reserved----设置为0.
floatParams:
floatParams[0]
路径控制点的大小,单位:
大小的限制范围。
void CPathCont_old::setSquareSize(double size)
{
tt::limitValue(0.0001,1.0,size);
_squareSize=size;
}
floatParams[1]
floatParam[2]
-
floatParams[1]
:角度与线性的转换系数。在某些路径计算方法中需要用到,例如sim.distcalcmethod_dac
,表示弧度/米的转换系数。默认值为0.01
,表示角度和线性的单位相差约为1:100。 -
floatParams[2]
:虚拟距离缩放因子。该参数用于控制路径的相对缩放大小,只有在使用虚拟相机视角测量路径时才需要设置,表示虚拟和实际距离之间的比例因子。默认值为1.0
。
color:
对于这个函数发使用,一般情况下只需要设置attribute属性即可。
sim.insertPathCtrlPoints(pathHandle,options,startIndex,ptCnt,ptData)
在sim.createPath()创建路径路径对象之后,需要调用这个接口创建路径控制点,才会在创建中渲染出路径来(bezier curve)。
pathHandle
sim.createPath创建的路径对象的handle.
options
设置为1:
1,则需要设置的每一个控制点就需要有11个参数值。
2,设置为1时,path变为关闭状态,首尾相连的闭合循环形状。
A path can be open or closed. When closed, it becomes cyclic.
设置为2:
1,则需要设置的每一个控制点就需要有16个参数值。
2,options为2,则我们设置的每一个控制点就是一个bezier curve上的点,因为option为2,则默认两个控制点之间创建的线段就是一条bezier曲线。而不是像option为1时,控制点不是bezier曲线上的点,控制点是用来控制生成bezier曲线的。
option=1/2的关闭状态设置:
1---默认关闭,2--不关闭(但是2不生成bezier曲线)
if (options&1)
path->pathContainer->setAttributes(path->pathContainer->getAttributes()|sim_pathproperty_closed_path);
else
path->pathContainer->setAttributes((path->pathContainer->getAttributes()|sim_pathproperty_closed_path)-sim_pathproperty_closed_path);
路径的开启和关闭也可以用上面的接口设置。
startIndex
新插入的控制点需要插入的起始位置索引。
索引从0开始。
如果插入的起始位置为0,代表修改路径的起始控制点0的位姿。
ptCnt
插入的控制点的数量。
ptData
所有控制点的位姿。
ptData[0]--[2]
控制点的位置:x,y,z.
ptData[3]--[5]
欧拉角表示的控制点的姿态。
ptData[6]
the relative velocity at the control point.
ptData[7]
the virtaul distance at the control point.
控制点的虚拟距离。
什么是虚拟距离?
就是设置的两个控制点之间的距离不是这两个控制点之间真实的距离,设置这个距离只是用来做其他作用的,比如控制物体移动的状态-----看旧文档案例(entities--path--Path position and length caculation methods)
ptData[8]
控制点处的bezier点的数量。
一个控制点的bezier点的数量如何标识?
ptData[9]
0.1---0.99
the bezier interpolation factor 1 at the control point.
控制点处的贝塞尔插值因子1
ptData[10]
0.1--0.99
the bezier interpolation factor 2 at the control point.
控制点处的贝塞尔插值因子2
插值因子:
什么是bezier曲线插值因子
Bezier插值因子指示Bezier曲线部分的起点和终点,Bezier点数表明曲线的详细程度(或平滑程度)。从技术上讲,Bezier点数为1会禁用Bezier曲线插值机制。
插值因子越小,bezier曲线的起始点或者终点越接近控制点。
ptData[11]----option=2使用
控制点的辅助标志。
ptData[12]--[15]----option=2使用
4个辅助值。
_S.path.setup()
sim.createPath新旧接口创建区别
全局搜索:sim.createPath,可以看到旧版本和新版本使用接口的区别。
在这个接口的添加脚本部分,加载了"path_customization"模块。
全局搜索_S.path可以打开path_customization.lua文件。
path_customization
搜索:_S.path.setup()可以看到新版本的路径是怎么设置bezier数据的。
(或者打开script/lua/path_customization.lua文件,或者直接ctrl+p 搜索path_customization.lua)
path在这个文件中的执行设置/顺序:
function sysCall_init()
_S.path.init()
end
--------
function _S.path.init()
_S.path.ctrlPtsTag = 'ABC_PATHCTRLPT'
_S.path.pathObjectTag = 'ABC_PATH_INFO'
_S.path.pathCreationTag = 'ABC_PATH_CREATION'
_S.path.shapeTag = 'ABC_PATHSHAPE_INFO'
_S.path.childTag = 'PATH_CHILD' -- old: childTag not used anymore
_S.path.model = sim.getObject('.')
_S.path.uniqueId = sim.getStringParam(sim.stringparam_uniqueid)
_S.path.refreshDelay = 0.2
_S.path.lastRefreshTime = sim.getSystemTime()
_S.path.lineCont = {-1, -1}
_S.path.tickCont = {-1, -1, -1}
_S.path.createNewIfNeeded()
_S.path.forceFullRebuild = true
return _S.path.setup()
end
------------------------------
function _S.path.setup()
local ctrlPtsHandles = _S.path.getCtrlPts()
_S.path.removeLine(1)
_S.path.removeLine(2)
--------------------------
function _S.path.computePaths()
local c = _S.path.readInfo()
local handles = {}
for i = 1, #_S.path.ctrlPts, 1 do handles[i] = _S.path.ctrlPts[i].handle end
if (c.bitCoded & 2) ~= 0 then handles[#handles + 1] = handles[1] end
-----------------------
sim.writeCustomDataBlock(_S.path.model, 'PATH', sim.packDoubleTable(_S.path.paths[2]))
每一次路径有所改变,都会执行:
_S.path.setup()
在这个接口中会重新计算bezier曲线插值(Interpolated)点的pose,放入轨迹的PATH属性:
_S.path
这个是path_customization中的一个对象。
在模块中的初始化:
_S.path = {}
当执行这个对象中的接口操作轨迹时,如何知道是哪条轨迹
轨迹被移动时的执行流程
创建路劲之后,会一直循环执行一个接口:
function sysCall_nonSimulation()
_S.path.nonSimulation()
end
function _S.path.nonSimulation()
if not _S.path.refresh then
-- 路径没有更新则执行这个部分
if _S.path.getCtrlPtsPoseId() ~= _S.path.ctrlPtsPoseId then _S.path.refresh = true end
end
if _S.path.refresh and sim.getSystemTime() - _S.path.lastRefreshTime > _S.path.refreshDelay then
-- 如果路径有更新就执行这个部分,比如拖动控制点,但是拖动整个路径,相当于轨迹没有发生变化,所以这部分没有被执行
_S.path.setup()
end
从中可以看出,只有路径本省被改变之后,才会更新路径中的bezier点的pose,如果只是移动整个路径,路径没有改变,所以path的bezier点的pose还是旧的数据。
新版本路径lua读取bezier数据
sim.unpackDoubleTable(sim.readCustomDataBlock(handle, 'PATH'))
场景对象
设置对象的父对象
simSetObjectParent(obj_handle,rel_hanbdle,keepInPlace)
重要的是keepInPlace,bool类型值,表示物体的绝对位姿是否需要保持不变,即物体相对于世界坐标系的位姿是否需要保持不变。
false:
相对于世界坐标系的位姿不需要保持,而物体的位姿需要转换到和父对象相同的姿态.
true:
相对于世界坐标系的绝对位姿不变。
只设置父子关系。
绝对位姿和相对位姿
在三维空间中,物体的姿态通常由其位姿(位置和方向)表示。绝对姿态是该物体的世界坐标系下的位姿,也就是说,不考虑其父物体的影响,该物体在场景中的实际位置和方向。相对姿态指相对于父物体的位姿,即该物体相对于其父物体在场景中的位置和方向。
当使用 simSetObjectParent 函数将一个物体添加为另一个物体的子物体时,可以指定物体的绝对姿态是否应保持不变。如果指定为保持不变,那么添加后子物体的位姿不会发生改变,即其绝对姿态依然是其添加前的姿态;如果不保持不变,则子物体相对于其新父物体的位姿将是其旧父物体的位姿相对于新父物体的位姿的组合,即其绝对姿态将发生变化。
具体地说,如果 keepInPlace 参数设置为 true,则父物体不会影响子物体的位姿,子物体将保持站在它添加前的位置和方向不变且相对于父物体仍然保持在相同的位置和方向;如果设置为 false,则其相对位姿会改变,子物体的位姿将基于其添加前的位姿和其新父物体的位姿重新计算。
例如,如果一个机器人模型被添加为一个地图模型的子物体,并保持其绝对姿态不变,则该机器人模型将在场景中保留其原始的位置和方向,而不会受到地图位置或朝向的影响。但如果不保持其绝对姿态不变,则机器人将相对于地图模型移动,并调整其当前的姿态朝向以与父物体的朝向一致。
图形形状
simCreatePrimitiveShape
注意:
创建圆:本质上是椭圆,许哟啊给出短半轴和长半轴;
创建球体:本质上是创建椭圆球,如果要创建球体,必须给出三个一样的值。
圆柱:要给出底圆短半轴和长半轴,和圆柱的高;
颜色
simSetShapeColor()
simSetShapeColor(shapeHandle,colorName,colorComponent,rbgData)
颜色成分:
enum { /* color components */
sim_colorcomponent_ambient=0,
sim_colorcomponent_ambient_diffuse=0,
sim_colorcomponent_diffuse,
sim_colorcomponent_specular,
sim_colorcomponent_emission,
sim_colorcomponent_transparency,
sim_colorcomponent_auxiliary
};
simSetObjectColor()
动力学--Dynamics
simHandleDynamics
simSetJointTargetPosition
设置关节的目标线性/角度位置。
simSetJointTargetVelocity
设置非球面关节的目标线速/角速度。
simReadForceSensor
读取施加到力传感器的力和扭矩(读取过滤值)
simGetJointForce
获取沿/围绕关节活动轴施加到关节的力或扭矩。
simGetJointTargetForce
获取关节可以施加的力或扭矩。
simSetJointTargetForce
设置关节可以施加的力或扭矩。
simAddForce
给对象添加一个力。
simAddForceAndTorque
向动态启用的形状对象添加力和/或扭矩。
simGetVelocity
获取非静态形状质心的线速度和/或角速度。
simGetLinkDummy
链接到此虚拟的对象句柄。
simSetLinkDummy
simResetDynamicObject
重置动态模拟的对象。
simGetContactInfo
simGetShapeMass
simSetShapeMass
simGetShapeInertia
simSetShapeInertia
simComputeMassAndInertia
simCreateForceSensor
simConvexDecompose
simGetQHull
simGetDecimatedMesh
simIsDynamicallyEnabled
int simGetObjectPotion
获取某个对象相对于某个对象的位置。
第二个参数为-1表示获取对象相对于世界坐标系的坐标。
int simGetObejctOrientation
获取某个对象相对于某个对象的姿态。
第二个参数为-1表示获取对象相对于世界坐标系的姿态。
float robot_euler[3];
simGetObejctOrientation(handle,-1,robot_euler);
其中 `robot_euler[0]` 表示绕 x 轴的旋转角度,`robot_euler[1]` 表示绕 y 轴的旋转角度,`robot_euler[2]` 表示绕 z 轴的旋转角度,这些角度通常使用欧拉角(Euler angles)表示。
simGetObjectPose()
四元素方式获取位置和姿态。
默认输出:
第一个参数| sim.handleflag_wxyzquat,则输出;
sim.handleflag_wxyzquat
char *simGetObjectName(int handle)
获取某个对象的名字。
int simReleaseBuffer(void* buffer)
用于释放simGetObjectsInTree返回的数组。
int simSetInt32Signal(const char* signalName, int signalValue)
什么是32位信号:
int simGetInt32Signal(const char* signalName, int* signalValue)
对于仿真开发中的场景,simGetInt32Signal() 可以用于获取特定模块或设备中的 32 位带符号整数类型的信号值,通常会被用于数据读取、控制指令的发送等操作中。