前排警告,以下机翻

关节类型和操作

与其他对象相比,关节具有两个参考框架(仅在选择关节时可见)。 第一个是固定的常规参考框架,其他对象也有。 第二参考系不固定,并且将根据定义其配置的关节位置(或关节值)相对于第一参考系移动。

关节类型

支持4种类型的关节:

旋转关节:旋转关节具有一个自由度,用于描述对象之间的旋转运动。它们的配置由一个值定义,该值表示绕其第一个参考系的z轴的旋转量。它们可以用作被动接头,也可以用作主动接头(电动机)。
棱柱关节:棱柱关节有一个自由度,用于描述物体之间的平移运动。它们的配置由一个值定义,该值表示沿其第一个参考系的z轴的平移量。它们可以用作被动接头,也可以用作主动接头(电动机)。
螺钉:螺钉,可以看作是旋转接头和棱柱接头(带有连接值)的组合,具有一个自由度,用于描述类似于螺钉的机芯。pitch参数定义给定旋转量的平移量。螺杆配置由一个值定义,该值表示围绕其第一参考系的z轴的旋转量。螺钉可用作被动接头,也可用作主动接头(电机)。
球形接头:球形接头有三个自由度,用于描述物体之间的旋转运动。它们的配置由三个值定义,这三个值表示围绕其第一参考系的x轴,y轴和z轴的旋转量。定义球形关节配置的三个值指定为欧拉角。在某些情况下,球形关节可以被认为是3个并发且彼此正交的旋转关节,它们是层级链中的父级。然而,这个类比只有在所有旋转关节保持与其他两个关节不同的方向时才有效:事实上,如果两个关节接近重合,则可能出现单一情况并且该机制可能会丢失一个DoF。对于内部处理的球形接头,这种情况绝不会发生,以避免这种情况。球形接头总是被动接头,不能作为电动机。


关节用于允许其父对象与其子对象之间的相对移动。 当在关节和对象之间建立父子关系时,该对象将附加到关节的第二个参考框架,因此,关节的配置(内在位置)的更改将直接反映到其子项上。 可以使用[菜单栏 --> Add --> Joints]将新关节添加到场景中。

关节模式

关节可以采用以下模式之一:
被动模式:在此模式下,关节不是直接控制的,而是作为固定链接。然而,用户可以通过适当的API函数调用来改变关节的位置(例如,simSetJointPositon或simSetSphericalJointMatrix)。
反向运动模式:在此模式下,关节充当被动关节,但在反向运动学计算或几何约束求解器计算期间使用(调整)。
从属模式:在此模式下,关节位置通过线性方程直接链接(相关)到另一个关节位置。
运动模式:此模式已弃用,不应再使用。使用被动模式和子脚本适当地更新关节可以获得类似且更灵活的行为。
扭矩或力模式:在此模式下,关节由动力学模块模拟,当且仅当它是动态启用时(有关更多信息,请参阅设计动态模拟部分)。当动态启用时,关节可以是自由的或以力/扭矩,速度或位置控制。螺钉不能以扭矩或力模式操作(但是可以通过编程方式连接旋转和棱柱形接头来获得类似的行为),并且球形接头只能在扭矩或力模式下自由。

当关节电机被禁用时,关节是自由的,并且仅受其限制的约束。
当启用关节电机并且禁用控制回路时,在给定其能够传递的最大扭矩/力的情况下,关节将尝试达到期望的目标速度。当该最大扭矩/力非常高时,瞬时达到目标速度并且关节在速度控制下操作,否则其以指定的扭矩/力操作直到达到期望的目标速度(扭矩/力控制)。
启用关节电机并启用控制回路后,用户可以使用3种控制模式:
自定义控件:联合控件回调脚本将负责控制关节的动态行为,允许您使用任何可以想象的算法控制关节。
位置控制(PID):通过PID控制器将关节控制在适当位置,PID控制器将按照以下方式调节关节速度(Δt分频器用于保持控制器独立于所选控制器时间步长):

弹簧阻尼模式:通过力/扭矩调制,关节将像弹簧阻尼系统一样:

