Skip to content
Snippets Groups Projects

Implement 'PointAt'-skill

Merged Patrick Dormanns requested to merge feat/pointing-skill into main
3 files
+ 38
18
Compare changes
  • Side-by-side
  • Inline
Files
3
#include "Pointing.h"
#include <VirtualRobot/RobotNodeSet.h>
#include <ArmarXCore/core/time.h>
#include <RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h>
@@ -32,23 +34,18 @@ namespace armarx::control::pointing::core
armarx::TrajectoryPtr traj = computTrajectory(robot, params.side, target);
addWristTrajectory(robot, params.side, traj);
if (params.handShape)
{
auto shapeJointValues = GetShapeJointValues(robot, params.side, *params.handShape);
addHandTrajectory(robot, traj, shapeJointValues);
}
if (traj->dim() > 0)
{
traj = traj->calculateTimeOptimalTrajectory(
params.maxVelocity, params.maxAcceleration, 0.0, IceUtil::Time::milliSeconds(10));
traj = traj->calculateTimeOptimalTrajectory(
params.maxVelocity, params.maxAcceleration, 0.0, IceUtil::Time::milliSeconds(10));
playTrajectory(traj);
}
else
{
ARMARX_INFO << "Already pointing at target";
}
playTrajectory(traj);
}
void
@@ -96,16 +93,37 @@ namespace armarx::control::pointing::core
}
ARMARX_VERBOSE << "Done computing trajectory";
if (traj->size() == 1) // already pointing at target
if (traj->size() == 1) // forearm already aligned with target
{
return armarx::TrajectoryPtr(new Trajectory);
}
return traj;
}
void
Pointing::addWristTrajectory(VirtualRobot::RobotPtr robot, Side side, TrajectoryPtr traj)
{
auto humanMapping = robot->getHumanMapping();
ARMARX_CHECK(humanMapping) << "Robot '" << robot->getName() << "' has no human mapping";
auto armDescription = (side == LEFT) ? humanMapping->leftArm : humanMapping->rightArm;
auto wrist = armDescription.segments.wrist.nodeName;
auto nodeSetArm = robot->getRobotNodeSet(armDescription.nodeSet);
// iterate over all joints, starting from the wrist, to move them into a neutral position
std::for_each(nodeSetArm->begin() + nodeSetArm->getRobotNodeIndex(wrist),
nodeSetArm->end(),
[traj](VirtualRobot::RobotNodePtr robotNode) {
traj->addDimension({robotNode->getJointValue(), 0.0},
Ice::DoubleSeq(),
robotNode->getName());
});
}
void
Pointing::addHandTrajectory(VirtualRobot::RobotPtr robot,
armarx::TrajectoryPtr& traj,
armarx::TrajectoryPtr traj,
const std::map<std::string, float>& shapeJointValues)
{
for (const auto& [jointName, targetValue] : shapeJointValues)
Loading