SimpleHandoverObject.cpp
Go to the documentation of this file.
1
#include "
SimpleHandoverObject.h
"
2
3
#include <VirtualRobot/Grasping/GraspSet.h>
4
#include <VirtualRobot/ManipulationObject.h>
5
#include <VirtualRobot/RobotNodeSet.h>
6
7
#include <
RobotAPI/libraries/core/FramedPose.h
>
8
9
namespace
armarx::skills
10
{
11
const
SkillDescription
GraspObjectSkillDesc
=
12
SkillDescription
{
"SimpleHandoverObject"
,
13
"Handover an object already in hand of robot"
,
14
{},
15
armarx::Duration::MilliSeconds
(40000),
16
grasp_object::arondto::PutdownObjectAcceptedType::ToAronType()};
17
18
/*SimpleHandoverObject::SimpleHandoverObject(armem::client::MemoryNameSystem& mns, armarx::viz::Client& arviz, GraspControlSkillContext& context) :
19
Base(GraspObjectDesc, mns, arviz, context),
20
movePlatformToPose(mns, arviz, context.platformControlSkillContext)
21
{
22
}
23
24
void SimpleHandoverObject::reset()
25
{
26
Base::reset();
27
movePlatformToPose.reset();
28
}
29
30
void SimpleHandoverObject::notifyStopped()
31
{
32
Base::notifyStopped();
33
movePlatformToPose.notifyStopped();
34
}
35
36
void SimpleHandoverObject::notifyTimeoutReached()
37
{
38
Base::notifyTimeoutReached();
39
movePlatformToPose.notifyTimeoutReached();
40
}
41
42
Skill::Status SimpleHandoverObject::execute(const grasp_object::arondto::PutdownObjectAcceptedType& in, const CallbackT& callback)
43
{
44
// Members
45
armem::robot_state::VirtualRobotReader robotReader(mns);
46
armem::obj::instance::Reader objectReader(mns);
47
armem::grasping::known_grasps::Reader graspReader(mns);
48
armem::obj::instance::Writer objectWriter(mns);
49
50
robotReader.connect();
51
objectReader.connect();
52
graspReader.connect();
53
54
objectWriter.connect();
55
56
// //////////////////////////////
57
// check args
58
// //////////////////////////////
59
auto split = simox::alg::split(in.objectEntityId, "/");
60
auto objectId = in.objectEntityId;
61
if (split.size() > 3)
62
{
63
ARMARX_ERROR << "Unknown structure of object entitiy id!";
64
return Skill::Status::Failed;
65
}
66
else if (split.size() == 3)
67
{
68
objectId = split[0] + "/" + split[1];
69
}
70
71
if (in.kinematicChainName.empty())
72
{
73
ARMARX_ERROR << "No kinematic chain candidate set";
74
return Skill::Status::Failed;
75
}
76
77
auto now = armem::Time::now();
78
// //////////////////////////////
79
// get robot
80
// //////////////////////////////
81
auto robot = robotReader.getSynchronizedRobot(in.robot, now, VirtualRobot::RobotIO::RobotDescription::eStructure);
82
83
auto kinematicChain = robot->getRobotNodeSet(in.kinematicChainName);
84
const auto tcpName = kinematicChain->getTCP()->getName();
85
const auto kinematicChainJointNames = kinematicChain->getNodeNames();
86
87
88
// //////////////////////////////
89
// get object pose
90
// //////////////////////////////
91
auto objInstanceOpt = objectReader.queryObjectByEntityID(in.objectEntityId, now);
92
if (!objInstanceOpt)
93
{
94
ARMARX_ERROR << "Lost object pose.";
95
return Skill::Status::Failed;
96
}
97
auto objInstance = *objInstanceOpt;
98
99
// //////////////////////////////
100
// Setup vars
101
// //////////////////////////////
102
auto skillRet = Skill::Status::Succeeded;
103
104
auto handRootNodeName = "Hand L Base";
105
if (simox::alg::starts_with(in.kinematicChainName, "Right"))
106
{
107
handRootNodeName = "Hand R Base";
108
}
109
const FramedPosePtr handRoot = new FramedPose(robot->getRobotNode(handRootNodeName)->getPoseInRootFrame(), robot->getRootNode()->getName(), robot->getName());
110
const FramedPosePtr tcp = new FramedPose(robot->getRobotNode(tcpName)->getPoseInRootFrame(), robot->getRootNode()->getName(), robot->getName());
111
const Eigen::Matrix4f handRootPoseGlobal = handRoot->toGlobalEigen(robot);
112
const Eigen::Matrix4f tcpPoseGlobal = tcp->toGlobalEigen(robot);
113
114
const Eigen::Matrix4f tcp2handRoot = tcpPoseGlobal.inverse() * handRootPoseGlobal;
115
116
117
// //////////////////////////////
118
// Move arm back
119
// //////////////////////////////
120
{
121
auto otherArmKinematicChain = robot->getRobotNodeSet(in.otherArmKinematicChainName);
122
auto otherArmJointNames = otherArmKinematicChain->getNodeNames();
123
124
ARMARX_CHECK_EQUAL(otherArmJointNames.size(), 7); // TODO
125
126
joint_control::arondto::MoveJointsToPositionAcceptedType nextArgs;
127
nextArgs.accelerationTime = 500;
128
nextArgs.jointMaxSpeed = 0.75;
129
nextArgs.jointTargetTolerance = 0.03;
130
nextArgs.setVelocitiesToZeroAtEnd = true;
131
nextArgs.targetJointMap[otherArmJointNames[0]] = 0.47;
132
nextArgs.targetJointMap[otherArmJointNames[1]] = 0.0;
133
nextArgs.targetJointMap[otherArmJointNames[2]] = 0.0;
134
nextArgs.targetJointMap[otherArmJointNames[3]] = 0.32;
135
nextArgs.targetJointMap[otherArmJointNames[4]] = 0.47;
136
skillRet = moveJointsToPosition._execute(nextArgs, callback);
137
}
138
139
if (skillRet != Skill::Status::Succeeded)
140
{
141
clearLayer();
142
return skillRet;
143
}
144
145
// //////////////////////////////
146
// Move platform relative
147
// //////////////////////////////
148
{
149
// not used here
150
}
151
152
if (skillRet != Skill::Status::Succeeded)
153
{
154
clearLayer();
155
return skillRet;
156
}
157
158
159
// //////////////////////////////
160
// Move TCP to handover pose
161
// //////////////////////////////
162
{
163
now = IceUtil::Time::now();
164
robotReader.synchronizeRobot(*robot, now);
165
166
FramedPose tcp(robot->getRobotNode(tcpName)->getPoseInRootFrame(), robot->getRootNode()->getName(), robot->getName());
167
//const Eigen::Matrix4f robotRoot = robotRootFramedPose.toEigen();
168
//const Eigen::Matrix4f robotRootPoseGlobalEigen = robotRootFramedPose.toGlobalEigen(robot);
169
170
// query obj target location from grasp
171
auto objPoseRobot = objInstance.pose.objectPoseRobot;
172
objPoseRobot(1,3) += 40; // move further away
173
FramedPose targetObjectFramedPoseRoot(objPoseRobot, robot->getRootNode()->getName(), robot->getName());
174
const auto targetObjectPoseGlobalEigen = targetObjectFramedPoseRoot.toGlobalEigen(robot);
175
176
const auto transformationFromTCPToObject = objInstance.pose.attachment.poseInFrame;
177
178
const auto placePoseGlobal = Eigen::Matrix4f(targetObjectPoseGlobalEigen * transformationFromTCPToObject.inverse());
179
180
Eigen::Matrix4f handRootTargetPoseGlobal = placePoseGlobal * tcp2handRoot;
181
handRootTargetPoseGlobal(2,3) += 20;
182
183
auto l = arviz.layer(layerName);
184
auto o = armarx::viz::Robot("grasp");
185
o.file("RobotAPI", "RobotAPI/robots/Armar3/ArmarIII-LeftHand.xml"); // TODO!
186
o.pose(handRootTargetPoseGlobal);
187
l.add(o);
188
arviz.commit(l);
189
190
{
191
tcp_control::arondto::MoveTCPToTargetPoseAcceptedType nextArgs;
192
nextArgs.kinematicChainName = in.kinematicChainName;
193
nextArgs.orientationalAccuracy = in.orientationalAccuracy;
194
nextArgs.positionalAccuracy = in.positionalAccuracy;
195
nextArgs.targetPoseGlobal = handRootTargetPoseGlobal;
196
skillRet = moveTcpToTargetSkill.execute(nextArgs, callback);
197
}
198
199
clearLayer();
200
}
201
202
203
if (skillRet != Skill::Status::Succeeded)
204
{
205
clearLayer();
206
return skillRet;
207
}
208
209
210
// //////////////////////////////
211
// Open hand and detach from memory
212
// //////////////////////////////
213
{
214
now = IceUtil::Time::now();
215
robotReader.synchronizeRobot(*robot, now);
216
217
FramedPose robotRootFramedPose(robot->getRootNode()->getPoseInRootFrame(), robot->getRootNode()->getName(), robot->getName());
218
//const Eigen::Matrix4f robotRoot = robotRootFramedPose.toEigen();
219
const Eigen::Matrix4f robotRootGlobal = robotRootFramedPose.toGlobalEigen(robot);
220
221
FramedPose objInRobotRootFramedPose(objInstance.pose.objectPoseRobot, robot->getRootNode()->getName(), robot->getName());
222
const auto objPoseGlobalEigen = objInRobotRootFramedPose.toGlobalEigen(robot);
223
const auto objPoseRootEigen = objInRobotRootFramedPose.toEigen();
224
225
//objInstanceUpdate.pose.providerName = description.skillName;
226
objInstance.pose.attachmentValid = false;
227
objInstance.pose.attachment.resetHard();
228
objInstance.pose.objectPoseGlobal = objPoseGlobalEigen;
229
objInstance.pose.objectPoseRobot = objPoseRootEigen;
230
objInstance.pose.robotPose = robotRootGlobal;
231
objInstance.pose.robotConfig = robot->getJointValues();
232
233
objectWriter.commitObject(objInstance, objInstance.pose.providerName, IceUtil::Time::now());
234
235
skillRet = openHand.execute(nullptr, callback);
236
}
237
238
if (skillRet != Skill::Status::Succeeded)
239
{
240
clearLayer();
241
return skillRet;
242
}
243
244
245
// //////////////////////////////
246
// Move TCP to retreat pose
247
// //////////////////////////////
248
{
249
const float xRetreatOffset = 90;
250
const float yRetreatOffset = 10;
251
252
Eigen::Matrix4f offset = Eigen::Matrix4f::Identity();
253
offset(0,3) = xRetreatOffset;
254
offset(1,3) = yRetreatOffset;
255
256
now = IceUtil::Time::now();
257
robotReader.synchronizeRobot(*robot, now);
258
259
auto TcpPoseGlobalEigen = robot->getRobotNode(tcpName)->getGlobalPose();
260
Eigen::Matrix4f newTCPPoseGlobalEigen = TcpPoseGlobalEigen * offset;
261
262
tcp_control::arondto::MoveTCPToTargetPoseAcceptedType nextArgs;
263
nextArgs.kinematicChainName = in.kinematicChainName;
264
nextArgs.orientationalAccuracy = in.orientationalAccuracy;
265
nextArgs.positionalAccuracy = in.positionalAccuracy;
266
nextArgs.targetPoseGlobal = newTCPPoseGlobalEigen;
267
skillRet = moveTcpToTargetSkill.execute(nextArgs, callback);
268
}
269
270
if (skillRet != Skill::Status::Succeeded)
271
{
272
clearLayer();
273
return skillRet;
274
}
275
276
// //////////////////////////////
277
// Move joints to zero position
278
// //////////////////////////////
279
{
280
joint_control::arondto::MoveJointsToPositionAcceptedType nextArgs;
281
nextArgs.accelerationTime = 500;
282
nextArgs.jointMaxSpeed = 0.75;
283
nextArgs.jointTargetTolerance = 0.03;
284
nextArgs.setVelocitiesToZeroAtEnd = true;
285
for (const auto& j : kinematicChainJointNames)
286
{
287
nextArgs.targetJointMap[j] = 0.0;
288
}
289
for (const auto& j : robot->getRobotNodeSet(in.otherArmKinematicChainName)->getNodeNames())
290
{
291
nextArgs.targetJointMap[j] = 0.0;
292
}
293
skillRet = moveJointsToPosition._execute(nextArgs, callback);
294
}
295
296
clearLayer();
297
return skillRet;
298
}*/
299
}
// namespace armarx::skills
armarx::skills
This file is part of ArmarX.
Definition:
PeriodicUpdateWidget.cpp:11
armarx::skills::SkillDescription
Definition:
SkillDescription.h:17
SimpleHandoverObject.h
FramedPose.h
armarx::skills::GraspObjectSkillDesc
const SkillDescription GraspObjectSkillDesc
Definition:
SimpleHandoverObject.cpp:11
armarx::core::time::Duration::MilliSeconds
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition:
Duration.cpp:48
RobotSkillTemplates
libraries
skill_grasp_object
handover
SimpleHandoverObject.cpp
Generated on Sat Mar 29 2025 09:17:33 for armarx_documentation by
1.8.17