Example #1
0
    void AddManyPointsToOctree(StereoOctomap *octomap, float x_in[], float y_in[], float z_in[], int number_of_points, double altitude_offset) {
        lcmt::stereo msg;

        msg.timestamp = GetTimestampNow();

        vector<float> x, y, z;

        for (int i = 0; i < number_of_points; i++) {

            double this_point[3];

            this_point[0] = x_in[i];
            this_point[1] = y_in[i];
            this_point[2] = z_in[i] + altitude_offset;

            double point_transformed[3];
            GlobalToCameraFrame(this_point, point_transformed);

            //std::cout << "Point: (" << point_transformed[0] << ", " << point_transformed[1] << ", " << point_transformed[2] << ")" << std::endl;

            x.push_back(point_transformed[0]);
            y.push_back(point_transformed[1]);
            z.push_back(point_transformed[2]);
        }

        msg.x = x;
        msg.y = y;
        msg.z = z;

        msg.number_of_points = number_of_points;
        msg.video_number = 0;
        msg.frame_number = 0;

        octomap->ProcessStereoMessage(&msg);
    }
Example #2
0
        void SendStereoManyPointsTriple(vector<float> x_in, vector<float> y_in, vector<float> z_in) {
            lcmt::stereo msg;

            msg.timestamp = GetTimestampNow();

            vector<float> x, y, z;
            vector<unsigned char> grey;

            for (int i = 0; i < (int)x_in.size(); i++) {

                double this_point[3];

                this_point[0] = x_in[i];
                this_point[1] = y_in[i];
                this_point[2] = z_in[i];

                double point_transformed[3];
                GlobalToCameraFrame(this_point, point_transformed);

                //std::cout << "Point: (" << point_transformed[0] << ", " << point_transformed[1] << ", " << point_transformed[2] << ")" << std::endl;

                x.push_back(point_transformed[0]);
                y.push_back(point_transformed[1]);
                z.push_back(point_transformed[2]);
                grey.push_back(0);

                x.push_back(point_transformed[0]);
                y.push_back(point_transformed[1]);
                z.push_back(point_transformed[2]);
                grey.push_back(0);

                x.push_back(point_transformed[0]);
                y.push_back(point_transformed[1]);
                z.push_back(point_transformed[2]);
                grey.push_back(0);
            }

            msg.x = x;
            msg.y = y;
            msg.z = z;
            msg.grey = grey;

            msg.number_of_points = x.size();
            msg.video_number = 0;
            msg.frame_number = 0;

            lcm_->publish("stereo", &msg);

        }
