From 54a9a9c6c3b6c771c97d3caaed173dfc88fb86a7 Mon Sep 17 00:00:00 2001 From: Thomas Moulard <thomas.moulard@gmail.com> Date: Thu, 8 Sep 2011 10:59:43 +0200 Subject: [PATCH] Add support for velocity/acceleration/zmp computation in jrl-dynamics. --- .../sot/dynamics/humanoid_robot.py | 59 ++++++++++++++++--- 1 file changed, 50 insertions(+), 9 deletions(-) diff --git a/src/dynamic_graph/sot/dynamics/humanoid_robot.py b/src/dynamic_graph/sot/dynamics/humanoid_robot.py index 8fcab3b..527e296 100755 --- a/src/dynamic_graph/sot/dynamics/humanoid_robot.py +++ b/src/dynamic_graph/sot/dynamics/humanoid_robot.py @@ -15,6 +15,7 @@ # dynamic-graph. If not, see <http://www.gnu.org/licenses/>. from dynamic_graph.sot import SE3, R3, SO3 +from dynamic_graph.sot.core.derivator import Derivator_of_Vector from dynamic_graph.sot.core.feature_position import FeaturePosition from dynamic_graph.sot.core import RobotSimu, FeaturePoint6dRelative, \ FeatureGeneric, FeatureJointLimits, TaskPD, Constraint, GainAdaptive, SOT @@ -101,6 +102,22 @@ class AbstractHumanoidRobot (object): corresponding to operational points. """ + #FIXME: the following options are /not/ independent. + # zmp requires acceleration which requires velocity. + """ + Enable velocity computation. + """ + enableVelocityDerivator = False + """ + Enable acceleration computation. + """ + enableAccelerationDerivator = False + """ + Enable ZMP computation + """ + enableZmpComputation = False + + def loadModelFromKxml(self, name, filename): """ Load a model from a kxml file and return the parsed model. @@ -113,14 +130,8 @@ class AbstractHumanoidRobot (object): The parser also imports inertia matrices which is a non-standard property. """ - model = Parser(name, filename).parse() - model.setProperty('ComputeVelocity', 'true') - model.setProperty('ComputeCoM', 'true') - model.setProperty('ComputeAccelerationCoM', 'false') - model.setProperty('ComputeMomentum', 'false') - model.setProperty('ComputeZMP', 'true') - model.setProperty('ComputeBackwardDynamics', 'false') + self.setProperties(model) return model def loadModelFromJrlDynamics(self, name, modelDir, modelName, @@ -139,8 +150,22 @@ class AbstractHumanoidRobot (object): model.setFiles(modelDir, modelName, specificitiesPath, jointRankPath) model.parse() + self.setProperties(model) return model + def setProperties(self, model): + model.setProperty('ComputeVelocity', 'true') + model.setProperty('ComputeCoM', 'true') + model.setProperty('ComputeAccelerationCoM', 'false') + model.setProperty('ComputeMomentum', 'false') + model.setProperty('ComputeZMP', 'true') + model.setProperty('ComputeBackwardDynamics', 'false') + + if self.enableZmpComputation: + model.setProperty('ComputeAcceleration', 'true') + model.setProperty('ComputeBackwardDynamics', 'true') + model.setProperty('ComputeZMP', 'true') + def initializeOpPoints(self, model): for op in self.OperationalPoints: model.createOpPoint(op, op) @@ -166,8 +191,24 @@ class AbstractHumanoidRobot (object): # position in freeflyer frame. self.device.set(self.halfSitting) self.dynamic.position.value = self.halfSitting - self.dynamic.velocity.value = self.dimension*(0.,) - self.dynamic.acceleration.value = self.dimension*(0.,) + + if self.enableVelocityDerivator: + self.velocityDerivator = Derivator_of_Vector('velocityDerivator') + self.velocityDerivator.dt.value = 5e-3 + plug(self.dynamic.position, self.velocityDerivator.sin) + plug(self.velocityDerivator.sout, self.dynamic.velocity) + else: + self.dynamic.velocity.value = self.dimension*(0.,) + + if self.enableAccelerationDerivator: + self.accelerationDerivator = \ + Derivator_of_Vector('accelerationDerivator') + self.accelerationDerivator.dt.value = 5e-3 + plug(self.velocityDerivator.sout, + self.accelerationDerivator.sin) + plug(self.accelerationDerivator.sout, self.dynamic.acceleration) + else: + self.dynamic.acceleration.value = self.dimension*(0.,) self.initializeOpPoints(self.dynamic) -- GitLab