当关节处于被动模式,反向运动模式或从属模式时,它也可选择以混合方式运行:混合操作允许关节以常规方式操作,但另外,在动态计算之前,当前关节位置 将被复制到目标关节位置,然后,在动力学计算过程中,关节将作为位置控制中的电机处理(当且仅当它是动态启用时(有关更多信息,请参阅设计动态模拟部分))。 该特征允许例如通过简单地指定期望的脚位置(作为反向运动学任务)来控制人形机器人的腿。 然后,相应的计算的关节位置将被用作腿部动态运动的位置控制值。

关节控制器

关节可以通过许多不同的方式进行控制。 在下一节中,我们将松散控制器和精确控制器区分开来:松散的联合控制器将无法在每个可能的调节步骤中提供新的控制量(例如,可能/将跳过某些调节步骤,但仍可进行控制)。 另一方面,精确的联合控制器将能够在每个可能的调节步骤中提供控制量。
首先,控制关节的方法取决于联合模式:

关节未处于力/扭矩模式。
关节以力/扭矩模式运行。

区别在于物理引擎将处理以力/扭矩模式操作的关节。物理引擎默认执行的计算步骤比模拟循环多10倍:模拟循环以20Hz(模拟时间)运行,而物理引擎运行在200Hz(也在模拟时间)。如果需要,可以完全配置该默认行为。

如果关节未处于力/扭矩模式:如果关节未处于力/扭矩模式,则可以通过simSetJointPosition(或类似的,例如远程API的simxSetJointPosition)API函数直接(并即时)设置其位置。您可以从子脚本,插件,ROS节点或远程API客户端执行此操作。如果从子脚本执行此操作,则应在非线程子脚本的驱动部分内部执行此操作,或者在主脚本的感知阶段之前执行的线程子脚本(默认)执行此操作。但是,在后一种情况下,请确保使用线程子脚本与模拟循环同步以进行精确控制。

在下面的线程子脚本示例中,关节被控制在loosley中,并且没有与模拟循环同步:

-- Following script should run threaded:jointHandle=simGetObjectHandle('Revolute_joint')simSetJointPosition(jointHandle,90*math.pi/180) -- set the position to 90 degrees
simWait(2) -- wait 2 seconds (in simulation time)
simSetJointPosition(jointHandle,180*math.pi/180) -- set the position to 180 degrees
simWait(1) -- wait 1 second (in simulation time)
simSetJointPosition(jointHandle,0*math.pi/180) -- set the position to 0 degrees
etc.

在下面的线程子脚本示例中,在每个模拟步骤中精确控制关节的位置,即线程与模拟循环同步:

-- Following script should run threaded:simSetThreadSwitchTiming(200) -- Automatic thread switching to a large value (200ms)
jointHandle=simGetObjectHandle('Revolute_joint')simSetJointPosition(jointHandle,90*math.pi/180) -- set the position to 90 degrees
simSwitchThread() -- the thread resumes in next simulation step (i.e. when t becomes t+dt)
simSetJointPosition(jointHandle,180*math.pi/180) -- set the position to 180 degrees
simSwitchThread() -- the thread resumes in next simulation step
simSetJointPosition(jointHandle,0*math.pi/180) -- set the position to 0 degrees
simSwitchThread() -- the thread resumes in next simulation step
-- etc.-- In above code, a new joint position is applied in each simulation step

当您尝试从外部应用程序(例如通过远程API或ROS)控制非力/扭矩模式的关节时,外部控制器将异步运行到V-REP(即类似于非同步代码 一个线程的子脚本)。 这对于松散控制大部分时间都很好,但如果您希望在每个模拟循环中精确控制关节的位置,则必须在同步模式下运行V-REP,以及外部控制器(例如远程API客户端) )必须明确地触发每个模拟步骤。 以下说明了执行此操作的C / C ++远程API客户端:

