00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include "eigenGraspDlg.h"
00027
00028 #include <QLayout>
00029 #include <QLabel>
00030 #include <QScrollBar>
00031 #include <QCheckBox>
00032 #include <QFileDialog>
00033
00034 #include "world.h"
00035 #include "eigenGrasp.h"
00036 #include "robot.h"
00037
00038 void EigenGraspDlg::init()
00039 {
00040 SLIDER_STEPS = 100000;
00041
00042 mSliderConversion = 0;
00043 mSlave = NULL;
00044 }
00045
00046 void EigenGraspDlg::destroy()
00047 {
00048
00049 mEigenGrasps->setRigid(false);
00050 }
00051
00052 int EigenGraspDlg::setWorld( World *w )
00053 {
00054 mWorld = w;
00055 mHand = mWorld->getCurrentHand();
00056 assert(mHand);
00057 mEigenGrasps = mHand->getEigenGrasps();
00058 if (!mEigenGrasps || mEigenGrasps->getSize() == 0) {
00059 QTWARNING("Current hand contains no eigen grasp information");
00060 return 0;
00061 }
00062 resetSlave();
00063 adjustSliders();
00064 handConfigurationChanged();
00065 QObject::connect(mHand, SIGNAL(configurationChanged()), this, SLOT(handConfigurationChanged()) );
00066 return 1;
00067 }
00068
00080 void EigenGraspDlg::eigenGraspChanged()
00081 {
00082 double* amplitudes = new double[mNumberGrasps];
00083 QString val;
00084 for (int i=0; i < mNumberGrasps; i++) {
00085 double t = mBarList[i]->value() * mSliderConversion;
00086
00087
00088
00089
00090 if (t > mEigenGrasps->getGrasp(i)->mMax) {
00091 mBarList[i]->setValue( (int)(mEigenGrasps->getGrasp(i)->mMax / mSliderConversion) - 1);
00092 } else if (t < mEigenGrasps->getGrasp(i)->mMin) {
00093 mBarList[i]->setValue( (int)(mEigenGrasps->getGrasp(i)->mMin / mSliderConversion) + 1);
00094 }
00095 amplitudes[i] = mBarList[i]->value() * mSliderConversion;
00096 val.setNum(amplitudes[i],'f',2);
00097 mValueList[i]->setText(val);
00098 }
00099
00100
00101 double *dof = new double[mHand->getNumDOF()];
00102 mEigenGrasps->getDOF(amplitudes,dof);
00103
00104
00105
00106
00107
00108
00109
00110 mEigenGrasps->getAmp(amplitudes, dof);
00111
00112
00113 #ifdef EIGENGRASP_LOOSE
00114 if ( !mHand->checkSetDOFVals(dof) ) {
00115 fprintf(stderr,"All DOF values are illegal\n");
00116 }
00117 #endif
00118
00119 mHand->forceDOFVals(dof);
00120 QObject::disconnect(mHand, SIGNAL(configurationChanged()), this, SLOT(handConfigurationChanged()) );
00121 mHand->emitConfigChange();
00122 QObject::connect(mHand, SIGNAL(configurationChanged()), this, SLOT(handConfigurationChanged()) );
00123 mEigenGrasps->setMinMax();
00124
00125 delete [] amplitudes;
00126 delete [] dof;
00127 }
00128
00135 void EigenGraspDlg::fixBoxChanged()
00136 {
00137 bool fixed = false;
00138 for (int i=0; i < mNumberGrasps; i++ ) {
00139 if ( mCheckList[i]->isChecked() && mBarList[i]->isEnabled() ){
00140 double fa = mBarList[i]->value() * mSliderConversion;
00141 mEigenGrasps->fixEigenGrasp(i, fa);
00142 mBarList[i]->setEnabled(false);
00143 fixed = true;
00144 } else if ( !mCheckList[i]->isChecked() && !mBarList[i]->isEnabled() ){
00145 mEigenGrasps->unfixEigenGrasp(i);
00146 mBarList[i]->setEnabled(true);
00147 }
00148 }
00149 if (fixed) {
00150 rigidCheckBox->setChecked(true);
00151 rigidCheckBox_clicked();
00152 }
00153 }
00154
00155 void EigenGraspDlg::resetSlave()
00156 {
00157 if (mSlave) {
00158 delete mSlave;
00159 }
00160
00161 mNumberGrasps = mEigenGrasps->getSize();
00162 fileNameLabel->setText( QString("Filename: ") + mEigenGrasps->getName() );
00163
00164 mValueList.clear();
00165 mBarList.clear();
00166 mCheckList.clear();
00167
00168 mSlave = new QDialog(this);
00169 setSlaveLayout(mNumberGrasps);
00170 mSlave->show();
00171
00172 mEigenGrasps->setRigid(false);
00173 rigidCheckBox->setChecked(false);
00174
00175
00176
00177 }
00178
00179 void EigenGraspDlg::setSlaveLayout( int nGrasps )
00180 {
00181 mainLayout = new QVBoxLayout(mSlave, 5);
00182
00183 QLabel *valueLabel = new QLabel(QString("Value:"), mSlave);
00184 QLabel *amplLabel = new QLabel(QString("Amplitude:"), mSlave);
00185 QLabel *fixedLabel = new QLabel(QString("Fixed"), mSlave);
00186
00187 QHBoxLayout *fakeRow = new QHBoxLayout(mainLayout,-1);
00188 fakeRow->addSpacing(400);
00189
00190 QHBoxLayout *labelRow = new QHBoxLayout(mainLayout,-1);
00191 labelRow->addSpacing(5);
00192 labelRow->addWidget(valueLabel,0);
00193 labelRow->addWidget(amplLabel,1,Qt::AlignHCenter);
00194 labelRow->addWidget(fixedLabel,0);
00195 labelRow->addSpacing(5);
00196 mainLayout->addLayout(labelRow);
00197
00198 for (int i=0; i<nGrasps; i++) {
00199 QHBoxLayout *graspRow = new QHBoxLayout(mainLayout,10);
00200
00201 QLabel *eigenValue = new QLabel(QString("0.0"), mSlave);
00202 QScrollBar *bar = new QScrollBar(Qt::Horizontal, mSlave);
00203 bar->setRange( -SLIDER_STEPS, SLIDER_STEPS );
00204 bar->setPageStep(5000);
00205 bar->setLineStep(1000);
00206 bar->setValue(0);
00207 QCheckBox *box = new QCheckBox(mSlave);
00208
00209 graspRow->addSpacing(15);
00210 graspRow->addWidget(eigenValue,0);
00211 graspRow->addWidget(bar,1);
00212 graspRow->addWidget(box,0);
00213 graspRow->addSpacing(15);
00214
00215 mValueList.push_back(eigenValue);
00216 mBarList.push_back(bar);
00217 mCheckList.push_back(box);
00218
00219 connect(bar,SIGNAL(sliderMoved(int)), this, SLOT(eigenGraspChanged()) );
00220
00221
00222 connect(bar,SIGNAL(nextLine()), this, SLOT(eigenGraspChanged()) );
00223 connect(bar,SIGNAL(prevLine()), this, SLOT(eigenGraspChanged()) );
00224 connect(bar,SIGNAL(nextPage()), this, SLOT(eigenGraspChanged()) );
00225 connect(bar,SIGNAL(prevPage()), this, SLOT(eigenGraspChanged()) );
00226 connect(bar,SIGNAL(sliderReleased()), this, SLOT(eigenGraspChanged()) );
00227 connect(box,SIGNAL(clicked()), this, SLOT(fixBoxChanged()) );
00228 }
00229 mainLayout->addSpacing(20);
00230 }
00231
00232 void EigenGraspDlg::saveButton_clicked()
00233 {
00234 QString fn = QFileDialog::getSaveFileName(this, QString(), QString(getenv("GRASPIT"))+QString("/models/eigen"),
00235 "EigenGrasp Files (*.xml)") ;
00236 if ( !fn.isEmpty() ) {
00237 if (fn.section('.',1).isEmpty())
00238 fn.append(".xml");
00239 mEigenGrasps->writeToFile( fn.latin1() );
00240 }
00241 }
00242
00243 void EigenGraspDlg::loadButton_clicked()
00244 {
00245 QString fn = QFileDialog::getOpenFileName( this, QString(), QString(getenv("GRASPIT"))+QString("/models/eigen"),
00246 "EigenGrasp Files (*.xml)" );
00247 if (fn.isEmpty()) return;
00248 mHand->loadEigenData(fn);
00249 mEigenGrasps = mHand->getEigenGrasps();
00250 resetSlave();
00251 }
00252
00253 void EigenGraspDlg::identityButton_clicked()
00254 {
00255 mHand->useIdentityEigenData();
00256 mEigenGrasps = mHand->getEigenGrasps();
00257 resetSlave();
00258 }
00259
00260 void EigenGraspDlg::exitButton_clicked()
00261 {
00262 mEigenGrasps->setRigid(false);
00263
00264 QDialog::accept();
00265 }
00266
00272 void EigenGraspDlg::adjustSliders()
00273 {
00274 double max;
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293 max = 4.0;
00294 mSliderConversion = 2 * max / SLIDER_STEPS;
00295 }
00296
00297 void EigenGraspDlg::show()
00298 {
00299 QDialog::show();
00300 }
00301
00302 void EigenGraspDlg::setAmplitudes(double *amp)
00303 {
00304 QString val;
00305 for (int i=0; i < mNumberGrasps; i++) {
00306 mBarList[i]->setValue( (int) (amp[i] / mSliderConversion) );
00307 val.setNum(amp[i],'f',2);
00308 mValueList[i]->setText(val);
00309 }
00310 }
00311
00319 void EigenGraspDlg::handConfigurationChanged()
00320 {
00321 double *amp = new double[mNumberGrasps];
00322 double *dof = new double[mHand->getNumDOF()];
00323 mHand->getDOFVals(dof);
00324 mEigenGrasps->getAmp(amp, dof);
00325 setAmplitudes(amp);
00326 mEigenGrasps->setMinMax();
00327 delete [] amp;
00328 delete [] dof;
00329 }
00330
00331
00332 void EigenGraspDlg::setOriginButton_clicked()
00333 {
00334 double *dof = new double[mHand->getNumDOF()];
00335 mHand->getDOFVals(dof);
00336 mEigenGrasps->setOrigin(dof);
00337 handConfigurationChanged();
00338 delete [] dof;
00339 }
00340
00341
00342 void EigenGraspDlg::rigidCheckBox_clicked()
00343 {
00344 if (rigidCheckBox->isChecked()) {
00345 mEigenGrasps->setRigid(true);
00346 eigenGraspChanged();
00347 } else {
00348 mEigenGrasps->setRigid(false);
00349
00350 for (int i=0; i < mNumberGrasps; i++ ) {
00351 if ( mCheckList[i]->isChecked() ) mCheckList[i]->setChecked(false);
00352 }
00353 fixBoxChanged();
00354 }
00355 }
00356
00357 void EigenGraspDlg::goToOrigin()
00358 {
00359 double* amplitudes = new double[mNumberGrasps];
00360 QString val;
00361
00362 for (int i=0; i < mNumberGrasps; i++) {
00363 mBarList[i]->setValue(0);
00364 amplitudes[i] = 0;
00365 val.setNum(0.0,'f',2);
00366 mValueList[i]->setText(val);
00367 }
00368 double *dof = new double[mHand->getNumDOF()];
00369 mEigenGrasps->getDOF(amplitudes,dof);
00370 mHand->forceDOFVals(dof);
00371 mEigenGrasps->setMinMax();
00372 adjustSliders();
00373
00374 delete [] amplitudes;
00375 delete [] dof;
00376 }
00377
00378
00379 void EigenGraspDlg::closeHandButton_clicked()
00380 {
00381
00382 }
00383
00384
00385 void EigenGraspDlg::goToOriginButton_clicked()
00386 {
00387 goToOrigin();
00388 }
00389
00390