예제 #1
0
파일: h2geodesic.cpp 프로젝트: seub/Hitchin
double H2Geodesic::distanceGeodesics(const H2Geodesic &L1, const H2Geodesic &L2)
{
    H2Point p1,p2;
    if (!closestPoints(L1,L2,p1,p2))
    {
        return 0.0;
    }
    return H2Point::distance(p1,p2);
}
예제 #2
0
intensityCloud::Ptr ICP::getTransformation(avora_msgs::StampedIntensityCloudPtr P0, MLSM *X, Vector3d eV, Vector3d eT, Matrix4f eR, Vector3d *Tv, Vector3d *T, Matrix4f *R){
    double error = DBL_MAX;
    unsigned int iterations = 0;
    std::vector<BlockInfo> Y;
    intensityCloud cloud, cloud0;
    pcl::fromROSMsg(P0->cloud,cloud);
    pcl::fromROSMsg(P0->cloud,cloud0);
    std::vector<Vector3d> transforms(cloud.size());
    intensityCloud::Ptr P = boost::make_shared<intensityCloud>(cloud);
    // Initial transform
    ROS_INFO("Applying initial transformation");
    Vector3d accumulatedT;
    Vector3d accumulatedTv;
    Matrix4f accumulatedR = Matrix<float, 4, 4>::Identity();
    accumulatedT[0] = 0;
    accumulatedT[1] = 0;
    accumulatedT[2] = 0;
    accumulatedTv[0] = 0;//eV[0];
    accumulatedTv[1] = 0;//eV[1];
    accumulatedTv[2] = 0;//eV[2];
    (*Tv)[0] = 0;//eV[0];
    (*Tv)[1] = 0;//eV[1];
    (*Tv)[2] = 0;//eV[2];
    //std::vector<Vector3d> transforms = applyTransformation(P, P0->timeStamps, eR, eV, eT);
    ROS_INFO("Initial transformation applied");
    //intensityCloud sum;
    sensor_msgs::PointCloud2 debugCloud;
    //sum = cloud0 + *P;
    //pcl::toROSMsg(*P,debugCloud);
    //debugCloud.header.frame_id = "map";
    //debugPublisher_->publish(debugCloud);
    //sleep(5);
    while ((iterations < maxIterations_) && (error > errorThreshold_)){
        (*R) = Matrix<float, 4, 4>::Identity();
        // Calculate closest points
        ROS_INFO("Get closest points");
        Y = closestPoints(P,X, P0->timeStamps,eV);
        // Calculate transformation
        ROS_INFO("Get transformation");
        error = registration(P,&Y,P0->timeStamps,&transforms, T, R,eV);

        // Iterate through P applying the correct transformation depending on Tv and the stamp
        ROS_INFO("Applying transformation");
        //transforms = applyTransformation(P,P0->timeStamps, *R, *Tv, *T);
        applyTransformation(P, *R, transforms);
        // Calculate error
        ROS_INFO("Calculate error");
        error = calculateError(P, &Y);
        //ROS_INFO("%d error = %f",iterations, error);

        // Iterate?
        iterations++;
        accumulatedT += *T;
        //accumulatedT += transforms.back();
        //accumulatedTv += *Tv;
        //ROS_INFO("\n%d \tAcc Vel x = %f y = %f z = %f error = %f",iterations,accumulatedTv[0], accumulatedTv[1], accumulatedTv[2], error);


        accumulatedR = accumulatedR * (*R);
        ROS_INFO("\n%d \tTrl x = %f y = %f z = %f error = %f \n\tAcc  x = %f y = %f z = %f",iterations,(*T)[0], (*T)[1], (*T)[2], error,
                                                                                            accumulatedT[0], accumulatedT[1], accumulatedT[2]);

        //ROS_INFO("\n%d \tRotation \n%f %f %f\n%f %f %f\n%f %f %f",iterations,accumulatedR(0,0),accumulatedR(0,1),accumulatedR(0,2),
        //                                                        accumulatedR(1,0),accumulatedR(1,1),accumulatedR(1,2),
        //                                                        accumulatedR(2,0),accumulatedR(2,1),accumulatedR(2,2));

        //pcl::toROSMsg(*P,debugCloud);
        //debugCloud.header.frame_id = "map";
        //debugPublisher_->publish(debugCloud);
        //sleep(1);
    }
    pcl::toROSMsg(*P,debugCloud);
    debugCloud.header.frame_id = "map";
    debugPublisher_->publish(debugCloud);
    //(*T)[0] = //(*Tv)[0] * (P0->timeStamps.back() - P0->timeStamps.front());
    //(*T)[1] = //(*Tv)[1] * (P0->timeStamps.back() - P0->timeStamps.front());
    //(*T)[2] = //(*Tv)[2] * (P0->timeStamps.back() - P0->timeStamps.front());
    (*T) = accumulatedT;
    (*R) = accumulatedR;
    ROS_INFO("Scan time: %f",fabs(P0->timeStamps.back()) - fabs(P0->timeStamps.front()));
    ROS_INFO("\n%d \tMoved x = %f y = %f z = %f error = %f ",iterations,(*T)[0], (*T)[1], (*T)[2], error);
    //ROS_INFO("\n%d \tRotation \n%f %f %f\n%f %f %f\n%f %f %f",iterations,accumulatedR(0,0),accumulatedR(0,1),accumulatedR(0,2),
    //         accumulatedR(1,0),accumulatedR(1,1),accumulatedR(1,2),
    //         accumulatedR(2,0),accumulatedR(2,1),accumulatedR(2,2));

    //(*T) = accumulatedT;
    return P;
    //return error < errorThreshold_;


}