GraspObject.cpp
Go to the documentation of this file.
1#include "GraspObject.h"
2
3#include <VirtualRobot/Grasping/GraspSet.h>
4#include <VirtualRobot/ManipulationObject.h>
5#include <VirtualRobot/RobotNodeSet.h>
6
9
11
12namespace armarx::skills
13{
14 namespace
15 {
16 grasp_object::arondto::GraspObjectAcceptedType
17 GetDefaultParameterization()
18 {
19 grasp_object::arondto::GraspObjectAcceptedType ret;
20 ret.platformOrientationalAccuracy = 0.1;
21 ret.platformPositionalAccuracy = 10;
22 ret.tcpOrientationalAccuracy = 0.1;
23 ret.tcpPositionalAccuracy = 20;
24 return ret;
25 }
26 } // namespace
27
28 SkillDescription GraspObjectSkill::Description = skills::SkillDescription{
29 .skillId = {.skillName = "GraspObject"},
30 .description = "Grasp an object",
31 .rootProfileDefaults = GetDefaultParameterization().toAron(),
32 .timeout = armarx::Duration::MilliSeconds(120000),
33 .parametersType = grasp_object::arondto::GraspObjectAcceptedType::ToAronType(),
34 };
35
43
45 GraspObjectSkill::main(const SpecializedMainInput& in)
46 {
51
52 robotReader.connect(mns);
53 objectReader.connect(mns);
54 graspReader.connect(mns);
55 objectWriter.connect(mns);
56
57 // //////////////////////////////
58 // get robot
59 // //////////////////////////////
60 auto robot =
61 robotReader.getSynchronizedRobot(in.parameters.robotName,
63 VirtualRobot::RobotIO::RobotDescription::eStructure);
64 if (!robot)
65 {
66 ARMARX_ERROR << "Lost robot.";
67 return {TerminatedSkillStatus::Failed, nullptr};
68 }
69
70 // Relocalize the obj. May be removed later
71 {
72 skills::visual_search::arondto::WhatCanYouSeeNowAcceptedType params;
73 params.robotName = in.parameters.robotName;
74 params.objectEntityId = in.parameters.objectEntityId;
75
76 SkillProxy prx(manager, SkillID{
77 .providerId = ProviderID{.providerName = context.visualSearchSkillProvider},
79
80 if (prx.executeSkill(in.executorName, params.toAron()).status !=
82 {
83 return {TerminatedSkillStatus::Failed, nullptr};
84 }
85 }
86
87 // //////////////////////////////
88 // get object pose
89 // //////////////////////////////
90 auto objInstance = objectReader.queryLatestObjectInstance(in.parameters.objectEntityId);
91 if (!objInstance)
92 {
93 ARMARX_ERROR << "Lost object pose.";
94 return {TerminatedSkillStatus::Failed, nullptr};
95 }
96
97 // //////////////////////////////
98 // get all possible grasps
99 // //////////////////////////////
100 auto graspInfo = graspReader.queryKnownGraspInfoByEntityName(in.parameters.objectEntityId,
102 if (!graspInfo)
103 {
104 ARMARX_ERROR << "Lost grasp info.";
105 return {TerminatedSkillStatus::Failed, nullptr};
106 }
107
108 // //////////////////////////////
109 // select a kinematic chain
110 // //////////////////////////////
111 auto kinematicChainSelection =
113 {*objInstance, *robot});
114 if (kinematicChainSelection.kinematicChainName.empty())
115 {
116 ARMARX_ERROR << "No kinematic chain found! ";
117 return {TerminatedSkillStatus::Failed, nullptr};
118 }
119 else
120 {
121 ARMARX_INFO << "Using kinematic chain: " << kinematicChainSelection.kinematicChainName;
122 }
123
124 // //////////////////////////////
125 // select a grasp
126 // //////////////////////////////
128 {*graspInfo,
129 robot->getRobotNodeSet(kinematicChainSelection.kinematicChainName)
130 ->getTCP()
131 ->getName()});
132
133 if (graspSetSelection.graspSetName.empty())
134 {
135 ARMARX_ERROR << "No grasp info for object " << in.parameters.objectEntityId
136 << " found! ";
137 return {TerminatedSkillStatus::Failed, nullptr};
138 }
139 else
140 {
141 ARMARX_INFO << "Using grasp: " << graspSetSelection.graspSetName;
142 }
143
144 // //////////////////////////////
145 // CALL SUBSKILLS
146 // //////////////////////////////
147 // Open Hand async
148 {
149 skills::hand_control::arondto::OpenHandAcceptedType params;
150 params.kinematicChainName = kinematicChainSelection.kinematicChainName;
151
152 SkillProxy prx(manager, SkillID{
153 .providerId = ProviderID{.providerName = context.handControlSkillProvider},
155
156 //if (prx.executeSkill(in.executorName, params.toAron()).status != TerminatedSkillStatus::Succeeded)
157 //{
158 // return {TerminatedSkillStatus::Failed, nullptr};
159 //}
160 prx.executeSkillAsync(in.executorName, params.toAron());
161 }
162
163 // Move platform relative to obj
164 {
165 skills::grasp_object::arondto::MovePlatformForGraspAcceptedType params;
166 params.robotName = in.parameters.robotName;
167 params.orientationalAccuracy = in.parameters.platformOrientationalAccuracy;
168 params.positionalAccuracy = in.parameters.platformPositionalAccuracy;
169 params.objectEntityId = in.parameters.objectEntityId;
170 params.tcpName = kinematicChainSelection.tcpName;
171
172 SkillProxy prx(manager, SkillID{
173 .providerId = ProviderID{.providerName = context.graspControlSkillProvider},
175
176 if (prx.executeSkill(in.executorName, params.toAron())
178 {
179 return {TerminatedSkillStatus::Failed, nullptr};
180 }
181 }
182
183 // Execute the grasp set
184 {
185 skills::grasp_object::arondto::ExecuteGraspAcceptedType params;
186 params.robotName = in.parameters.robotName;
187 params.graspSetName = graspSetSelection.graspSetName;
188 params.objectEntityId = in.parameters.objectEntityId;
189 params.kinematicChainName = kinematicChainSelection.kinematicChainName;
190 params.orientationalAccuracy = in.parameters.tcpOrientationalAccuracy;
191 params.positionalAccuracy = in.parameters.tcpPositionalAccuracy;
192
193 SkillProxy prx(manager, SkillID{
194 .providerId = ProviderID{.providerName = context.graspControlSkillProvider},
196
197 if (prx.executeSkill(in.executorName, params.toAron())
199 {
200 return {TerminatedSkillStatus::Failed, nullptr};
201 }
202 }
203
204 // Close hand and attach to memory
205 {
206 skills::grasp_object::arondto::CloseHandAndAttachAcceptedType params;
207 params.kinematicChainName = kinematicChainSelection.kinematicChainName;
208 params.objectEntityId = in.parameters.objectEntityId;
209 params.robotName = in.parameters.robotName;
210
211 SkillProxy prx(manager, SkillID{
212 .providerId = ProviderID{.providerName = context.graspControlSkillProvider},
214
215 if (prx.executeSkill(in.executorName, params.toAron())
217 {
218 return {TerminatedSkillStatus::Failed, nullptr};
219 }
220 }
221
222 // Move TCP a bit up
223 {
224 ARMARX_CHECK(robotReader.synchronizeRobot(*robot, armem::Time::Now()));
225 auto tcpPoseGlobal =
226 robot->getRobotNode(kinematicChainSelection.tcpName)->getGlobalPose();
227
228 auto targetTCPPoseGlobal = tcpPoseGlobal;
229 targetTCPPoseGlobal(2, 3) += 100;
230
231 skills::tcp_control::arondto::MoveTCPToTargetPoseAcceptedType params;
232 params.robotName = in.parameters.robotName;
233 params.kinematicChainName = kinematicChainSelection.kinematicChainName;
234 params.targetPoseGlobal = targetTCPPoseGlobal;
235 params.orientationalAccuracy = in.parameters.tcpOrientationalAccuracy;
236 params.positionalAccuracy = in.parameters.tcpPositionalAccuracy;
237
238 SkillProxy prx(manager, SkillID{
239 .providerId = ProviderID{.providerName = context.tcpControlSkillProvider},
241
242 if (prx.executeSkill(in.executorName, params.toAron())
244 {
245 return {TerminatedSkillStatus::Failed, nullptr};
246 }
247 }
248
249 // Move joints to zero position
250 {
251 skills::joint_control::arondto::MoveJointsToPositionAcceptedType params;
252 params.robotName = in.parameters.robotName;
253 params.jointTargetTolerance = 0.03; // Todo
254 params.jointMaxSpeed = 0.75;
255 params.accelerationTime = 500;
256 params.setVelocitiesToZeroAtEnd = true;
257
258 for (const auto& j : robot->getRobotNodeSet(kinematicChainSelection.kinematicChainName)
259 ->getAllRobotNodes())
260 {
261 params.targetJointMap[j->getName()] = 0.0;
262 }
263
264 SkillProxy prx(manager, SkillID{
265 .providerId = ProviderID{.providerName = context.jointControlSkillProvider},
267
268 if (prx.executeSkill(in.executorName, params.toAron())
270 {
271 return {TerminatedSkillStatus::Failed, nullptr};
272 }
273 }
274
275 // Move platform relative after grasp
276 {
277 skills::grasp_object::arondto::MovePlatformAfterGraspAcceptedType params;
278 params.robotName = in.parameters.robotName;
279 params.orientationalAccuracy = in.parameters.platformOrientationalAccuracy;
280 params.positionalAccuracy = in.parameters.platformPositionalAccuracy;
281
282 SkillProxy prx(manager, SkillID{
283 .providerId = ProviderID{.providerName = context.graspControlSkillProvider},
285
286 if (prx.executeSkill(in.executorName, params.toAron())
288 {
289 return {TerminatedSkillStatus::Failed, nullptr};
290 }
291 }
292
293 clearLayer();
294
295 return {TerminatedSkillStatus::Succeeded, nullptr};
296 }
297} // 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.
std::optional< armem::grasping::arondto::KnownGraspInfo > queryKnownGraspInfoByEntityName(const std::string &, const armem::Time &)
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
grasp_object::arondto::GraspObjectAcceptedType ArgType
Definition GraspObject.h:31
static SkillDescription Description
Definition GraspObject.h:41
GraspObjectSkill(armem::client::MemoryNameSystem &mns, armarx::viz::Client &arviz, TwoArmGraspControlSkillContext &)
static SkillDescription Description
Definition OpenHand.h:46
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
static SkillDescription Description
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
Definition Logging.h:196
SelectBestKinematicChainForObjectGraspOutput SelectBestKinematicChainForObjectGrasp(const SelectBestKinematicChainForObjectGraspInput &in)
SelectBestGraspSetForObjectOutput SelectBestGraspSetForObject(const SelectBestGraspSetForObjectInput &in)
This file is part of ArmarX.
A result struct for th main method of a skill.
Definition Skill.h:62
armem::client::MemoryNameSystem & mns