Skip to content
Snippets Groups Projects

Improve armar7 platform movement

Merged Tobias Gröger requested to merge feature/improve-armar7-platform-movement into master
All threads resolved!
Compare and Show latest version
2 files
+ 94
31
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -31,7 +31,8 @@ namespace armarx
NJointHolonomicPlatformVelocityControllerWithRamp::
NJointHolonomicPlatformVelocityControllerWithRamp(RobotUnit* prov,
ConfigPtrT cfg,
const VirtualRobot::RobotPtr&)
const VirtualRobot::RobotPtr&) :
ramp(cfg->maxPositionAcceleration, cfg->maxOrientationAcceleration)
{
target = useControlTarget(cfg->platformName, ControlModes::HolonomicPlatformVelocity)
->asA<ControlTargetHolonomicPlatformVelocity>();
@@ -45,8 +46,8 @@ namespace armarx
ARMARX_CHECK_EXPRESSION(velocitySensor)
<< "Sensor value for " << cfg->platformName << " has invalid type";
ramp.setMaxPositionAcceleration(cfg->maxPositionAcceleration);
ramp.setMaxOrientationAcceleration(cfg->maxOrientationAcceleration);
// ramp.setMaxPositionAcceleration(cfg->maxPositionAcceleration);
// ramp.setMaxOrientationAcceleration(cfg->maxOrientationAcceleration);
}
void
@@ -57,15 +58,14 @@ namespace armarx
const float velRot = velocitySensor->velocityRotation;
// init velocity ramp
Eigen::VectorXf state(6);
state << velX, velY, 0, 0, 0, velRot;
ramp.setState(state, VirtualRobot::IKSolver::CartesianSelection::All);
ramp.init(Eigen::Vector3f(velX, velY, velRot));
NJointHolonomicPlatformVelocityControllerControlData data;
data.velocityX = velX;
data.velocityY = velY;
data.velocityRotation = velRot;
reinitTripleBuffer(data);
setControlStruct(data);
// reinitTripleBuffer(data);
}
void
@@ -73,29 +73,29 @@ namespace armarx
const IceUtil::Time& sensorValuesTimestamp,
const IceUtil::Time& timeSinceLastIteration)
{
// auto commandAge = sensorValuesTimestamp - rtGetControlStruct().commandTimestamp;
// if (commandAge > maxCommandDelay && // command must be recent
// (rtGetControlStruct().velocityX != 0.0f || rtGetControlStruct().velocityY != 0.0f ||
// rtGetControlStruct().velocityRotation !=
// 0.0f)) // only throw error if any command is not zero
// {
// throw LocalException(
// "Platform target velocity was not set for a too long time: delay: ")
// << commandAge.toSecondsDouble()
// << " s, max allowed delay: " << maxCommandDelay.toSecondsDouble() << " s";
// }
// else
// {
Eigen::VectorXf x(6);
x << rtGetControlStruct().velocityX, rtGetControlStruct().velocityY, 0, 0, 0,
rtGetControlStruct().velocityRotation;
Eigen::VectorXf result = ramp.update(x, timeSinceLastIteration.toSecondsDouble());
target->velocityX = result(0);
target->velocityY = result(1);
target->velocityRotation = result(5);
// }
auto commandAge = sensorValuesTimestamp - rtGetControlStruct().commandTimestamp;
if (commandAge > maxCommandDelay && // command must be recent
(rtGetControlStruct().velocityX != 0.0f || rtGetControlStruct().velocityY != 0.0f ||
rtGetControlStruct().velocityRotation !=
0.0f)) // only throw error if any command is not zero
{
throw LocalException(
"Platform target velocity was not set for a too long time: delay: ")
<< commandAge.toSecondsDouble()
<< " s, max allowed delay: " << maxCommandDelay.toSecondsDouble() << " s";
}
else
{
Eigen::Vector3f x(rtGetControlStruct().velocityX,
rtGetControlStruct().velocityY,
rtGetControlStruct().velocityRotation);
Eigen::VectorXf result = ramp.update(x, timeSinceLastIteration.toSecondsDouble());
target->velocityX = result(0);
target->velocityY = result(1);
target->velocityRotation = result(2);
}
}
void
@@ -110,4 +110,49 @@ namespace armarx
NJointControllerRegistration<NJointHolonomicPlatformVelocityControllerWithRamp>
registrationNJointHolonomicPlatformVelocityControllerWithRamp(
"NJointHolonomicPlatformVelocityControllerWithRamp");
RtRamp::RtRamp(float maxPos, float maxRot) :
maxPositionAcceleration(maxPos), maxOrientationAcceleration(maxRot)
{
}
void
RtRamp::init(const Eigen::Vector3f& state)
{
this->state = state;
}
Eigen::Vector3f
RtRamp::update(const Eigen::Vector3f& target, float dt)
{
if (dt <= 0)
{
return state;
}
Eigen::Vector3f delta = target - state;
float factor = 1;
Eigen::Vector2f posDelta = delta.block<2, 1>(0, 0);
float posFactor = posDelta.norm() / maxPositionAcceleration / dt;
factor = std::max(factor, posFactor);
float oriFactor = std::abs(delta(3)) / maxOrientationAcceleration / dt;
factor = std::max(factor, oriFactor);
state += delta / factor;
return state;
}
void
RtRamp::setMaxPositionAcceleration(float maxPositionAcceleration)
{
this->maxPositionAcceleration = maxPositionAcceleration;
}
void
RtRamp::setMaxOrientationAcceleration(float maxOrientationAcceleration)
{
this->maxOrientationAcceleration = maxOrientationAcceleration;
}
} // namespace armarx
Loading