MovePlatformToPose.cpp
Go to the documentation of this file.
2
4
5#include "util/PlatformUtil.h"
6
7namespace armarx::skills
8{
9 namespace
10 {
11 platform_control::arondto::MovePlatformToPoseAcceptedType
12 GetDefaultParameterization()
13 {
14 platform_control::arondto::MovePlatformToPoseAcceptedType ret;
15 ret.orientationalAccuracy = 0.1;
16 ret.positionalAccuracy = 100;
17 return ret;
18 }
19 } // namespace
20
21 SkillDescription MovePlatformToPose::Description = skills::SkillDescription{
22 "MovePlatformToPosition",
23 "Move a platform unit to target pos.",
24 {},
26 platform_control::arondto::MovePlatformToPoseAcceptedType::ToAronType(),
27 GetDefaultParameterization().toAron()};
28
38
40 MovePlatformToPose::init(const SpecializedInitInput& in)
41 {
42 // setup memory reader
44
45 return {.status = TerminatedSkillStatus::Succeeded};
46 }
47
48 Skill::ExitResult
49 MovePlatformToPose::exit(const SpecializedExitInput& in)
50 {
52 clearLayer();
53
54 return {.status = TerminatedSkillStatus::Succeeded};
55 }
56
58 MovePlatformToPose::step(const SpecializedMainInput& in)
59 {
60 clearLayer();
61
62 {
63 auto l = arviz.layer(layerName);
64 auto a = armarx::viz::Sphere("MovePlatformToPose::targetPose");
65 a.pose(in.parameters.pose);
66 a.radius(40);
67 a.color(viz::Color::yellow());
68 l.add(a);
69 arviz.commit(l);
70 }
71
72 auto robot =
73 robotReader.getSynchronizedRobot(in.parameters.robotName,
75 VirtualRobot::RobotIO::RobotDescription::eStructure);
76 if (!robot)
77 {
78 ARMARX_WARNING << "Unable to get robot from robotstatememory. Abort.";
80 }
81
82 FramedPosePtr robotPose = new FramedPose(robot->getRootNode()->getPoseInRootFrame(),
83 robot->getRootNode()->getName(),
84 robot->getName());
85 auto robotPoseGlobalEigen = robotPose->toGlobalEigen(robot);
86
87 float targetX = in.parameters.pose(0, 3);
88 float targetY = in.parameters.pose(1, 3);
89
90 Eigen::Matrix3f targetRotMat = in.parameters.pose.block<3, 3>(0, 0);
91 Eigen::Vector3f targetRotMatX = targetRotMat * Eigen::Vector3f::UnitX();
92 float targetOri = atan2(targetRotMatX[1], targetRotMatX[0]);
93 if (targetOri > M_PI) // normalize
94 {
95 targetOri = -2 * M_PI + targetOri;
96 }
97
98 float robotX = robotPoseGlobalEigen(0, 3);
99 float robotY = robotPoseGlobalEigen(1, 3);
100
101 Eigen::Matrix3f robotRotMat = robotPoseGlobalEigen.block<3, 3>(0, 0);
102 Eigen::Vector3f robotRotMatX = robotRotMat * Eigen::Vector3f::UnitX();
103 float robotOri = atan2(robotRotMatX[1], robotRotMatX[0]);
104 if (robotOri > M_PI) // normalize
105 {
106 robotOri = -2 * M_PI + robotOri;
107 }
108
109 ARMARX_INFO << deactivateSpam() << "Platform current pose: (" << robotX << ", " << robotY
110 << ", " << robotOri << ")";
111 ARMARX_INFO << deactivateSpam() << "Platform target: (" << targetX << ", " << targetY
112 << ", " << targetOri << ")";
113
114 float translationalError =
115 (robotPoseGlobalEigen.block<3, 1>(0, 3) - Eigen::Vector3f(targetX, targetY, 0)).norm();
116 float orientationalError = targetOri - robotOri;
117
118 // transform alpha to [-pi, pi)
119 while (orientationalError < -M_PI)
120 {
121 orientationalError += 2 * M_PI;
122 }
123
124 while (orientationalError >= M_PI)
125 {
126 orientationalError -= 2 * M_PI;
127 }
128
129 ARMARX_INFO << deactivateSpam() << "Platform target position error: (" << translationalError
130 << ")";
131 ARMARX_INFO << deactivateSpam() << "Platform target orientation error: ("
132 << orientationalError << ")";
133
134 if (translationalError > in.parameters.positionalAccuracy or
135 orientationalError > in.parameters.orientationalAccuracy)
136 {
137 ARMARX_INFO << deactivateSpam() << "Platform position accuracy ("
138 << in.parameters.positionalAccuracy << ")";
139 ARMARX_INFO << deactivateSpam() << "Platform orientation accuracy: ("
140 << in.parameters.orientationalAccuracy << ")";
141 context.platformUnitPrx->moveTo(targetX,
142 targetY,
143 targetOri,
144 in.parameters.positionalAccuracy * 0.8,
145 in.parameters.orientationalAccuracy * 0.8);
147 }
149 }
150} // namespace armarx::skills
#define M_PI
Definition MathTools.h:17
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition Duration.cpp:48
SpamFilterDataPtr deactivateSpam(float deactivationDurationSec=10.0f, const std::string &identifier="", bool deactivate=true) const
disables the logging for the current line for the given amount of seconds.
Definition Logging.cpp:99
The memory name system (MNS) client.
virtual void connect(armem::client::MemoryNameSystem &memoryNameSystem)
static DateTime Now()
Definition DateTime.cpp:51
Represents a frequency.
Definition Frequency.h:17
MovePlatformToPose(armem::client::MemoryNameSystem &mns, armarx::viz::Client &arviz, PlatformControlSkillContext &context)
platform_control::arondto::MovePlatformToPoseAcceptedType ArgType
PlatformControlSkillContext & context
PlatformControlSkill(armem::client::MemoryNameSystem &mns, armarx::viz::Client &arviz, const std::string &layerName, PlatformControlSkillContext &c)
virtual InitResult init()
Override this method with the actual implementation.
Definition Skill.cpp:519
virtual ExitResult exit()
Override this method with the actual implementation.
Definition Skill.cpp:535
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:193
const VariantTypeId FramedPose
Definition FramedPose.h:36
double a(double t, double a0, double j)
Definition CtrlUtil.h:45
This file is part of ArmarX.
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceInternal::Handle< FramedPose > FramedPosePtr
Definition FramedPose.h:272
double norm(const Point &a)
Definition point.hpp:102
A result struct for skill initialization.
Definition Skill.h:50
armem::client::MemoryNameSystem mns
armem::robot_state::VirtualRobotReader robotReader