simxSynchronous(clientId,1); -- enable the synchronous mode (client side). The server side (i.e. V-REP) also needs to be enabled.
simxStartSimulation(clientId,simx_opmode_oneshot); // start the simulation
simxSetJointPosition(clientId,jointHandle,90.0*3.1415f/180.0f,simx_opmode_oneshot); // set the joint to 90 degrees
simxSynchronousTrigger(clientId); // trigger next simulation step. Above commands will be applied
simxSetJointPosition(clientId,jointHandle,,180.0*3.1415f/180.0f,simx_opmode_oneshot); // set the joint to 180 degrees
simxSynchronousTrigger(clientId); // next simulation step executes. Above commands will be applied
simxSetJointPosition(clientId,jointHandle,,0.0*3.1415f/180.0f,simx_opmode_oneshot); // set the joint to 0 degrees
etc.

有关远程API同步模式如何正确运行的详细信息,请参阅此页面。 该方法与ROS类似。

如果关节处于力/扭矩模式:如果关节在力/扭矩模式下操作并且是动态启用的,则它将由物理引擎间接处理。 如果未启用关节的电机,则不会控制您的关节(即它将是自由的)。 否则,您的关节可以采用以下两种动态模式:

关节的电机已启用,但控制回路已禁用。 当您想要从外部应用程序精确定制控制关节时使用此模式(例如力/扭矩控制,PID等)。 当您想要在力/扭矩模式下松散控制关节或速度控制(例如机器人轮马达)时,也可以使用此模式。
启用关节电机,并启用控制回路。 当您的关节需要充当弹簧/阻尼器,或者您想要从V-REP内精确定制控制关节,或者您想要从外部应用程序松散地控制关节位置控制时,请使用此模式。

如果启用了关节的电机,但禁用了控制回路,则物理引擎将应用指定的最大力/扭矩,并加速关节直到达到目标速度。如果负载小和/或最大力/扭矩高,则将快速达到该目标速度。否则,需要一些时间,或者,如果力/扭矩不够大,则永远不会达到目标速度。您可以使用simSetJointTargetVelocity(或者,例如,在远程API的情况下,simxSetJointTargetVelocity)以及使用simSetJointForce的最大力/扭矩(或者例如,在远程API的情况下,simxSetJointForce)以编程方式调整目标速度。在从子脚本中为力/扭矩模式的关节编写精确关节控制器之前,您应该非常小心,原因如下:

默认情况下,仿真循环以50ms的时间步长运行(在模拟时间内)。但是物理引擎将以5ms的时间步长运行,即频率增加10倍。将在每个仿真步骤中调用子脚本,但不会在每个物理引擎计算步骤中调用。这意味着如果您从子脚本控制一个关节,您将只能为10个物理引擎计算步骤提供一次新的控制值:您将缺少9个步骤。克服这种情况的一种方法是更改​​默认模拟设置并指定5ms的模拟时间步长,而不是50ms。这样可以正常工作,但请记住,所有其他计算(例如视觉传感器,接近传感器,距离计算,IK等)也会经常运行10次,最后会减慢模拟速度(大多数情况下您不需要)其他计算模块的刷新率如此之高。但物理引擎需要如此高的刷新率。另一个更好的选择是启用关节的控制循环,并在关节控制回调脚本中处理其控制,这将在下面进一步解释。

另一方面,如果您希望在外部运行精确且常规的关节控制器(例如,从远程API客户端或ROS节点),那么除了将模拟循环设置为与物理相同的速率之外,您别无选择。然后在同步模式下运行V-REP,外部控制器(例如远程API客户端)必须明确触发每个模拟步骤。以下说明了执行此操作的C / C ++远程API客户端:

simxSynchronous(clientId,1); -- enable the synchronous mode (client side). The server side (i.e. V-REP) also needs to be enabled.
simxStartSimulation(clientId,simx_opmode_oneshot); // start the simulation
simxSetJointForce(clientId,jointHandle,1.0f,simx_opmode_oneshot); // set the joint force/torque
simxSetJointTargetVelocity(clientId,jointHandle,180.0f*3.1415f/180.0f,simx_opmode_oneshot); // set the joint target velocity
simxSynchronousTrigger(clientId); // trigger next simulation step. Above commands will be applied
simxSetJointForce(clientId,jointHandle,0.5f,simx_opmode_oneshot); // set the joint force/torque
simxSetJointTargetVelocity(clientId,jointHandle,180.0f*3.1415f/180.0f,simx_opmode_oneshot); // set the joint target velocity
simxSynchronousTrigger(clientId); // next simulation step executes. Above commands will be applied
simxSetJointForce(clientId,jointHandle,2.0f,simx_opmode_oneshot); // set the joint force/torque
simxSetJointTargetVelocity(clientId,jointHandle,180.0f*3.1415f/180.0f,simx_opmode_oneshot); // set the joint target velocity
etc.

