PutdownObject.cpp
Go to the documentation of this file.
1#include <SimoxUtility/algorithm/string/string_tools.h>
2#include "PutdownObject.h"
3
4#include <VirtualRobot/Grasping/GraspSet.h>
5#include <VirtualRobot/ManipulationObject.h>
6#include <VirtualRobot/RobotNodeSet.h>
7
10
11namespace armarx::skills
12{
13 namespace
14 {
15 grasp_object::arondto::PutdownObjectAcceptedType
16 GetDefaultParameterization()
17 {
18 grasp_object::arondto::PutdownObjectAcceptedType ret;
19 ret.platformOrientationalAccuracy = 0.1;
20 ret.platformPositionalAccuracy = 10;
21 ret.tcpOrientationalAccuracy = 0.1;
22 ret.tcpPositionalAccuracy = 20;
23 return ret;
24 }
25 } // namespace
26
27 SkillDescription PutdownObjectSkill::Description = skills::SkillDescription{
28 .skillId = {.skillName = "PutdownObject"},
29 .description = "Putdown an object already in hand of robot",
30 .rootProfileDefaults = GetDefaultParameterization().toAron(),
31 .timeout = armarx::Duration::MilliSeconds(40000),
32 .parametersType = grasp_object::arondto::PutdownObjectAcceptedType::ToAronType(),
33 };
34
42
44 PutdownObjectSkill::main(const SpecializedMainInput& in)
45 {
50
51 robotReader.connect(mns);
52 objectReader.connect(mns);
53 graspReader.connect(mns);
54 objectWriter.connect(mns);
55
56 // //////////////////////////////
57 // get robot
58 // //////////////////////////////
59 auto robot =
60 robotReader.getSynchronizedRobot(in.parameters.robotName,
62 VirtualRobot::RobotIO::RobotDescription::eStructure);
63
64 // //////////////////////////////
65 // get object pose
66 // //////////////////////////////
67 auto objInstance = objectReader.queryLatestObjectInstance(in.parameters.objectEntityId);
68 if (!objInstance)
69 {
70 ARMARX_ERROR << "Lost object pose.";
71 return {TerminatedSkillStatus::Failed, nullptr};
72 }
73
74
75 ARMARX_CHECK(objInstance->attachment->agentName == in.parameters.robotName);
76
77 std::string kinematicChainName = "LeftArm";
78 if (simox::alg::ends_with(objInstance->attachment->frameName, " R"))
79 {
80 kinematicChainName = "RightArm";
81 }
82
83
84 // //////////////////////////////
85 // Call subskills
86 // //////////////////////////////
87 // Move into a besser position
88 {
89 skills::grasp_object::arondto::MovePlatformForPutdownAcceptedType params;
90 params.robotName = in.parameters.robotName;
91 params.orientationalAccuracy = in.parameters.platformOrientationalAccuracy;
92 params.positionalAccuracy = in.parameters.platformPositionalAccuracy;
93 params.objectEntityId = in.parameters.objectEntityId;
94 params.tcpName = robot->getRobotNodeSet(kinematicChainName)->getTCP()->getName();
95
96 SkillProxy prx(manager, SkillID{
97 .providerId = ProviderID{.providerName = context.graspControlSkillProvider},
99
100 if (prx.executeSkill(in.executorName, params.toAron())
102 {
103 return {TerminatedSkillStatus::Failed, nullptr};
104 }
105 }
106
107 // Execute Putdown motions
108 {
109 skills::grasp_object::arondto::ExecutePutdownAcceptedType params;
110 params.robotName = in.parameters.robotName;
111 params.orientationalAccuracy = in.parameters.platformOrientationalAccuracy;
112 params.positionalAccuracy = in.parameters.platformPositionalAccuracy;
113 params.objectEntityId = in.parameters.objectEntityId;
114
115 SkillProxy prx(manager, SkillID{
116 .providerId = ProviderID{.providerName = context.graspControlSkillProvider},
118
119 if (prx.executeSkill(in.executorName, params.toAron())
121 {
122 return {TerminatedSkillStatus::Failed, nullptr};
123 }
124 }
125
126 // Open hand and detach from memory
127 {
128 skills::grasp_object::arondto::OpenHandAndDetachAcceptedType params;
129 params.kinematicChainName = kinematicChainName;
130 params.objectEntityId = in.parameters.objectEntityId;
131 params.robotName = in.parameters.robotName;
132
133 SkillProxy prx(manager, SkillID{
134 .providerId = ProviderID{.providerName = context.graspControlSkillProvider},
136
137 if (prx.executeSkill(in.executorName, params.toAron())
139 {
140 return {TerminatedSkillStatus::Failed, nullptr};
141 }
142 }
143
144 // Move TCP a bit up
145 {
146 ARMARX_CHECK(robotReader.synchronizeRobot(*robot, armem::Time::Now()));
147
148 Eigen::Matrix4f tcpOffset = Eigen::Matrix4f::Identity();
149 tcpOffset(0, 3) = 90;
150 tcpOffset(1, 3) = 10;
151
152 Eigen::Matrix4f tcpTargetPoseGlobal =
153 robot->getRobotNodeSet(kinematicChainName)->getTCP()->getGlobalPose() * tcpOffset;
154
155 skills::tcp_control::arondto::MoveTCPToTargetPoseAcceptedType params;
156 params.robotName = in.parameters.robotName;
157 params.kinematicChainName = kinematicChainName;
158 params.targetPoseGlobal = tcpTargetPoseGlobal;
159 params.orientationalAccuracy = in.parameters.tcpOrientationalAccuracy;
160 params.positionalAccuracy = in.parameters.tcpPositionalAccuracy;
161
162 SkillProxy prx(manager, SkillID{
163 .providerId = ProviderID{.providerName = context.tcpControlSkillProvider},
165
166 if (prx.executeSkill(in.executorName, params.toAron())
168 {
169 return {TerminatedSkillStatus::Failed, nullptr};
170 }
171 }
172
173 // Move joints to zero position
174 {
175 skills::joint_control::arondto::MoveJointsToPositionAcceptedType params;
176 params.robotName = in.parameters.robotName;
177 params.jointTargetTolerance = 0.03;
178 params.jointMaxSpeed = 0.75;
179 params.accelerationTime = 500;
180 params.setVelocitiesToZeroAtEnd = true;
181
182 for (const auto& j : robot->getRobotNodeSet(kinematicChainName)->getAllRobotNodes())
183 {
184 params.targetJointMap[j->getName()] = 0.0;
185 }
186
187 SkillProxy prx(manager, SkillID{
188 .providerId = ProviderID{.providerName = context.jointControlSkillProvider},
190
191 if (prx.executeSkill(in.executorName, params.toAron())
193 {
194 return {TerminatedSkillStatus::Failed, nullptr};
195 }
196 }
197
198 // Move platform back
199 {
200 skills::grasp_object::arondto::MovePlatformAfterPutdownAcceptedType params;
201 params.robotName = in.parameters.robotName;
202 params.orientationalAccuracy = in.parameters.platformOrientationalAccuracy;
203 params.positionalAccuracy = in.parameters.platformPositionalAccuracy;
204
205 SkillProxy prx(manager, SkillID{
206 .providerId = ProviderID{.providerName = context.graspControlSkillProvider},
208
209 if (prx.executeSkill(in.executorName, params.toAron())
211 {
212 return {TerminatedSkillStatus::Failed, nullptr};
213 }
214 }
215
216 clearLayer();
217 return {TerminatedSkillStatus::Succeeded, nullptr};
218 }
219} // namespace armarx::skills
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition Duration.cpp:48
The memory name system (MNS) client.
void connect(armem::client::MemoryNameSystem &memoryNameSystem)
std::optional< objpose::ObjectPose > queryLatestObjectInstance(const ObjectID &instanceId)
void connect(armem::client::MemoryNameSystem &memoryNameSystem)
void connect(armem::client::MemoryNameSystem &memoryNameSystem)
virtual void connect(armem::client::MemoryNameSystem &memoryNameSystem)
VirtualRobot::RobotPtr getSynchronizedRobot(const std::string &name, const VirtualRobot::RobotIO::RobotDescription &loadMode=VirtualRobot::RobotIO::RobotDescription::eStructure, bool blocking=true)
bool synchronizeRobot(VirtualRobot::Robot &robot, const armem::Time &timestamp) const
Synchronize both the platform pose and the joint values of a virtual robot, according to the robot st...
static DateTime Now()
Definition DateTime.cpp:51
static SkillDescription Description
static SkillDescription Description
PutdownObjectSkill(armem::client::MemoryNameSystem &mns, armarx::viz::Client &arviz, TwoArmGraspControlSkillContext &)
grasp_object::arondto::PutdownObjectAcceptedType ArgType
std::string skillName
Definition SkillID.h:41
manager::dti::SkillManagerInterfacePrx manager
Definition Skill.h:363
virtual MainResult main()
Override this method with the actual implementation.
Definition Skill.cpp:542
TwoArmGraspControlSkill(armem::client::MemoryNameSystem &mns, armarx::viz::Client &arviz, const std::string &layerName, TwoArmGraspControlSkillContext &c)
TwoArmGraspControlSkillContext & context
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
Definition Logging.h:196
This file is part of ArmarX.
A result struct for th main method of a skill.
Definition Skill.h:62
armem::client::MemoryNameSystem & mns