MoveJointsWithVelocity.cpp
Go to the documentation of this file.
2
4
6
8{
9
11 ::armarx::skills::SimpleSpecializedSkill<ParamType>(GetSkillDescription()), srv_(srv)
12 {
13 }
14
15 std::map<std::string, float>
16 MoveJointsWithVelocity::filterJointTargetValues(
17 const NameValueMap& jointsTargetValues,
18 const std::vector<std::string>& disabledJoints) const
19 {
20 std::map<std::string, float> filtered;
21 for (const auto& [jointName, v] : jointsTargetValues)
22 {
23 if (std::find(disabledJoints.begin(), disabledJoints.end(), jointName) !=
24 disabledJoints.end())
25 {
26 ARMARX_INFO << "Disable joint " << jointName
27 << " because it was explictly disabled in skill params.";
28 continue;
29 }
30 filtered[jointName] = v;
31 }
32 return filtered;
33 }
34
36 MoveJointsWithVelocity::exit(const SpecializedExitInput& in)
37 {
38 auto filtered = this->filterJointTargetValues(in.parameters.jointsTargetVelocities,
39 in.parameters.disabledJoints);
40
41 auto jointNames = simox::alg::get_keys(filtered);
42
43 for (auto& [k, v] : filtered)
44 {
45 filtered[k] = 0.0;
46 }
47
48 srv_.kinematicUnit->setJointVelocities(filtered);
49
50 srv_.kinematicUnit->releaseJoints(jointNames);
52 }
53
54 ::armarx::skills::Skill::MainResult
55 MoveJointsWithVelocity::main(const SpecializedMainInput& in)
56 {
57 auto filtered = this->filterJointTargetValues(in.parameters.jointsTargetVelocities,
58 in.parameters.disabledJoints);
59
60 auto jointNames = simox::alg::get_keys(filtered);
61
62 // request joints
63 ARMARX_INFO << "Requesting joints";
64 try
65 {
66 srv_.kinematicUnit->requestJoints(jointNames);
67 }
68 catch (const armarx::KinematicUnitUnavailable& e)
69 {
70 ARMARX_IMPORTANT << "Failed to request joints. Terminating. Joints unavailable:"
71 << e.nodeOwners;
72 return MakeFailedResult();
73 }
74
75 // move joints
76 ARMARX_INFO << "Moving joints with vel " << filtered;
77
78 switchControlMode(filtered, eVelocityControl);
79
80 moveJoints(filtered, in.parameters.duration);
81 return MakeSucceededResult();
82 }
83
84 void
85 MoveJointsWithVelocity::switchControlMode(const NameValueMap& jointsTargetValues,
86 const ControlMode controlMode)
87 {
88 armarx::NameControlModeMap modeMap;
89 for (const auto& [jointName, _] : jointsTargetValues)
90 {
91 modeMap[jointName] = controlMode;
92 }
93 srv_.kinematicUnit->switchControlMode(modeMap);
94 }
95
96 void
97 MoveJointsWithVelocity::moveJoints(const NameValueMap& jointsTargetVelocities,
98 const armarx::core::time::Duration& dur)
99 {
100 srv_.kinematicUnit->setJointVelocities(jointsTargetVelocities);
101
102 const Clock clock;
103 const Duration sleepTime = Duration::MilliSeconds(50);
104
107 {
109 clock.waitFor(sleepTime);
110 }
111 }
112
113} // namespace armarx::control::skills::skills
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition Duration.cpp:48
static DateTime Now()
Definition DateTime.cpp:51
armarx::core::time::DateTime started
Definition Skill.h:356
static MainResult MakeSucceededResult(aron::data::DictPtr data=nullptr)
Definition Skill.cpp:413
virtual MainResult main()
Override this method with the actual implementation.
Definition Skill.cpp:542
void throwIfSkillShouldTerminate(const std::string &abortedMessage="") const
Definition Skill.cpp:389
virtual ExitResult exit()
Override this method with the actual implementation.
Definition Skill.cpp:535
static MainResult MakeFailedResult(aron::data::DictPtr data=nullptr)
Definition Skill.cpp:422
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
Definition Logging.h:190
armarx::core::time::Duration Duration
This file offers overloads of toIce() and fromIce() functions for STL container types.
This file is part of ArmarX.
std::chrono::system_clock Clock
Definition Stopwatch.h:10
A result struct for skill exit function.
Definition Skill.h:69