有关远程API同步模式如何正确运行的详细信息,请参阅此页面。该方法与ROS类似。

如果启用了关节的电机,并且控制回路也已启用,则物理引擎将根据设置处理关节:您的关节可以在位置控制(即PID控制),弹簧/阻尼模式或自定义控件。可以从子脚本,远程API客户端或ROS节点更新PID和弹簧/阻尼器参数。请参阅对象参数ID 2002-2004和2018-2019。可以使用simSetJointTargetPosition(或者,例如,从远程API客户端,simxSetJointTargetPosition)设置所需的目标位置。当您需要精确的自定义控制器时,您应该使用联合控制回调脚本,而不是在子脚本中控制您的关节。

最后,如果您需要在外部应用程序中实现的精确PID或自定义控制器,则需要确保模拟步骤与物理引擎计算步骤相同:默认情况下,V-REP的模拟循环以20Hz运行(在模拟时间),而物理引擎运行在200Hz。您可以在模拟设置中调整模拟步长。您还需要确保以同步模式运行V-REP。以下说明了执行此操作的C / C ++远程API客户端:

simxSynchronous(clientId,1); -- enable the synchronous mode (client side). The server side (i.e. V-REP) also needs to be enabled.
simxStartSimulation(clientId,simx_opmode_oneshot); // start the simulation
simxSetJointTargetPosition(clientId,jointHandle,90.0f*3.1415f/180.0f,simx_opmode_oneshot); // set the desired joint position
simxSynchronousTrigger(clientId); // trigger next simulation step. Above commands will be applied
simxSetJointTargetPosition(clientId,jointHandle,180.0f*3.1415f/180.0f,simx_opmode_oneshot); // set the desired joint position
simxSynchronousTrigger(clientId); // next simulation step executes. Above commands will be applied
simxSetJointTargetPosition(clientId,jointHandle,0.0f*3.1415f/180.0f,simx_opmode_oneshot); // set the desired joint position
etc.

您还可以通过向关节控制回调脚本提供信号,让远程API客户端为关节控制回调脚本中实现的自定义关节控制器提供控制值,如下例所示:

simxSynchronous(clientId,1); -- enable the synchronous mode (client side). The server side (i.e. V-REP) also needs to be enabled.
simxStartSimulation(clientId,simx_opmode_oneshot); // start the simulation
simxSetFloatSignal(clientId,"myDesiredTorque",1.0f,simx_opmode_oneshot); // set the signal value
simxSetFloatSignal(clientId,"myDesiredTarget",90.0f*3.1415/180.0f,simx_opmode_oneshot); // set the signal value
simxSynchronousTrigger(clientId); // trigger next simulation step. Above commands will be applied
etc.

在上面的示例中,您的关节控制回调脚本可以在执行控制之前获取这两个信号(使用simGetFloatSignal)。

关节属性

关节属性是场景对象属性对话框的一部分,该对话框位于[菜单栏 --> Tools --> Scene object properties]。 您还可以通过双击场景层次结构中的对象图标或单击其工具栏按钮来打开对话框:

在场景对象属性对话框中,单击“关节”按钮以显示关节对话框(仅当最后一个选择是关节时,才会显示“关节”按钮)。 该对话框显示上次选择的关节的设置和参数。 如果选择了多个关节,则可以将一些参数从最后选择的关节复制到其他所选关节(应用于选择按钮。请注意,这只会在相同类型或模式的关节之间产生影响):

