24 #include <QGridLayout>
31 #include "../Environment.h"
32 #include "../KinematicSolver.h"
33 #include "../Util/OrientationConversion.h"
34 #include "../Visualization/DesignerTrajectoryPlayer.h"
35 #include "VirtualRobot/RobotNodeSet.h"
36 #include "VirtualRobot/XML/RobotIO.h"
38 #define ROBOT_UPDATE_TIMER_MS 33
61 this->cs = IKSolver::CartesianSelection::All;
62 this->selectedWayPoint = 0;
63 this->selectedTransition = -1;
64 this->iKCallback =
true;
65 this->playerRunning =
false;
69 QWidget* viewerParent =
new QWidget();
72 dynamic_cast<QGridLayout*
>(parent->layout())
73 ->addWidget(viewSplitter,
78 if (environment != NULL && environment->getRobot())
83 ARMARX_INFO <<
"RobotTrajectoryDesigner: RobotVisualizationController on init component";
89 ARMARX_INFO <<
"RobotTrajectoryDesigner: RobotVisualizationController on connect component";
95 ARMARX_INFO <<
"RobotTrajectoryDesigner: RobotVisualizationController on disconnect";
101 ARMARX_INFO <<
"RobotTrajectoryDesigner: RobotVisualizationController on exit components";
108 if (selectedWayPoint != this->viewer->getSelectedWaypoint())
110 selectedWayPoint = this->viewer->getSelectedWaypoint();
112 if (currentTrajectory &&
static_cast<unsigned>(viewer->getSelectedWaypoint()) <
113 currentTrajectory->getAllUserWaypoints().size())
115 std::vector<double> angles =
116 currentTrajectory->getUserWaypoint(viewer->getSelectedWaypoint())->getJointAngles();
117 viewer->setManipulator(currentTrajectory->getRns(),
118 std::vector<float>(angles.begin(), angles.end()));
122 if (!selectedKinematicChain)
128 PoseBasePtr destination = PoseBasePtr(
new Pose(viewer->getManipulatorPose()));
129 std::string currentRnsName = selectedKinematicChain->getName();
131 ks->solveRecursiveIK(this->robot->getRobotNodeSet(currentRnsName),
132 robot->getRobotNodeSet(currentRnsName)->getJointValues(),
137 robot->getRobotNodeSet(currentRnsName)->setJointValues(
jointAngles);
139 emit
tcpPoseChanged(robot->getRobotNodeSet(currentRnsName)->getTCP()->getGlobalPose());
150 viewer->setObserver(ctr);
175 this->environment = environment;
185 viewer->addRobotVisualization(this->robot,
"");
188 this->currentTrajectory = NULL;
189 this->selectedWayPoint = 0;
190 this->selectedTransition = -1;
201 viewer->clearTrajectory();
209 this->currentTrajectory = trajectory;
216 if (currentTrajectory->getAllUserWaypoints().size() == 0)
220 for (
UserWaypointPtr currentPoint : currentTrajectory->getAllUserWaypoints())
223 VirtualRobot::EndEffectorPtr endEffector =
224 robot->getEndEffector(trajectory->getRns()->getTCP()->getName());
227 std::vector<VirtualRobot::EndEffectorPtr> eefs;
228 robot->getEndEffectors(eefs);
229 for (
auto eef : eefs)
231 if (eef->getTcp() == trajectory->getRns()->getTCP())
239 Pose(currentPoint->getPose()->position, currentPoint->getPose()->orientation);
243 viewer->addWaypointVisualization(
245 PosePtr(
new Pose(trajectory->getRns()->getKinematicRoot()->toGlobalCoordinateSystem(
252 viewer->addWaypointVisualization(
254 PosePtr(
new Pose(trajectory->getRns()->getKinematicRoot()->toGlobalCoordinateSystem(
263 if (currentTrajectory->getAllUserWaypoints().size() == 1)
268 for (
unsigned int k = 0; k < currentTrajectory->getNrOfUserWaypoints() - 1; k++)
270 TrajectoryPtr currentTransition = currentTrajectory->getTransition(k)->getTrajectory();
271 std::vector<PoseBasePtr> curve = std::vector<PoseBasePtr>();
274 std::vector<double> jointValues = element.getPositions();
275 PoseBasePtr pose = ks->doForwardKinematic(currentTrajectory->getRns(), jointValues);
276 curve.push_back(pose);
278 viewer->addTransitionVisualization(k, curve);
279 if (
static_cast<signed>(k) == selectedTransition)
281 viewer->highlightTransitionVisualization(k, curve);
297 TrajectoryPtr selectedTransition = currentTrajectory->getTransition(
index)->getTrajectory();
299 std::vector<PoseBasePtr> curve = std::vector<PoseBasePtr>();
303 std::vector<double> jointValues = element.getPositions();
304 PoseBasePtr pose = ks->doForwardKinematic(currentTrajectory->getRns(), jointValues);
305 curve.push_back(pose);
310 if (currentTrajectory->getNrOfUserWaypoints() >
311 static_cast<unsigned>(this->selectedTransition + 1) &&
312 this->selectedTransition >= 0)
315 currentTrajectory->getTransition(this->selectedTransition)->getTrajectory();
316 std::vector<PoseBasePtr> oldCurve = std::vector<PoseBasePtr>();
321 std::vector<double> jointValues = element.getPositions();
322 PoseBasePtr pose = ks->doForwardKinematic(currentTrajectory->getRns(), jointValues);
323 oldCurve.push_back(pose);
325 viewer->removeTransitionVisualization(this->selectedTransition);
326 viewer->addTransitionVisualization(this->selectedTransition, oldCurve);
328 viewer->highlightTransitionVisualization(
index, curve);
330 this->selectedTransition =
index;
336 viewer->clearTrajectory();
337 this->currentTrajectory = NULL;
347 this->cs = IKSolver::CartesianSelection::All;
354 viewer->removeAllWaypointVisualizations();
357 this->selectedKinematicChain = rns;
359 if (selectedKinematicChain)
363 robot->getRobotNodeSet(this->selectedKinematicChain->getName())->getJointValues());
364 viewer->setManipulator(this->selectedKinematicChain,
jointAngles);
387 Eigen::Vector3f position;
388 Eigen::Vector3f pointAtA = Eigen::Vector3f(0, 0, 0);
389 Eigen::Vector3f pointAtB;
395 position = Eigen::Vector3f(0, 2, 3.5);
396 pointAtB = Eigen::Vector3f(0, 0, 5);
401 position = Eigen::Vector3f(0, 0, 4);
402 pointAtB = Eigen::Vector3f(0, -360, 0);
407 position = Eigen::Vector3f(0, 5, 2);
408 pointAtB = Eigen::Vector3f(0, 0, 2);
412 position = Eigen::Vector3f(0, -5, 2);
413 pointAtB = Eigen::Vector3f(0, 0, 2);
418 position = Eigen::Vector3f(5, 0, 2);
419 pointAtB = Eigen::Vector3f(0, 0, 2);
423 position = Eigen::Vector3f(-5, 0, 2);
424 pointAtB = Eigen::Vector3f(0, 0, 2);
427 position = Eigen::Vector3f(0, 2, 3.5);
428 pointAtB = Eigen::Vector3f(0, 0, 5);
439 viewer->setSelectedWaypoint(
index);
440 if (currentTrajectory)
442 ARMARX_WARNING <<
"robot visualisation controller trying to update selected waypoint";
443 std::vector<double> jA = currentTrajectory->getUserWaypoint(
index)->getJointAngles();
444 std::vector<float>
jointAngles = std::vector<float>(jA.begin(), jA.end());
445 viewer->setManipulator(currentTrajectory->getRns(),
jointAngles);
447 currentTrajectory->getUserWaypoint(
index)->getIKSelection());
459 player->addTrajectory(currentTrajectory);
460 this->playerStarter();
469 player->addTrajectory(current);
471 this->playerStarter();
481 viewer->setManipulator(
482 selectedKinematicChain,
483 robot->getRobotNodeSet(selectedKinematicChain->getName())->getJointValues());
484 playerRunning =
false;
490 RobotVisualizationController::playerStarter()
492 if (playerRunning || !selectedKinematicChain)
496 playerRunning =
true;
500 viewer->clearTrajectory();
501 viewer->setManipulator(NULL, std::vector<float>());
503 player->startPlayback();