V-rep学习笔记:关节力矩控制
- Torque or force mode
When the joint motor is enabled and the control loop is disabled, then the joint will try to reach the desired target velocity given the maximum torque/force it is capable to deliver. When that maximum torque/force is very high, the target velocity is instantaneously reached and the joint operates in velocity control, otherwise it operates at the specified torque/force until the desired target velocity is reached (torque/force control).
如果想要对关节进行力控制VREP中没有现成的函数,只能通过间接的方式:将目标速度设的足够大(不可能短时间达到),然后在关节控制脚本中修改源代码,设置并返回关节最大力矩或通过simSetJointForce函数设置关节最大力矩,这样关节就可以一直按照设置的最大力矩运转,从而达到调节关节力矩的目的。
When the joint motor is enabled and the control loop is enabled, then the user has 3 control modes available:
- Custom control: a joint control callback script will be in charge of controlling the dynamic behaviour of the joint, allowing you to control the joint with any imaginable algorithm.
- Position control (PID): the joint will be controlled in position via a PID controller that will adjust the joint velocity in following way (the Δt divider is to keep the controller independent of the selected controller time step):

- Spring-damper mode: the joint will act like a spring-damper system via a force/torque modulation:

根据上面的思路,在做一些底层控制涉及到调节关节力矩时可以通过修改关节控制回调脚本(脚本默认进行PID控制,控制量为关节速度),按照需求计算力矩并返回给VREP的物理引擎,这种方式比调用simSetJointForce函数要方便很多。下面是一个简单的例子:新建一个场景,添加一个连杆并将其用转动关节连接到大地。然后双击转动关节图标,将其设置为力矩模式,进行Custom control。修改关节控制脚本(joint control callback scripts):
-- Following data is handed over from V-REP:
init,revolute,cyclic,jointHandle,passCnt,totalPasses,currentPos,targetPos,errorValue,effort,dynStepSize,lowLimit,highLimit,targetVel,maxForceTorque,velUpperLimit=... --Retrieves the current simulation time
local t = simGetSimulationTime() forceOrTorqueToApply = math.sin(math.pi * t / ) maxVelocity = 9.0e+04 -- Following data must be returned to V-REP:
return forceOrTorqueToApply,maxVelocity -- forceOrTorqueToApply: the maximum force/torque that the joint will be able to exert
-- maxVelocity: max. velocity allowed.
添加一个Graph记录关节转矩,从下图可以看出关节力矩按照正弦函数变化,周期为4s,与预期一致:

下面一个例子中,根据静力平衡条件计算关节转矩,使得二连杆机构在重力作用下能保持平衡。两个密度均匀的连杆长度为0.5m,初始质量均为1Kg,可以通过自定义界面上的两个滑动条来改变连杆质量,并设置相应的信号,关节控制脚本中读取信号变化计算力矩。
CustomeUI:
function sliderChange(ui, id, newVal)
simExtCustomUI_setLabelText(ui, ,'Mass set to '..newVal) if id == then
simSetShapeMassAndInertia(L1_handle, newVal, L1_inertiaMatrix, L1_centerOfMass)
simSetFloatSignal('L1_mass', newVal)
elseif id == then
simSetShapeMassAndInertia(L2_handle, newVal, L2_inertiaMatrix, L2_centerOfMass)
simSetFloatSignal('L2_mass', newVal)
end end if (sim_call_type==sim_childscriptcall_initialization) then
xml = [[
<ui>
<tabs>
<tab title="Set link mass">
<label text="Sliders can be oriented horizontally or vertically, and have optional properties that can be set (in the XML) such as minimum and maximum value." wordwrap="true" />
<label text="" id="3000" wordwrap="true" />
<hslider id="3001" tick-position="above" tick-interval="1" minimum="1" maximum="20" onchange="sliderChange" />
<vslider id="3002" minimum="1" maximum="20" onchange="sliderChange" />
<label text="Spinboxes allow editing a numeric value using two buttons for increase and decrease, or direct text input. Spinboxes can display a prefix and a suffix text." wordwrap="true" />
<spinbox minimum="1" maximum="20" suffix="Kg"/>
<spinbox minimum="1" maximum="20" suffix="Kg" />
<stretch />
</tab>
</tabs>
</ui>
]]
ui = simExtCustomUI_create(xml) L1_handle = simGetObjectHandle('L1')
L2_handle = simGetObjectHandle('L2')
L1_mass,L1_inertiaMatrix,L1_centerOfMass = simGetShapeMassAndInertia(L1_handle)
L2_mass,L2_inertiaMatrix,L2_centerOfMass = simGetShapeMassAndInertia(L2_handle)
simSetFloatSignal('L1_mass', L1_mass)
simSetFloatSignal('L2_mass', L2_mass)
end if (sim_call_type==sim_childscriptcall_actuation) then
end if (sim_call_type==sim_childscriptcall_sensing) then end if (sim_call_type==sim_childscriptcall_cleanup) then
simSetShapeMassAndInertia(L1_handle, , L1_inertiaMatrix, L1_centerOfMass)
simSetShapeMassAndInertia(L2_handle, , L2_inertiaMatrix, L2_centerOfMass)
simExtCustomUI_destroy(ui)
end
J1 joint control callback scripts:
init,revolute,cyclic,jointHandle,passCnt,totalPasses,currentPos,targetPos,errorValue,effort,dynStepSize,lowLimit,highLimit,targetVel,maxForceTorque,velUpperLimit=...
local m1 = simGetFloatSignal('L1_mass')
local m2 = simGetFloatSignal('L2_mass')
forceOrTorqueToApply = (2.5*m1 + 7.5*m2)
maxVelocity = 9.0e+04
-- Following data must be returned to V-REP:
return forceOrTorqueToApply,maxVelocity
J2 joint control callback scripts:
init,revolute,cyclic,jointHandle,passCnt,totalPasses,currentPos,targetPos,errorValue,effort,dynStepSize,lowLimit,highLimit,targetVel,maxForceTorque,velUpperLimit=...
local m2 = simGetFloatSignal('L2_mass')
forceOrTorqueToApply = (2.5 * m2)
maxVelocity = 9.0e+04
-- Following data must be returned to V-REP:
return forceOrTorqueToApply,maxVelocity