Position is cyclic:指示关节位置是否是循环的(在-180和+180度之间变化而没有限制)。只有旋转关节才能循环。
Screw pitch:关节的螺距值。当“位置为循环”复选框未选中时,此属性仅适用于Revolute / Screw类型的关节。
Position minimum:非循环旋转接头,螺钉或棱柱接头的最小允许值。
Position range:非循环旋转关节,螺钉或棱柱关节的变化范围。这种关节的位置限制在位置最小值和位置最小值+位置范围之间。
Position:旋转关节,棱柱关节或螺钉的固有关节位置。
IK calculation weight:反向运动学计算期间关节的权重。例如,在冗余操纵器的情况下,此选项使您可以在反向运动学分辨率期间使某些关节优于其他关节。与其他关节相比,具有较小权重的关节将具有相对较小的位置变化。
Maximum step size:在一次运动计算过程中允许的最大位置变化。较小的步长通常会导致较长的计算,但可以更稳定。对于反向运动学计算,可以通过忽略最大值来覆盖此值。反向运动学对话框中的步长项。
Mode:关节的控制模式。关节可以处于被动模式,反向运动模式,从属模式或扭矩/力模式。
Hybrid operation:当关节处于被动模式,反向运动模式或从属模式时,它也可以选择以混合方式运行:混合操作允许关节以常规方式操作,但另外,在动态计算之前,当前关节位置将被复制到目标关节位置,然后,在动力学计算过程中,关节将作为位置控制中的电机处理(当且仅当它是动态启用时)。有关详细信息,请参阅关节类型和操作部分。
Adjust dependency equation:如果关节处于从属模式,则可以指定将关节链接到另一个关节的线性方程。对话框此部分中的值均以米或弧度表示。
Length:关节的长度。没有功能意义。
Diameter:接头直径。没有功能意义。
Adjust color A / B:颜色A是关节固定部分的颜色,颜色B是关节运动部分的颜色。
Show dynamic properties dialog:切换关节动力学属性对话框。关节动力学对话框允许调整关节的动态属性。

关节动力学属性

关节动力学属性是关节属性的一部分。 其对话框显示最后选定关节的动力学设置和参数。 如果未选择任何对象,则对话框处于非活动状态。 如果选择了多个关节,则可以将一些参数从最后选择的关节复制到其他所选关节(应用于选择按钮。请注意,这只会在相同类型或模式的关节之间产生影响):

Motor enabled:启用或禁用关节电机。如果禁用,则关节是自由的。仅在关节处于扭矩/力模式时可用。
Target velocity:关节电机的目标速度。如果最大扭矩/力足够高,则瞬间达到目标速度;否则逐渐接近目标速度。
Max. torque/force:关节电机运行时的最大扭矩或力。
Lock motor when target velocity is zero:当接头启用电机并且控制回路禁用时,它将作用于速度控制。当目标速度为零时,它可能会漂移,因为扭矩/力只会起内部摩擦的作用。为避免这种情况,您可以启用此项目,当目标速度设置为零时,该项目将锁定到位。
**Engine specific properties:**允许调整特定于引擎的参数。请参阅与关节相关的动力学引擎属性对话框。
Control loop enabled:启用或禁用联合控制回路。默认情况下,使用内置PID控制器(请参见下文)。
Target position:所需的关节目标位置。
Upper velocity limit:允许将调节速度限制为最大值。
**Custom control:**如果启用,则将通过联合控件回调脚本控制关节。这允许用户编写非常特定的联合控制器,其将在每个物理引擎模拟步骤中执行(即,默认比模拟时间步骤多10倍)。
**Edit custom control loop:**允许编辑自定义关节控件的联合控件回调脚本。
trol.
Position control (PID) 如果启用,则通过内置PID控制器调节关节速度,将关节控制在适当位置。
Proportional / Integral / Derivative parameter:PID位置控制参数。
Spring-damper mode:如果启用,则通过内置弹簧 - 阻尼控制器调节关节力/扭矩,将关节控制在适当位置。
Spring constant K / Damping coefficient C::弹簧阻尼器参数。

