diff --git a/SimDynamics/examples/SimDynamicsViewer/simDynamicsViewer.ui b/SimDynamics/examples/SimDynamicsViewer/simDynamicsViewer.ui index 697a061f937c0f21c3b9817da26c747675f54704..fc7e4dc20dd50711c83907717bdfd097c14aaeda 100644 --- a/SimDynamics/examples/SimDynamicsViewer/simDynamicsViewer.ui +++ b/SimDynamics/examples/SimDynamicsViewer/simDynamicsViewer.ui @@ -42,6 +42,14 @@ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set> </property> <widget class="QWidget" name="scrollAreaWidgetContents_3"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>1075</height> + </rect> + </property> <property name="sizePolicy"> <sizepolicy hsizetype="Fixed" vsizetype="Expanding"> <horstretch>0</horstretch> @@ -65,64 +73,111 @@ <number>0</number> </property> <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QPushButton" name="pushButtonLoad"> - <property name="text"> - <string>Load Robot</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer_2"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="pushButton_reloadRobot"> - <property name="text"> - <string>Reload Robot</string> - </property> - </widget> - </item> - <item> - <spacer name="horizontalSpacer"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>40</width> - <height>20</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QPushButton" name="pushButtonAddObject"> - <property name="text"> - <string>Add Object</string> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QCheckBox" name="checkBox_selfCol"> - <property name="text"> - <string>Enable self collision (requires robot reload)</string> + <widget class="QGroupBox" name="groupBox"> + <property name="title"> + <string>Loading</string> </property> - <property name="checked"> + <property name="checkable"> <bool>true</bool> </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>0</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QWidget" name="widget" native="true"> + <layout class="QGridLayout" name="gridLayout_5"> + <item row="3" column="0"> + <widget class="QCheckBox" name="checkBox_selfCol"> + <property name="text"> + <string>Enable self collision</string> + </property> + <property name="checked"> + <bool>true</bool> + </property> + </widget> + </item> + <item row="2" column="0"> + <widget class="QCheckBox" name="checkBox_kinematicJoints"> + <property name="text"> + <string>All Joints Kinematic</string> + </property> + </widget> + </item> + <item row="1" column="0"> + <widget class="QLabel" name="label_16"> + <property name="text"> + <string>Changing any of options reqires a robot reload</string> + </property> + </widget> + </item> + <item row="0" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QPushButton" name="pushButtonLoad"> + <property name="text"> + <string>Load Robot</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="pushButton_reloadRobot"> + <property name="text"> + <string>Reload Robot</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="pushButtonAddObject"> + <property name="text"> + <string>Add Object</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> </widget> </item> <item> @@ -267,6 +322,9 @@ <property name="maximum"> <double>9999999999.000000000000000</double> </property> + <property name="singleStep"> + <double>0.100000000000000</double> + </property> </widget> </item> <item row="1" column="1"> @@ -277,6 +335,9 @@ <property name="maximum"> <double>9999999999.000000000000000</double> </property> + <property name="singleStep"> + <double>0.100000000000000</double> + </property> </widget> </item> <item row="1" column="2"> @@ -287,6 +348,9 @@ <property name="maximum"> <double>9999999999.000000000000000</double> </property> + <property name="singleStep"> + <double>0.100000000000000</double> + </property> </widget> </item> <item row="0" column="2"> @@ -313,6 +377,13 @@ </property> </widget> </item> + <item row="2" column="2"> + <widget class="QCheckBox" name="checkBoxAutoMoveRobot"> + <property name="text"> + <string>Auto</string> + </property> + </widget> + </item> </layout> </widget> </item> @@ -770,12 +841,61 @@ <x>0</x> <y>0</y> <width>913</width> - <height>25</height> + <height>22</height> </rect> </property> </widget> <widget class="QStatusBar" name="statusbar"/> </widget> <resources/> - <connections/> + <connections> + <connection> + <sender>groupBox</sender> + <signal>clicked(bool)</signal> + <receiver>widget</receiver> + <slot>setVisible(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>524</x> + <y>74</y> + </hint> + <hint type="destinationlabel"> + <x>525</x> + <y>94</y> + </hint> + </hints> + </connection> + <connection> + <sender>checkBoxAutoMoveRobot</sender> + <signal>clicked(bool)</signal> + <receiver>button_reset</receiver> + <slot>setDisabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>728</x> + <y>459</y> + </hint> + <hint type="destinationlabel"> + <x>558</x> + <y>462</y> + </hint> + </hints> + </connection> + <connection> + <sender>checkBoxAutoMoveRobot</sender> + <signal>clicked(bool)</signal> + <receiver>button_set</receiver> + <slot>setDisabled(bool)</slot> + <hints> + <hint type="sourcelabel"> + <x>755</x> + <y>472</y> + </hint> + <hint type="destinationlabel"> + <x>817</x> + <y>472</y> + </hint> + </hints> + </connection> + </connections> </ui> diff --git a/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp b/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp index 3ba15ec79ecf268ee86ce7d2e405914c4fb64d33..6d74b5acb7eafe912e8d9943f29e629e7f5c8725 100644 --- a/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp +++ b/SimDynamics/examples/SimDynamicsViewer/simDynamicsWindow.cpp @@ -85,11 +85,11 @@ SimDynamicsWindow::SimDynamicsWindow(std::string& sRobotFilename) // register callback float TIMER_MS = 30.0f; SoSensorManager* sensor_mgr = SoDB::getSensorManager(); - timerSensor = new SoTimerSensor(timerCB, static_cast<void *>(this)); + timerSensor = new SoTimerSensor(timerCB, static_cast<void*>(this)); timerSensor->setInterval(SbTime(TIMER_MS / 1000.0f)); sensor_mgr->insertTimerSensor(timerSensor); - viewer->addStepCallback(stepCB, static_cast<void *>(this)); + viewer->addStepCallback(stepCB, static_cast<void*>(this)); } @@ -108,6 +108,10 @@ void SimDynamicsWindow::timerCB(void* data, SoSensor* /*sensor*/) SimDynamicsWindow* window = static_cast<SimDynamicsWindow*>(data); VR_ASSERT(window); + if (window->UI.checkBoxAutoMoveRobot->isChecked()) + { + window->setPose(); + } // now its safe to update physical information and set the models to the according poses window->updateJointInfo(); window->updateRobotInfo(); @@ -118,7 +122,7 @@ void SimDynamicsWindow::timerCB(void* data, SoSensor* /*sensor*/) window->UI.label_simuStepCount->setText(QString::number(window->simuStepCount)); } -void SimDynamicsWindow::stepCB(void *data, btScalar /*timeStep*/) +void SimDynamicsWindow::stepCB(void* data, btScalar /*timeStep*/) { SimDynamicsWindow* window = static_cast<SimDynamicsWindow*>(data); VR_ASSERT(window); @@ -217,7 +221,7 @@ void SimDynamicsWindow::buildVisualization() viewer->addVisualization(dynamicsRobot, colModel); viewer->addVisualization(dynamicsObject, colModel); - for (const auto & dynamicsObject : dynamicsObjects) + for (const auto& dynamicsObject : dynamicsObjects) { viewer->addVisualization(dynamicsObject, colModel); } @@ -244,7 +248,7 @@ void SimDynamicsWindow::comVisu() { std::vector<RobotNodePtr> n = robot->getRobotNodes(); - for (const auto & i : n) + for (const auto& i : n) { SoSeparator* sep = new SoSeparator; comSep->addChild(sep); @@ -300,7 +304,7 @@ void SimDynamicsWindow::updateJoints() UI.comboBoxRobotNode->clear(); std::vector<RobotNodePtr> nodes = robot->getRobotNodes(); - for (auto & node : nodes) + for (auto& node : nodes) { if (node->isRotationalJoint() || node->isTranslationalJoint()) { @@ -349,8 +353,15 @@ bool SimDynamicsWindow::loadRobot(std::string robotFilename) //gp(2,3) = 5.0f; gp(2, 3) = -bbox.getMin()(2) + 4.0f; robot->setGlobalPose(gp); + if (UI.checkBox_kinematicJoints->isChecked()) + { + for (auto n : robot->getRobotNodes()) + { + n->setSimulationType(SceneObject::Physics::eKinematic); + } + } dynamicsRobot = dynamicsWorld->CreateDynamicsRobot(robot); - if(! UI.checkBox_selfCol->isChecked()) + if (! UI.checkBox_selfCol->isChecked()) { //we don't want to call this function with true (we would enable all collisions) dynamicsRobot->enableSelfCollisions(false); @@ -669,14 +680,14 @@ void SimDynamicsWindow::updateJointInfo() info += "/"; info += tmp.toStdString(); - Eigen::Vector3f pos = rn->getGlobalPose().block<3,1>(0,3); + Eigen::Vector3f pos = rn->getGlobalPose().block<3, 1>(0, 3); qGP = QString("GlobalPosition (simox): ") + QString::number(pos(0), 'f', 2) + " / " + QString::number(pos(1), 'f', 2) + " / " + QString::number(pos(2), 'f', 2); auto rpy = VirtualRobot::MathTools::eigen4f2rpy(gp); qGPRPY = "GlobalRPY (simox): " + - QString::number(rpy(0), 'f', 2) + " / "+ - QString::number(rpy(1), 'f', 2) + " / "+ - QString::number(rpy(2), 'f', 2); + QString::number(rpy(0), 'f', 2) + " / " + + QString::number(rpy(1), 'f', 2) + " / " + + QString::number(rpy(2), 'f', 2); gp = rn->getGlobalPose(); qVisu = QString("VISU (simox):"); @@ -719,7 +730,7 @@ void SimDynamicsWindow::updateJointInfo() void SimDynamicsWindow::updateRobotInfo() { Eigen::Vector3f com = robot->getCoMGlobal(); - Eigen::Vector3f pos = robot->getGlobalPose().block<3,1>(0,3); + Eigen::Vector3f pos = robot->getGlobalPose().block<3, 1>(0, 3); Eigen::Vector3f rpy = VirtualRobot::MathTools::eigen4f2rpy(robot->getGlobalPose()); UI.label_RobotPos->setText(QString::number(pos(0), 'f', 2) + " / " + QString::number(pos(1), 'f', 2) + " / " + QString::number(pos(2), 'f', 2)); @@ -727,12 +738,12 @@ void SimDynamicsWindow::updateRobotInfo() UI.label_RobotCom->setText(QString::number(com(0), 'f', 2) + " / " + QString::number(com(1), 'f', 2) + " / " + QString::number(com(2), 'f', 2)); - Eigen::Vector3f rpos = robot->getRootNode()->getGlobalPose().block<3,1>(0,3); + Eigen::Vector3f rpos = robot->getRootNode()->getGlobalPose().block<3, 1>(0, 3); Eigen::Vector3f rrpy = VirtualRobot::MathTools::eigen4f2rpy(robot->getRootNode()->getGlobalPose()); UI.label_RootNodePos->setText(QString::number(rpos(0), 'f', 2) + " / " + QString::number(rpos(1), 'f', 2) + " / " + QString::number(rpos(2), 'f', 2)); UI.label_RootNodeRPY->setText(QString::number(rrpy(0), 'f', 2) + " / " + QString::number(rrpy(1), 'f', 2) + " / " + QString::number(rrpy(2), 'f', 2)); - Eigen::Vector3f rltpos = robot->getRootNode()->getLocalTransformation().block<3,1>(0,3); + Eigen::Vector3f rltpos = robot->getRootNode()->getLocalTransformation().block<3, 1>(0, 3); Eigen::Vector3f rltrpy = VirtualRobot::MathTools::eigen4f2rpy(robot->getRootNode()->getLocalTransformation()); UI.label_RootLocalTransfPos->setText(QString::number(rltpos(0), 'f', 2) + " / " + QString::number(rltpos(1), 'f', 2) + " / " + QString::number(rltpos(2), 'f', 2)); UI.label_RootLocalTransfRPY->setText(QString::number(rltrpy(0), 'f', 2) + " / " + QString::number(rltrpy(1), 'f', 2) + " / " + QString::number(rltrpy(2), 'f', 2)); @@ -802,7 +813,7 @@ void SimDynamicsWindow::updateContactVisu() std::vector<SimDynamics::DynamicsEngine::DynamicsContactInfo> c = dynamicsWorld->getEngine()->getContacts(); - for (auto & i : c) + for (auto& i : c) { std::cout << "Contact: " << i.objectAName << " + " << i.objectBName << std::endl; SoSeparator* normal = new SoSeparator; @@ -999,7 +1010,7 @@ void SimDynamicsWindow::reloadRobot() void SimDynamicsWindow::resetPose() { - Eigen::Vector3f rpos = robot->getRootNode()->getGlobalPose().block<3,1>(0,3); + Eigen::Vector3f rpos = robot->getRootNode()->getGlobalPose().block<3, 1>(0, 3); Eigen::Vector3f rrpy = VirtualRobot::MathTools::eigen4f2rpy(robot->getRootNode()->getGlobalPose()); UI.spinBox_Pos_X->setValue(rpos[0]);