Skip to content

Commit 0d529d5

Browse files
Merge branch 'jmirabel-master'
2 parents 14e5a1c + a68dd81 commit 0d529d5

File tree

5 files changed

+33
-43
lines changed

5 files changed

+33
-43
lines changed

include/sot/core/matrix-svd.hh

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,7 @@ void dampedInverse( dg::Matrix& _inputMatrix,
6161
JacobiSVD<dg::Matrix>::SingularValuesType singularValues_inv;
6262
singularValues_inv.resizeLike(m_singularValues);
6363
for ( long i=0; i<m_singularValues.size(); ++i) {
64-
if ( m_singularValues(i) > threshold )
65-
singularValues_inv(i)=m_singularValues(i)/(m_singularValues(i)*m_singularValues(i)+threshold*threshold);
66-
else singularValues_inv(i)=0;
64+
singularValues_inv(i)=m_singularValues(i)/(m_singularValues(i)*m_singularValues(i)+threshold*threshold);
6765
}
6866
dg::Matrix matrix_U(svd.matrixU());
6967
dg::Matrix matrix_V(svd.matrixV());
@@ -83,9 +81,7 @@ void dampedInverse( dg::Matrix& _inputMatrix,
8381
JacobiSVD<dg::Matrix>::SingularValuesType singularValues_inv;
8482
singularValues_inv.resizeLike(m_singularValues);
8583
for ( long i=0; i<m_singularValues.size(); ++i) {
86-
if ( m_singularValues(i) > threshold )
87-
singularValues_inv(i)=m_singularValues(i)/(m_singularValues(i)*m_singularValues(i)+threshold*threshold);
88-
else singularValues_inv(i)=0;
84+
singularValues_inv(i)=m_singularValues(i)/(m_singularValues(i)*m_singularValues(i)+threshold*threshold);
8985
}
9086
dg::Matrix Uref(svd.matrixU());
9187
dg::Matrix Vref(svd.matrixV());

src/matrix/operator.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ namespace dynamicgraph {
5555
template<>const std::string TypeNameHelper<typeid>::typeName = #typeid
5656

5757
ADD_KNOWN_TYPE(double);
58-
ADD_KNOWN_TYPE(dg::Vector);
59-
ADD_KNOWN_TYPE(dg::Matrix);
58+
ADD_KNOWN_TYPE(Vector);
59+
ADD_KNOWN_TYPE(Matrix);
6060
ADD_KNOWN_TYPE(MatrixRotation);
6161
ADD_KNOWN_TYPE(MatrixTwist);
6262
ADD_KNOWN_TYPE(MatrixHomogeneous);

src/sot/sot.cpp

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -346,14 +346,9 @@ computeJacobianConstrained( const dynamicgraph::Matrix& Jac,
346346
JK = Jac;
347347
return JK;
348348
}
349-
for( int i=0;i<nJ;++i )
350-
{
351-
for( int j=0;j<nbConstraints;++j ) Jff(i,j)=Jac(i,j);
352-
for( int j=nbConstraints;j<Jac.cols();++j )
353-
Jact(i,j-nbConstraints)=Jac(i,j);
354-
}
355-
JK = Jff*K;
356-
JK+=Jact;
349+
JK.resize(nJ, mJ);
350+
JK.noalias() = Jac.leftCols (nbConstraints) * K;
351+
JK.noalias() += Jac.rightCols (Jac.cols() - nbConstraints);
357352

358353
return JK;
359354
}
@@ -800,26 +795,19 @@ computeConstraintProjector( dynamicgraph::Matrix& ProjK, const int& time )
800795
dynamicgraph::Matrix Jff( J.rows(),ffJointIdLast-ffJointIdFirst );
801796
dynamicgraph::Matrix Jc( J.rows(),nJc-ffJointIdLast+ffJointIdFirst );
802797

803-
for( int i=0;i<J.rows();++i )
804-
{
805-
if( ffJointIdFirst )
806-
for( unsigned int j=0;j<ffJointIdFirst;++j )
807-
Jc(i,j)=J(i,j);
808-
if( ffJointIdLast<nJc )
809-
for( unsigned int j=ffJointIdLast;j<nJc;++j )
810-
Jc(i,j+ffJointIdFirst-ffJointIdLast)=J(i,j);
811-
for( unsigned int j=ffJointIdFirst;j<ffJointIdLast;++j )
812-
Jff( i,j-ffJointIdFirst )=J(i,j);
813-
}
798+
Jc.leftCols (ffJointIdFirst) = J.leftCols (ffJointIdFirst);
799+
Jc.rightCols(nJc-ffJointIdLast) = J.rightCols (nJc-ffJointIdLast);
800+
Jff = J.middleCols(ffJointIdFirst, ffJointIdLast);
801+
814802
sotDEBUG(25) << "Jc = "<< Jc;
815803
sotDEBUG(25) << "Jff = "<< Jff;
816804

817805
dynamicgraph::Matrix Jffinv( Jff.cols(),Jff.rows() );
818-
Eigen::pseudoInverse(Jff, Jffinv); Jffinv *= -1;
806+
Eigen::pseudoInverse(Jff, Jffinv);
819807

820808
dynamicgraph::Matrix& Jffc = ProjK;
821809
Jffc.resize( Jffinv.rows(),Jc.cols() );
822-
Jffc = Jffinv*Jc;
810+
Jffc = -Jffinv*Jc;
823811
sotDEBUG(15) << "Jffc = "<< Jffc;
824812

825813
sotDEBUGOUT(15);

src/task/constraint.cpp

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,24 @@ computeJacobian( dynamicgraph::Matrix& J,int time )
105105
try {
106106
int dimJ = J .rows();
107107
int nbc = J.cols();
108-
if( 0==dimJ ){ dimJ = 1; J.resize(dimJ,nbc); }
108+
if( 0==dimJ ) {
109+
// Compute the correct size
110+
for( JacobianList::iterator iter = jacobianList.begin();
111+
iter!=jacobianList.end(); ++iter )
112+
{
113+
Signal< dynamicgraph::Matrix,int >& jacobian = ** iter;
114+
const dynamicgraph::Matrix& partialJacobian = jacobian(time);
115+
dimJ += partialJacobian.rows();
116+
if (nbc == 0)
117+
nbc = partialJacobian.cols();
118+
else if (nbc != partialJacobian.cols()) {
119+
SOT_THROW ExceptionTask(ExceptionTask::NON_ADEQUATE_FEATURES,
120+
"Features from the list don't "
121+
"have compatible-size jacobians.");
122+
}
123+
}
124+
J.resize (dimJ, nbc);
125+
}
109126

110127
int cursorJ = 0;
111128

@@ -119,23 +136,12 @@ computeJacobian( dynamicgraph::Matrix& J,int time )
119136
const dynamicgraph::Matrix& partialJacobian = jacobian(time);
120137
const int nbr = partialJacobian.rows();
121138

122-
if( 0==nbc ) { nbc = partialJacobian.cols(); J.conservativeResize(nbc,dimJ); }
123-
else if( partialJacobian.cols() != nbc )
124-
{SOT_THROW ExceptionTask(ExceptionTask::NON_ADEQUATE_FEATURES,
125-
"Features from the list don't "
126-
"have compatible-size jacobians.");}
127139
sotDEBUG(25) << "Jp =" <<endl<< partialJacobian<<endl;
128140

129-
while( cursorJ+nbr>=dimJ )
130-
{ dimJ *= 2; J.resize(dimJ,nbc); }
131-
for( int kc=0;kc<nbc;++kc )
132-
for( int k=0;k<nbr;++k )
133-
{ J(cursorJ+k,kc) = partialJacobian(k,kc); }
141+
J.middleRows (cursorJ, nbr) = partialJacobian;
134142
cursorJ += nbr;
135143
}
136144

137-
/* If too much memory has been allocated, resize. */
138-
J.conservativeResize(cursorJ,nbc);
139145
} catch SOT_RETHROW;
140146

141147
sotDEBUG(15) << "# Out }" << endl;

src/tools/device.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -419,9 +419,9 @@ void Device::integrate( const double & dt )
419419

420420
if (controlInputType_==CONTROL_INPUT_TWO_INTEGRATION)
421421
{
422+
if(controlIN.size() == velocity_.size()) offset = 0;
422423
for( int i=0;i<controlIN.size();++i )
423424
{
424-
if(controlIN.size() == velocity_.size()) offset = 0;
425425
vel_control_(i) = velocity_(i+offset) + controlIN(i)*dt*0.5;
426426
velocity_(i+offset) = velocity_(i+offset) + controlIN(i)*dt;
427427
}

0 commit comments

Comments
 (0)