VREP joint关节相关推荐

  1. vrep/CoppeliaSim关节抖动问题原因总结

    使用vrep/CoppeliaSim仿真多了,经常对同一个场景中的模型关节的设置进行改动.忘了之前改动的东西,导致关节运动冲突,容易造成仿真时机械抖动乱动.用oed引擎仿真时机械臂还会直接散架飞走.这 ...

  2. unity3d 收费模式_unity3d中的访客模式

    unity3d 收费模式 抽象 (Abstract) Game development as a discipline is challenging on its own compared to tr ...

  3. V-rep机器人仿真软件使用的学习笔记

    本博客同时发布于个人主页:www.doctorsrn.cn 本博客续:V-rep机器人仿真软件使用的学习笔记-续 相关博客:V-rep中机械臂惯性参数的获取方法 前言 这篇博客主要是记录自己学习和使用 ...

  4. Unity中的关节组件和绳子效果的实现

    前言 在Unity中可以使用Joint(关节)来实现绳子的效果. Joint属于Unity里面的一种物理组件,是模拟物体与物体之间的一种连接关系,有以下几种类型:Hinge Joint(链条连接),F ...

  5. 【从零开始的ROS四轴机械臂控制】(六)- 逻辑控制节点

    [从零开始的ROS四轴机械臂控制(六)] 九.逻辑控制节点 1.运动控制方法 (1)逆向运动学 (2)反馈控制 2.各节点之间的联系 3.相关程序 (1)img_process节点 (2)arm_co ...

  6. 【英语学习】【医学】Unit 01 The Skeletal System

    <基础医学英语>读书笔记 文章目录 常见词根与词缀 常见词根与词缀 词根/词缀 含义 示例 arthr(o)- joint 关节 arthritis 关节炎 arthrodynia 关节痛 ...

  7. cocos2dx视频教程进阶篇--第2天--打砖块游戏-box2d物理引擎

    感谢大家的鼓励和支持,今天进阶篇2奉献给大家. 不了解cocos2dx基本概念的朋友,请移步 http://blog.csdn.net/s_xing/article/details/18557631. ...

  8. Unity3D基础知识学习笔记

    1.基础知识: 标题栏 菜单栏 工具栏:变换工具.gizmos切换.播放控件.层列表.布局列表 功能窗口 2.资源及资源类型:在project里面能够create的资源.project面板可以对资源进 ...

  9. 法兰克机器人循环编程_原来可以这样编写Fanuc机器人程序!

    原标题:原来可以这样编写Fanuc机器人程序! Robot 为自动化设备,但在自动化运转之前,必须先告诉Robot 要自动完成哪些动作,透过「撰写Robot 程序」可达到此目的. Robot 程序主要 ...

最新文章

  1. JavaScript的DOM操作-重点部分-第一部分
  2. 在text html模版中写js,如何利用模板将HTML从JavaScript中抽离
  3. 把自己编写的python模块添加到PYTHONPATH上
  4. 对于出差的看法_我对于挑选背包的一些小建议
  5. z.lua 1.7.0 发布,快速回到历史路径,支持 ranger / fz
  6. linux下如何产生core,调试core
  7. Django 电脑使用管理
  8. C++ 文件读写操作01
  9. 师弟走了,以我们都想不到的方式
  10. 根据屏幕大小加载css,css根据屏幕大小切换样式
  11. python3.6安装步骤-python3.6、opencv安装环境搭建过程(图文教程)
  12. 袁玉玮:简介人工智能在基金界的应用现状(四)
  13. java短信接口代码_java调用短信接口代码
  14. kivy部署移动端预测模型网页计算器记录
  15. 怎样制作gif格式动图?如何在线自制gif动图?
  16. 如何将mp4转换成gif?教你一招实现视频转gif高清转换
  17. dsa java_如何为Java生成2048位DSA密钥对?
  18. thor修改html,f4thor修改工具[thor规则解包打包] | 贝贝吧
  19. 北京2008年地铁规划收集
  20. java内存设在哪里设置,java程序设置最大内存 在哪里设置java内存大小

热门文章

  1. C# 基于MessageBox类的消息对话框讲解
  2. 【数字信号处理】卷积和乘法系列3之傅里叶变换对
  3. java中abstract方法可以使用static吗
  4. php 安装 curl扩展
  5. js-alert-notificationFx.js
  6. 长城脚下婚礼展示:挚爱如此坚定!【奥帆婚礼顾问】
  7. html如何引入JavaScript代码
  8. 江陵服务器维修,2月5日跨服远征全服停机更新公告
  9. Android 蓝牙基础篇之 —— SPP
  10. 什么是iu组装服务器,网维大师推出网维专用服务器IU IG ID