pxmlw6n2f/Gazebo_Distributed_MPI/gazebo/rendering/Heightmap_TEST.cc

175 lines
5.4 KiB
C++
Raw Normal View History

2019-04-18 10:27:54 +08:00
/*
* Copyright (C) 2012 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#include <gtest/gtest.h>
#include <boost/assign/list_of.hpp>
#include "gazebo/test/ServerFixture.hh"
#include "test_config.h"
using namespace gazebo;
class Heightmap_TEST : public RenderingFixture
{
};
/////////////////////////////////////////////////
/// \brief Test Split a terrain in a number of subterrains
TEST_F(Heightmap_TEST, splitTerrain)
{
Load("worlds/empty.world");
gazebo::rendering::ScenePtr scene = gazebo::rendering::get_scene("default");
ASSERT_TRUE(scene != nullptr);
scene = gazebo::rendering::create_scene("default", false);
// Make sure that the scene is created
ASSERT_TRUE(scene != nullptr);
gazebo::rendering::Heightmap *heightmap =
new gazebo::rendering::Heightmap(scene);
// Check that the heightmap is created
EXPECT_TRUE(heightmap != nullptr);
std::vector<float> heights;
std::vector<std::vector<float> > heightsSplit;
std::vector<std::vector<float> > slices;
// Initialize a 9 x 9 terrain with known values
int N = 9;
heights.resize(N * N);
for (int i = 0; i < N * N; ++i)
{
heights[i] = i + 1;
}
heightmap->SplitHeights(heights, heightmap->TerrainSubdivisionCount(),
heightsSplit);
ASSERT_TRUE(heightsSplit.size() == heightmap->TerrainSubdivisionCount());
// Precomputed subterrains for a known 9 x 9 terrain starting from 1 and with
// consecutive values
slices.resize(16);
slices[0] = {1, 2, 2, 10, 11, 11, 10, 11, 11};
slices[1] = {3, 4, 4, 12, 13, 13, 12, 13, 13};
slices[2] = {5, 6, 6, 14, 15, 15, 14, 15, 15};
slices[3] = {7, 8, 8, 16, 17, 17, 16, 17, 17};
slices[4] = {19, 20, 20, 28, 29, 29, 28, 29, 29};
slices[5] = {21, 22, 22, 30, 31, 31, 30, 31, 31};
slices[6] = {23, 24, 24, 32, 33, 33, 32, 33, 33};
slices[7] = {25, 26, 26, 34, 35, 35, 34, 35, 35};
slices[8] = {37, 38, 38, 46, 47, 47, 46, 47, 47};
slices[9] = {39, 40, 40, 48, 49, 49, 48, 49, 49};
slices[10] = {41, 42, 42, 50, 51, 51, 50, 51, 51};
slices[11] = {43, 44, 44, 52, 53, 53, 52, 53, 53};
slices[12] = {55, 56, 56, 64, 65, 65, 64, 65, 65};
slices[13] = {57, 58, 58, 66, 67, 67, 66, 67, 67};
slices[14] = {59, 60, 60, 68, 69, 69, 68, 69, 69};
slices[15] = {61, 62, 62, 70, 71, 71, 70, 71, 71};
// Make sure that the subterrain heights matches the precomputed slices
for (unsigned int i = 0; i < heightmap->TerrainSubdivisionCount(); ++i)
{
EXPECT_TRUE(std::equal(heightsSplit[i].begin(), heightsSplit[i].end(),
slices[i].begin()));
}
}
/////////////////////////////////////////////////
/// \brief Test terrain's level of detail API
TEST_F(Heightmap_TEST, LOD)
{
Load("worlds/empty.world");
gazebo::rendering::ScenePtr scene = gazebo::rendering::get_scene("default");
ASSERT_TRUE(scene != nullptr);
gazebo::rendering::Heightmap *heightmap =
new gazebo::rendering::Heightmap(scene);
// test basic API
EXPECT_EQ(heightmap->LOD(), 0u);
heightmap->SetLOD(3u);
EXPECT_EQ(heightmap->LOD(), 3u);
// try 0 LOD
heightmap->SetLOD(0u);
EXPECT_EQ(heightmap->LOD(), 0u);
}
#ifdef HAVE_GDAL
/////////////////////////////////////////////////
/// \brief Test Loading a terrain from a DEM file
TEST_F(Heightmap_TEST, LoadDEM)
{
Load("worlds/empty.world");
gazebo::rendering::ScenePtr scene = gazebo::rendering::get_scene("default");
ASSERT_TRUE(scene != nullptr);
gazebo::rendering::Heightmap *heightmap =
new gazebo::rendering::Heightmap(scene);
// Check that the heightmap is created
EXPECT_TRUE(heightmap != nullptr);
// create a heightmapgeom msg for the heightmap
msgs::Visual msg;
msg.set_name("heightmap_visual");
msg.set_parent_name("heightmap_visual_parent");
auto geomMsg = msg.mutable_geometry();
// set size to zero to let heightmap read actual size from dem file
msgs::Set(geomMsg->mutable_heightmap()->mutable_size(),
ignition::math::Vector3d::Zero);
boost::filesystem::path path = TEST_PATH;
path /= "data/dem_squared.tif";
geomMsg->mutable_heightmap()->set_filename(path.string());
// load the heightmap
auto visMsg = new ConstVisualPtr(&msg);
heightmap->LoadFromMsg(*visMsg);
// verify heightmap image size
unsigned int subsampling = 2;
unsigned int tifSize = 129;
unsigned int vertSize = (tifSize * subsampling) - 1;
common::Image img = heightmap->Image();
EXPECT_EQ(img.GetWidth(), vertSize);
EXPECT_EQ(img.GetHeight(), vertSize);
// verify heights between value obtained using ray casting (heightmap->Height)
// and the actual elevation data (dem.GetElevation)
common::Dem dem;
EXPECT_EQ(dem.Load(path.string()), 0);
EXPECT_FLOAT_EQ(heightmap->Height(0, 0),
dem.GetElevation(dem.GetWidth()/2, dem.GetHeight()/2));
delete heightmap;
}
#endif
/////////////////////////////////////////////////
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}