为了在仿真过程中查看信号变量,可以将模型signal monitor(Models/other/signal monitor.ttm)拖入场景中,显示信号的变化:

signal monitor.ttm
参考:
How do I simulate a torque motor?
V-rep学习笔记:关节力矩控制的更多相关文章
- Python学习笔记 - day4 - 流程控制
Python流程控制 Python中的流程控制主要包含两部分:条件判断和循环. Python的缩进和语法 为什么要在这里说缩进和语法,是因为将要学习的条件判断和分支将会涉及到多行代码,在java.c等 ...
- 0039 Java学习笔记-多线程-线程控制、线程组
join线程 假如A线程要B线程去完成一项任务,在B线程完成返回之前,不进行下一步执行,那么就可以调用B线程的join()方法 join()方法的重载: join():等待不限时间 join(long ...
- AMQ学习笔记 - 19. 问题解决 - 控制Atomikos的日志输出
概述 在使用Atomikos为ActiveMQ提供JTA支持时,Atomikos在控制台打印了繁琐的日志.这里介绍如何控制Atomikos日志输出的粒度. 解决方案 基于以下三个事实: Atomiko ...
- Linux C语言编程学习笔记 (1)进程控制入门
想进行Linux系统开发已经很久了,一直没有付诸实践.今日终于开始学习Linux下的C语言编程,研究一天,终于大概弄明白了Linux系统进程管理的一些基本概念和编程方法,总结下来以方便大家学习和自己实 ...
- PYTHON 学习笔记2 流程控制工具以及函数定义、匿名函数
前言 在上一节的学习中.已经介绍了几种基本类型.包括字符串的定义,以及字符串中索引.切片.字符串拼接的使用方法.以及基本的整形数据运算.一些之前都没有了解过的运算符.比如 ** 乘方 //整数除法等. ...
- Java学习笔记五——流程控制
分支结构 Java提供了两种常见的分支控制结构:if语句和switch语句. if语句 if语句使用布尔值或布尔表达式(表达式结果为布尔值),if语句有3中形式: 第一种形式: if (5 > ...
- PHP学习笔记2-流程控制
条件控制:if <?php function getLevel($score){ if($score>=90){ return "优秀"; }elseif($score ...
- StackExchange.Redis学习笔记(四) 事务控制和Batch批量操作
Redis事物 Redis命令实现事务 Redis的事物包含在multi和exec(执行)或者discard(回滚)命令中 和sql事务不同的是,Redis调用Exec只是将所有的命令变成一个单元一起 ...
- 【原】Java学习笔记007 - 流程控制
package cn.temptation; public class Sample01 { public static void main(String[] args) { // for循环 // ...
随机推荐
- SqlServer基础语法(二)
先看一下腰实现的功能:
- 删除一个存在的RabbitMQ队列
import sys # pip install kafka-python sys.path.append("/usr/local/software/ELK") from Util ...
- POJ 2139 Six Degrees of Cowvin Bacon (Floyd)
题意:如果两头牛在同一部电影中出现过,那么这两头牛的度就为1, 如果这两头牛a,b没有在同一部电影中出现过,但a,b分别与c在同一部电影中出现过,那么a,b的度为2.以此类推,a与b之间有n头媒介牛, ...
- win10定时执行php脚本
转自http://www.cnblogs.com/wenhainan/p/6962089.html 第一步:确认windows上是否配置好了php环境变量,我用xampp安装的lamp环境,默认已经配 ...
- 【前端基础系列】理解GET与POST请求区别
语义区别 GET请求用于获取数据 POST请求用于提交数据 缓存 GET请求能被缓存,以相同的URL再去GET请求会返回304 POST请求不能缓存 数据长度 HTTP协议从未规定过GET/POST请 ...
- SVN提交,提示“remains in conflict”错误
SVN commit时,提示"remains in conflict"错误: 1.error出现原因: 在本地项目删除了一个目录,又通过SVN的"Repo-browser ...
- tarjan 算法求强连通分量
#include<bits/stdc++.h> #define ll long long using namespace std; const int P=1e6; ; ; const i ...
- 完美的mysql备份脚本
转自:https://www.cnblogs.com/leffss/p/7832047.html #!/bin/bash #全备方式,一般在从机上执行,适用于小中型mysql数据库 #删除15天以前备 ...
- 003 关于shell基础,大数据的前期准备
一:正则表达式 1.通配符与正则表达式的区别 通配符有 *,?,[]. 区别: 通配符用来匹配文件名 正则表达式是为了匹配字符串 2.“.*”的意思 .:任意字符 *:匹配前一个字符任意次 3.过滤出 ...
- 日常推荐大神操作,如何再oracle中delete数据后恢复
http://blog.csdn.net/wangdinghai365/article/details/8593869