MoveJointsToPosition.cpp
Go to the documentation of this file.
1 #include "MoveJointsToPosition.h"
2 
4 
5 namespace armarx::skills
6 {
7  namespace
8  {
9  joint_control::arondto::MoveJointsToPositionAcceptedType
10  GetDefaultParameterization()
11  {
12  joint_control::arondto::MoveJointsToPositionAcceptedType ret;
13  ret.jointTargetTolerance = 0.05;
14  return ret;
15  }
16  } // namespace
17 
18  SkillDescription MoveJointsToPosition::Description = skills::SkillDescription{
19  "MoveJointsToPosition",
20  "Move the joints to position",
21  {},
23  joint_control::arondto::MoveJointsToPositionAcceptedType::ToAronType(),
24  GetDefaultParameterization().toAron()};
25 
27  JointControlSkillContext& context) :
28  JointControlSkill(mns, context),
29  mixin::RobotReadingSkillMixin(mns),
30  PeriodicSimpleSpecializedSkill<joint_control::arondto::MoveJointsToPositionAcceptedType>(
31  Description,
32  armarx::core::time::Frequency::Hertz(10))
33  {
34  }
35 
36  void
37  MoveJointsToPosition::reset()
38  {
39  already_running = false;
40  }
41 
42  Skill::InitResult
43  MoveJointsToPosition::init(const SpecializedInitInput& in)
44  {
46  return {.status = TerminatedSkillStatus::Succeeded};
47  }
48 
49  PeriodicSkill::StepResult
50  MoveJointsToPosition::step(const SpecializedMainInput& in)
51  {
52  auto robot = robotReader.queryState({in.parameters.robotName}, armem::Time::Now());
53  if (!robot)
54  {
55  ARMARX_WARNING << "Unable to get robot from robotstatememory. Abort.";
56  return {ActiveOrTerminatedSkillStatus::Failed, nullptr};
57  }
58 
59  if ((armem::Time::Now() - robot->timestamp).toMilliSeconds() > 300)
60  {
61  ARMARX_WARNING << deactivateSpam(1) << "Robot from Memory is too old. Try again.";
63  }
64 
65  std::map<std::string, float> filteredTargets;
66  auto currentValues = robot->jointMap;
67  for (const auto& [key, val] : in.parameters.targetJointMap)
68  {
69  if (const auto& it = currentValues.find(key); it != currentValues.end())
70  {
71  ARMARX_INFO << deactivateSpam(1) << "Current value of " << key << " is "
72  << it->second << " and it will be set to " << val;
73  filteredTargets.insert({key, val});
74  }
75  }
76 
77  if (filteredTargets.size() == 0)
78  {
79  return {ActiveOrTerminatedSkillStatus::Failed, nullptr};
80  }
81 
82  auto currentJointValueTolerance = in.parameters.jointTargetTolerance;
84  << "Joint target tolerance: " << currentJointValueTolerance;
85 
86  auto currentMaxDelta = std::numeric_limits<float>::max();
87 
88  robot = robotReader.queryState({in.parameters.robotName}, armem::Time::Now());
89 
90  currentValues = robot->jointMap;
91  float maxDeltaTmp = 0;
92  for (const auto& [key, value] : filteredTargets)
93  {
94  const float delta = fabs((value - currentValues.at(key)));
95  maxDeltaTmp = std::max(delta, maxDeltaTmp);
96  }
97  currentMaxDelta = maxDeltaTmp;
98 
99  ARMARX_IMPORTANT << deactivateSpam(1) << "Current joint values are: \n" << currentValues;
100  ARMARX_IMPORTANT << deactivateSpam(1) << "MaxDelta is: " << currentMaxDelta;
101 
102  if (currentMaxDelta <= currentJointValueTolerance)
103  {
105  }
106 
107  if (!already_running)
108  {
109  already_running = true;
110 
111  NameControlModeMap controlModes;
112  for (const auto& p : filteredTargets)
113  {
114  controlModes[p.first] = ePositionControl;
115  }
116  context.kinematicUnitPrx->switchControlMode(controlModes);
117 
118  context.kinematicUnitPrx->setJointAngles(filteredTargets);
119  }
120  return {ActiveOrTerminatedSkillStatus::Running, nullptr};
121  }
122 
123  Skill::ExitResult
124  MoveJointsToPosition::exit(const SpecializedExitInput& in)
125  {
126  std::vector<std::string> joints;
127  std::for_each(in.parameters.targetJointMap.begin(),
128  in.parameters.targetJointMap.end(),
129  [&joints](const std::pair<std::string, float>& p)
130  { joints.push_back(p.first); });
131 
132  stopJointMovement(joints);
133 
134  return {.status = TerminatedSkillStatus::Succeeded};
135  }
136 } // namespace armarx::skills
armarx::skills::JointControlSkill
Definition: JointControlSkill.h:62
armarx::aron::ret
ReaderT::InputType T & ret
Definition: rw.h:13
armarx::skills::TerminatedSkillStatus::Succeeded
@ Succeeded
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:190
armarx::skills::ActiveOrTerminatedSkillStatus::Succeeded
@ Succeeded
armarx::skills::ActiveOrTerminatedSkillStatus::Failed
@ Failed
armarx::skills
This file is part of ArmarX.
Definition: PeriodicUpdateWidget.cpp:11
armarx::core::time::DateTime::Now
static DateTime Now()
Definition: DateTime.cpp:51
armarx::skills::mixin::RobotReadingSkillMixin::robotReader
armem::robot_state::VirtualRobotReader robotReader
Definition: RobotReadingSkillMixin.h:11
armarx::core::time::Frequency
Represents a frequency.
Definition: Frequency.h:16
armarx::armem::robot_state::RobotReader::connect
virtual void connect(armem::client::MemoryNameSystem &memoryNameSystem)
Definition: RobotReader.cpp:49
deactivateSpam
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
Definition: Logging.cpp:75
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:855
armarx::skills::JointControlSkillContext
Definition: JointControlSkill.h:48
MoveJointsToPosition.h
max
T max(T t1, T t2)
Definition: gdiam.h:51
armarx::skills::ActiveOrTerminatedSkillStatus::Running
@ Running
armarx::skills::MoveJointsToPosition::MoveJointsToPosition
MoveJointsToPosition(armem::client::MemoryNameSystem &mns, JointControlSkillContext &context)
Definition: MoveJointsToPosition.cpp:26
JointControlUtil.h
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::skills::JointControlSkill::stopJointMovement
TerminatedSkillStatus stopJointMovement(const std::vector< std::string > &joints)
Definition: JointControlSkill.h:70
armarx::skills::JointControlSkillContext::kinematicUnitPrx
KinematicUnitInterfacePrx kinematicUnitPrx
Definition: JointControlSkill.h:51
armarx::armem::client::MemoryNameSystem
The memory name system (MNS) client.
Definition: MemoryNameSystem.h:68
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::armem::robot_state::RobotReader::queryState
std::optional< RobotState > queryState(const std::string &robotName, const armem::Time &timestamp) const
Definition: RobotReader.cpp:190
armarx::skills::JointControlSkill::context
JointControlSkillContext & context
Definition: JointControlSkill.h:85
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::core::time::Duration::MilliSeconds
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition: Duration.cpp:48
armarx::skills::MoveJointsToPosition::Description
static SkillDescription Description
Definition: MoveJointsToPosition.h:50