本文整理汇总了C++中eigen::Matrix3d::col方法的典型用法代码示例。如果您正苦于以下问题:C++ Matrix3d::col方法的具体用法?C++ Matrix3d::col怎么用?C++ Matrix3d::col使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类eigen::Matrix3d
的用法示例。
在下文中一共展示了Matrix3d::col方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: assert
opengv::transformations_t
opengv::absolute_pose::gp3p(
const AbsoluteAdapterBase & adapter,
const std::vector<int> & indices )
{
assert(indices.size()>2);
Eigen::Matrix3d f;
Eigen::Matrix3d v;
Eigen::Matrix3d p;
for(size_t i = 0; i < 3; i++)
{
f.col(i) = adapter.getBearingVector(indices[i]);
rotation_t R = adapter.getCamRotation(indices[i]);
//unrotate the bearingVectors already so the camera rotation doesn't appear
//in the problem
f.col(i) = R * f.col(i);
v.col(i) = adapter.getCamOffset(indices[i]);
p.col(i) = adapter.getPoint(indices[i]);
}
transformations_t solutions;
modules::gp3p_main(f,v,p,solutions);
return solutions;
}
示例2: svd
void mrpt::vision::pnp::rpnp::calcampose(Eigen::MatrixXd& XXc, Eigen::MatrixXd& XXw, Eigen::Matrix3d& R2, Eigen::Vector3d& t2)
{
Eigen::MatrixXd X = XXc;
Eigen::MatrixXd Y = XXw;
Eigen::MatrixXd K = Eigen::MatrixXd::Identity(n, n) - Eigen::MatrixXd::Ones(n, n) * 1 / n;
Eigen::VectorXd ux, uy;
uy = X.rowwise().mean();
ux = Y.rowwise().mean();
// Need to verify sigmax2
double sigmax2 = (((X*K).array() * (X*K).array()).colwise().sum()).mean();
Eigen::MatrixXd SXY = Y*K*(X.transpose()) / n;
Eigen::JacobiSVD<Eigen::MatrixXd> svd(SXY, Eigen::ComputeThinU | Eigen::ComputeThinV);
Eigen::Matrix3d S = Eigen::MatrixXd::Identity(3, 3);
if (SXY.determinant() <0)
S(2, 2) = -1;
R2 = svd.matrixV()*S*svd.matrixU().transpose();
double c2 = (svd.singularValues().asDiagonal()*S).trace() / sigmax2;
t2 = uy - c2*R2*ux;
Eigen::Vector3d x, y, z;
x = R2.col(0);
y = R2.col(1);
z = R2.col(2);
if ((x.cross(y) - z).norm()>0.02)
R2.col(2) = -R2.col(2);
}
示例3: tangent_and_bitangent
void tangent_and_bitangent(const Eigen::Vector3d & n_,
Eigen::Vector3d & t_, Eigen::Vector3d & b_)
{
double rmin = 0.99;
double n0 = n_(0), n1 = n_(1), n2 = n_(2);
if (std::abs(n0) <= rmin) {
rmin = std::abs(n0);
t_(0) = 0.0;
t_(1) = - n2 / std::sqrt(1.0 - std::pow(n0, 2));
t_(2) = n1 / std::sqrt(1.0 - std::pow(n0, 2));
}
if (std::abs(n1) <= rmin) {
rmin = std::abs(n1);
t_(0) = n2 / std::sqrt(1.0 - std::pow(n1, 2));
t_(1) = 0.0;
t_(2) = - n0 / std::sqrt(1.0 - std::pow(n1, 2));
}
if (std::abs(n2) <= rmin) {
rmin = std::abs(n2);
t_(0) = n1 / std::sqrt(1.0 - std::pow(n2, 2));
t_(1) = -n0 / std::sqrt(1.0 - std::pow(n2, 2));
t_(2) = 0.0;
}
b_ = n_.cross(t_);
// Check that the calculated Frenet-Serret frame is left-handed (levogiro)
// by checking that the determinant of the matrix whose columns are the normal,
// tangent and bitangent vectors has determinant 1 (the system is orthonormal!)
Eigen::Matrix3d M;
M.col(0) = n_;
M.col(1) = t_;
M.col(2) = b_;
if (boost::math::sign(M.determinant()) != 1) {
PCMSOLVER_ERROR("Frenet-Serret local frame is not left-handed!", BOOST_CURRENT_FUNCTION);
}
}
示例4: createRotationMatrix
/*
* Creates a rotation matrix which describes how a point in an auxiliary
* coordinate system, whose x axis is desbibed by vec_along_x_axis and has
* a point on its xz-plane vec_on_xz_plane, rotates into the real coordinate
* system.
*/
void Cornea::createRotationMatrix(const Eigen::Vector3d &vec_along_x_axis,
const Eigen::Vector3d &vec_on_xz_plane,
Eigen::Matrix3d &R) {
// normalise pw
Eigen::Vector3d vec_on_xz_plane_n = vec_on_xz_plane.normalized();
// define helper variables x, y and z
// x
Eigen::Vector3d xn = vec_along_x_axis.normalized();
// y
Eigen::Vector3d tmp = vec_on_xz_plane_n.cross(xn);
Eigen::Vector3d yn = tmp.normalized();
// z
tmp = xn.cross(yn);
Eigen::Vector3d zn = tmp.normalized();
// create the rotation matrix
R.col(0) << xn(0), xn(1), xn(2);
R.col(1) << yn(0), yn(1), yn(2);
R.col(2) << zn(0), zn(1), zn(2);
}
示例5: Quaterniond
Eigen::Quaterniond mesh_core::PlaneProjection::getOrientation() const
{
Eigen::Matrix3d m;
m.col(0) = x_axis_;
m.col(1) = y_axis_;
m.col(2) = normal_;
return Eigen::Quaterniond(m);
}
示例6:
Eigen::Matrix3d Reaching::reorderHandAxes(const Eigen::Matrix3d& Q)
{
Eigen::Matrix3d R = Eigen::MatrixXd::Zero(3, 3);
R.col(params_.axis_order_[0]) = Q.col(0); // grasp approach vector
R.col(params_.axis_order_[1]) = Q.col(1); // hand axis
R.col(params_.axis_order_[2]) = Q.col(2); // hand binormal
return R;
}
示例7: A
void Reconstruction3D::RQdecomposition(Eigen::MatrixXd A, Eigen::Matrix3d &R, Eigen::Matrix3d &Q)
{
float c, s;
Eigen::Matrix3d Qx, Qy, Qz;
Eigen::Matrix3d M;
M << A(0, 0), A(0, 1), A(0, 2),
A(1, 0), A(1, 1), A(1, 2),
A(2, 0), A(2, 1), A(2, 2);
R = M;
Reconstruction3D::solveCS(c, s, R(2, 1), R(2, 2));
Qx << 1, 0, 0,
0, c, -s,
0, s, c;
R *= Qx;
Reconstruction3D::solveCS(c, s, R(2, 0), -R(2, 2));
Qy << c, 0, s,
0, 1, 0,
-s, 0, c;
R *= Qy;
Reconstruction3D::solveCS(c, s, R(1, 0), R(1, 1));
Qz << c, -s, 0,
s, c, 0,
0, 0, 1;
R *= Qz;
if (std::abs(R(1, 0)) > 0.00005 || std::abs(R(2, 0)) > 0.00005 || std::abs(R(2, 1)) > 0.00005)
std::cerr << "PROBLEM WITH RQdecomposition" << std::endl;;
// if(R(1,0)!= 0) R(1,0) = 0;
// if(R(2,0)!= 0) R(2,0) = 0;
// if(R(2,1)!= 0) R(2,1) = 0;
Q = Qz.transpose() * Qy.transpose() * Qx.transpose();
if (R(0, 0) < 0)
{
R.col(0) *= -1;
Q.row(0) *= -1;
}
if (R(1, 1) < 0)
{
R.col(1) *= -1;
Q.row(1) *= -1;
}
if (R(2, 2) < 0)
{
R.col(2) *= -1;
Q.row(2) *= -1;
}
}
示例8: determinantCorrection
bool determinantCorrection(Eigen::Matrix3d &Rot)
{
double det1 = Rot.determinant();
if( det1 < -0.9999999 && det1 > -1.0000001 )
{
// When a rotation matrix is a reflection because its determinant is -1
Rot.col(2) = -1.0*Rot.col(2); // Corrects the third column sign
std::cout << "Rotation matrix has det = -1, correct procedure to achieve det = 1\n";
return true;
}
return false;
}
示例9:
/* most relevant */
Eigen::Matrix3d MerryMotionplanner::compute_orientation(Eigen::Vector3f plane_normal, Eigen::Vector3f major_axis) {
Eigen::Vector3d xvec_des, yvec_des, zvec_des;
Eigen::Matrix3d Rmat;
for (int i = 0; i < 3; i++) {
zvec_des[i] = -plane_normal[i]; //want tool z pointing OPPOSITE surface normal
xvec_des[i] = major_axis[i];
}
yvec_des = zvec_des.cross(xvec_des); //construct consistent right-hand triad
Rmat.col(0)= xvec_des;
Rmat.col(1)= yvec_des;
Rmat.col(2)= zvec_des;
return Rmat;
}
示例10: Q
void
NurbsTools::pca (const vector_vec3d &data, ON_3dVector &mean, Eigen::Matrix3d &eigenvectors,
Eigen::Vector3d &eigenvalues)
{
if (data.empty ())
{
printf ("[NurbsTools::pca] Error, data is empty\n");
abort ();
}
mean = computeMean (data);
unsigned s = data.size ();
ON_Matrix Q(3, s);
for (unsigned i = 0; i < s; i++) {
Q[0][i] = data[i].x - mean.x;
Q[1][i] = data[i].y - mean.y;
Q[2][i] = data[i].z - mean.z;
}
ON_Matrix Qt = Q;
Qt.Transpose();
ON_Matrix oC;
oC.Multiply(Q,Qt);
Eigen::Matrix3d C(3,3);
for (unsigned i = 0; i < 3; i++) {
for (unsigned j = 0; j < 3; j++) {
C(i,j) = oC[i][j];
}
}
Eigen::SelfAdjointEigenSolver < Eigen::Matrix3d > eigensolver (C);
if (eigensolver.info () != Eigen::Success)
{
printf ("[NurbsTools::pca] Can not find eigenvalues.\n");
abort ();
}
for (int i = 0; i < 3; ++i)
{
eigenvalues (i) = eigensolver.eigenvalues () (2 - i);
if (i == 2)
eigenvectors.col (2) = eigenvectors.col (0).cross (eigenvectors.col (1));
else
eigenvectors.col (i) = eigensolver.eigenvectors ().col (2 - i);
}
}
示例11: updateMillerPlane
void CEViewOptionsWidget::updateMillerPlane()
{
// View into a Miller plane
Camera *camera = m_glWidget->camera();
Eigen::Transform3d modelView;
modelView.setIdentity();
// OK, so we want to rotate to look along the normal at the plane
// So we convert <h k l> into a Cartesian normal
Eigen::Matrix3d cellMatrix = m_ext->unconvertLength(m_ext->currentCellMatrix()).transpose();
// Get miller indices:
const Eigen::Vector3d millerIndices
(static_cast<double>(ui.spin_mi_h->value()),
static_cast<double>(ui.spin_mi_k->value()),
static_cast<double>(ui.spin_mi_l->value()));
// Check to see if we have 0,0,0
// in which case, we do nothing
if (millerIndices.squaredNorm() < 0.5)
return;
const Eigen::Vector3d normalVector ((cellMatrix * millerIndices).normalized());
Eigen::Matrix3d rotation;
rotation.row(2) = normalVector;
rotation.row(0) = rotation.row(2).unitOrthogonal();
rotation.row(1) = rotation.row(2).cross(rotation.row(0));
// Translate camera to the center of the cell
const Eigen::Vector3d cellDiagonal =
cellMatrix.col(0) * m_glWidget->aCells() +
cellMatrix.col(1) * m_glWidget->bCells() +
cellMatrix.col(2) * m_glWidget->cCells();
modelView.translate(-cellDiagonal*0.5);
// Prerotate the camera to look down the specified normal
modelView.prerotate(rotation);
// Pretranslate in the negative Z direction
modelView.pretranslate(Eigen::Vector3d(0.0, 0.0,
-1.5 * cellDiagonal.norm()));
camera->setModelview(modelView);
// Call for a redraw
m_glWidget->update();
}
示例12: computeEigenInertia
void msEntity::computeEigenInertia(Eigen::Matrix3d& evect,Eigen::Vector3d& eval) const {
evect=Eigen::Matrix3d::Zero();
eval=Eigen::Vector3d::Zero();
if(Elements.size()==0) return;
Eigen::Matrix3d Inertia=Matrix3d::Zero();
double A,B,C,D,E,F;A=B=C=D=E=F=0; double x,y,z,m;
msChildren<msElement>::const_iterator it=Elements.begin();
for(;it!=Elements.end();++it)
{
m=(*it)->getMass(getUnits()->getMass());
x=(*it)->getPosition()[0];
y=(*it)->getPosition()[1];
z=(*it)->getPosition()[2];
A+=m*(y*y+z*z);B+=m*(x*x+z*z);C+=m*(y*y+x*x);
D-=m*(z*y);E-=m*(x*z);F-=m*(x*y);
}
Inertia<<A,F,E,F,B,D,E,D,C;
Eigen::EigenSolver<Eigen::Matrix3d> eigensolver(Inertia);
for( size_t i=0; i<3 ;i++ ){
eval[i]= eigensolver.eigenvalues()[i].real();
for( size_t j=0; j<3 ; j++ ) evect.col(i)[j] = eigensolver.eigenvectors().col(i)[j].real();
}
}
示例13: update_arrows
void update_arrows() {
geometry_msgs::Point origin, arrow_x_tip, arrow_y_tip, arrow_z_tip;
Eigen::Matrix3d R;
Eigen::Quaterniond quat;
quat.x() = g_stamped_pose.pose.orientation.x;
quat.y() = g_stamped_pose.pose.orientation.y;
quat.z() = g_stamped_pose.pose.orientation.z;
quat.w() = g_stamped_pose.pose.orientation.w;
R = quat.toRotationMatrix();
Eigen::Vector3d x_vec, y_vec, z_vec;
double veclen = 0.2; //make the arrows this long
x_vec = R.col(0) * veclen;
y_vec = R.col(1) * veclen;
z_vec = R.col(2) * veclen;
//update the arrow markers w/ new pose:
origin = g_stamped_pose.pose.position;
arrow_x_tip = origin;
arrow_x_tip.x += x_vec(0);
arrow_x_tip.y += x_vec(1);
arrow_x_tip.z += x_vec(2);
arrow_marker_x.points.clear();
arrow_marker_x.points.push_back(origin);
arrow_marker_x.points.push_back(arrow_x_tip);
arrow_marker_x.header = g_stamped_pose.header;
arrow_y_tip = origin;
arrow_y_tip.x += y_vec(0);
arrow_y_tip.y += y_vec(1);
arrow_y_tip.z += y_vec(2);
arrow_marker_y.points.clear();
arrow_marker_y.points.push_back(origin);
arrow_marker_y.points.push_back(arrow_y_tip);
arrow_marker_y.header = g_stamped_pose.header;
arrow_z_tip = origin;
arrow_z_tip.x += z_vec(0);
arrow_z_tip.y += z_vec(1);
arrow_z_tip.z += z_vec(2);
arrow_marker_z.points.clear();
arrow_marker_z.points.push_back(origin);
arrow_marker_z.points.push_back(arrow_z_tip);
arrow_marker_z.header = g_stamped_pose.header;
}
示例14: flip
ON_NurbsSurface
FittingSurface::initNurbsPCA (int order, NurbsDataSurface *m_data, ON_3dVector z)
{
ON_3dVector mean;
Eigen::Matrix3d eigenvectors;
Eigen::Vector3d eigenvalues;
unsigned s = m_data->interior.size ();
NurbsTools::pca (m_data->interior, mean, eigenvectors, eigenvalues);
m_data->mean = mean;
//m_data->eigenvectors = (*eigenvectors);
bool flip (false);
Eigen::Vector3d ez(z[0],z[1],z[2]);
if (eigenvectors.col (2).dot (ez) < 0.0)
flip = true;
eigenvalues = eigenvalues / s; // seems that the eigenvalues are dependent on the number of points (???)
ON_3dVector sigma(sqrt(eigenvalues[0]), sqrt(eigenvalues[1]), sqrt(eigenvalues[2]));
ON_NurbsSurface nurbs (3, false, order, order, order, order);
nurbs.MakeClampedUniformKnotVector (0, 1.0);
nurbs.MakeClampedUniformKnotVector (1, 1.0);
// +- 2 sigma -> 95,45 % aller Messwerte
double dcu = (4.0 * sigma[0]) / (nurbs.Order (0) - 1);
double dcv = (4.0 * sigma[1]) / (nurbs.Order (1) - 1);
ON_3dVector cv_t, cv;
Eigen::Vector3d ecv_t, ecv;
Eigen::Vector3d emean(mean[0], mean[1], mean[2]);
for (int i = 0; i < nurbs.Order (0); i++)
{
for (int j = 0; j < nurbs.Order (1); j++)
{
cv[0] = -2.0 * sigma[0] + dcu * i;
cv[1] = -2.0 * sigma[1] + dcv * j;
cv[2] = 0.0;
ecv (0) = -2.0 * sigma[0] + dcu * i;
ecv (1) = -2.0 * sigma[1] + dcv * j;
ecv (2) = 0.0;
ecv_t = eigenvectors * ecv + emean;
cv_t[0] = ecv_t (0);
cv_t[1] = ecv_t (1);
cv_t[2] = ecv_t (2);
if (flip)
nurbs.SetCV (nurbs.Order (0) - 1 - i, j, ON_3dPoint (cv_t[0], cv_t[1], cv_t[2]));
else
nurbs.SetCV (i, j, ON_3dPoint (cv_t[0], cv_t[1], cv_t[2]));
}
}
return nurbs;
}
示例15: drawGaussianDistributions
void MarkerArrayVisualizer::drawGaussianDistributions(const char* ns, const std::vector<Eigen::Vector3d>& mu, const std::vector<Eigen::Matrix3d>& sigma, double probability, const std::vector<double>& offset)
{
visualization_msgs::MarkerArray marker_array;
const int size = mu.size();
for (int i=0; i<size; i++)
{
visualization_msgs::Marker marker;
marker.header.frame_id = "/world";
marker.header.stamp = ros::Time::now();
marker.ns = ns;
marker.id = i;
marker.type = visualization_msgs::Marker::SPHERE;
marker.action = visualization_msgs::Marker::ADD;
// axis: eigenvectors
// radius: eigenvalues
Eigen::JacobiSVD<Eigen::MatrixXd> svd(sigma[i], Eigen::ComputeThinU | Eigen::ComputeThinV);
const Eigen::VectorXd& r = svd.singularValues();
Eigen::Matrix3d Q = svd.matrixU();
// to make determinant 1
if (Q.determinant() < 0)
Q.col(2) *= -1.;
const Eigen::Quaterniond q(Q);
marker.pose.position.x = mu[i](0);
marker.pose.position.y = mu[i](1);
marker.pose.position.z = mu[i](2);
marker.pose.orientation.x = q.x();
marker.pose.orientation.y = q.y();
marker.pose.orientation.z = q.z();
marker.pose.orientation.w = q.w();
const double probability_radius = gaussianDistributionRadius3D(probability);
marker.scale.x = 2. * (probability_radius * std::sqrt(r[0]) + offset[i]);
marker.scale.y = 2. * (probability_radius * std::sqrt(r[1]) + offset[i]);
marker.scale.z = 2. * (probability_radius * std::sqrt(r[2]) + offset[i]);
marker.color.r = 1.0;
marker.color.g = 0.0;
marker.color.b = 0.0;
marker.color.a = 0.25;
marker.lifetime = ros::Duration();
marker_array.markers.push_back(marker);
}
publish(marker_array);
}