Example #3
0
TEST_F(StereoOctomapTest, SimpleNearestNeighbor) {

    StereoOctomap *stereo_octomap = new StereoOctomap(bot_frames_);

    // first test when no points are there

    double origin[3];
    origin[0] = 0;
    origin[1] = 0;
    origin[2] = 0;

    EXPECT_TRUE(stereo_octomap->NearestNeighbor(origin) == -1) << "No points in octomap failed." << std::endl;

    // add a point
    double point[3], trans_point[3];
    point[0] = 1;
    point[1] = 0;
    point[2] = 0;


    GlobalToCameraFrame(point, trans_point);

    lcmt::stereo msg;

    msg.timestamp = GetTimestampNow();

    vector<float> x, y, z;

    x.push_back(trans_point[0]);
    y.push_back(trans_point[1]);
    z.push_back(trans_point[2]);

    msg.x = x;
    msg.y = y;
    msg.z = z;

    msg.number_of_points = 1;
    msg.frame_number = 0;
    msg.video_number = 0;

    stereo_octomap->ProcessStereoMessage(&msg);


    EXPECT_EQ_ARM(stereo_octomap->NearestNeighbor(origin), 1);

    EXPECT_EQ_ARM(stereo_octomap->NearestNeighbor(point), 0);

    double point2[3] = {0, 0, 1};

    EXPECT_NEAR(stereo_octomap->NearestNeighbor(point2), sqrt(2), TOLERANCE);


    lcmt::stereo msg2;
    msg2.timestamp = GetTimestampNow();

    vector<float> x_2, y_2, z_2;

    double trans_point2[3];

    point[0] = 0;
    point[1] = 2;
    point[2] = 0;
    GlobalToCameraFrame(point, trans_point2);

    x_2.push_back(trans_point2[0]);
    y_2.push_back(trans_point2[1]);
    z_2.push_back(trans_point2[2]);

    msg2.x = x_2;
    msg2.y = y_2;
    msg2.z = z_2;

    msg2.number_of_points = 1;
    msg2.frame_number = 0;
    msg2.video_number = 0;

    // add the points to the octomap
    stereo_octomap->ProcessStereoMessage(&msg2);

    // check

    EXPECT_NEAR(stereo_octomap->NearestNeighbor(origin), 1, TOLERANCE);

    double query[3] = { 1.5, 0, 0 };

    EXPECT_NEAR(stereo_octomap->NearestNeighbor(query), 0.5, TOLERANCE);

    query[0] = 1;
    query[1] = 0;
    query[2] = 1;

    // check z
    EXPECT_NEAR(stereo_octomap->NearestNeighbor(query), 1, TOLERANCE);

    query[0] = 0;
    query[1] = 2.01;
    query[2] = 0;

    EXPECT_NEAR(stereo_octomap->NearestNeighbor(query), 0.01, TOLERANCE);

    query[0] = 0;
    query[1] = 2.1;
    query[2] = 0.5;

    EXPECT_NEAR(stereo_octomap->NearestNeighbor(query), sqrt(0.1*0.1 + 0.5*0.5), TOLERANCE);

    query[0] = -1;
    query[1] = 2.5;
    query[2] = 1.5;

    EXPECT_NEAR(stereo_octomap->NearestNeighbor(query), sqrt(1*1 + .5*.5 + 1.5*1.5), TOLERANCE);

    delete stereo_octomap;

}
Example #4
0
TEST_F(StereoOctomapTest, CheckAgainstLinearSearch) {

    int num_points = 10000;

    vector<float> x;
    vector<float> y;
    vector<float> z;

    StereoOctomap *stereo_octomap = new StereoOctomap(bot_frames_);

    // create a random point cloud

    std::uniform_real_distribution<double> uniform_dist(-1000, 1000);
    std::random_device rd;
    std::default_random_engine rand_engine(rd());

    for (int i = 0; i < num_points; i++) {

        double this_point[3];

        // generate a random point
        this_point[0] = uniform_dist(rand_engine);
        this_point[1] = uniform_dist(rand_engine);
        this_point[2] = uniform_dist(rand_engine);

        //std::cout << "Point: (" << this_point[0] << ", " << this_point[1] << ", " << this_point[2] << ")" << std::endl;

        double translated_point[3];

        GlobalToCameraFrame(this_point, translated_point);

        x.push_back(translated_point[0]);
        y.push_back(translated_point[1]);
        z.push_back(translated_point[2]);
    }

    lcmt::stereo msg;

    msg.timestamp = GetTimestampNow();

    msg.x = x;
    msg.y = y;
    msg.z = z;

    msg.number_of_points = num_points;

    msg.frame_number = 0;
    msg.video_number = 0;

    stereo_octomap->ProcessStereoMessage(&msg);

    // now perform a bunch of searches

    double time_linear = 0, time_octomap = 0;

    int num_searches = 1000;

    for (int i = 0; i < num_searches; i++) {

        double search_point[3];

        // generate a random point
        search_point[0] = uniform_dist(rand_engine);
        search_point[1] = uniform_dist(rand_engine);
        search_point[2] = uniform_dist(rand_engine);

        //std::cout << "search_point: (" << search_point[0] << ", " << search_point[1] << ", " << search_point[2] << ")" << std::endl;


        tic();
        double linear_search_dist = NearestNeighborLinear(x, y, z, search_point);
        time_linear += toc();

        tic();
        double octomap_dist = stereo_octomap->NearestNeighbor(search_point);
        time_octomap += toc();

        EXPECT_NEAR(octomap_dist, linear_search_dist, TOLERANCE);

    }

    std::cout << "\tFor " << num_searches << " searches over " << num_points << " points: " << std:: endl << "\t\tlinear time = " << time_linear << ", octree time = " << time_octomap << ", for a speedup of: " << time_linear / time_octomap << "x" << std::endl;


    delete stereo_octomap;

}