From ba10632708ef1b4110b416eb223e899c4008e541 Mon Sep 17 00:00:00 2001 From: Jenn Nguyen Date: Tue, 15 Mar 2022 09:43:38 -0700 Subject: [PATCH] Added DEM support to heightmaps (#315) Signed-off-by: Jenn Nguyen Co-authored-by: Louise Poubel --- CMakeLists.txt | 2 +- dartsim/CMakeLists.txt | 2 + dartsim/src/CustomHeightmapShape.cc | 24 +++--------- dartsim/src/CustomHeightmapShape.hh | 2 +- dartsim/src/EntityManagement_TEST.cc | 36 +++++++++++++++++- heightmap/CMakeLists.txt | 2 +- .../physics/heightmap/HeightmapShape.hh | 2 +- resources/volcano.tif | Bin 0 -> 67006 bytes 8 files changed, 47 insertions(+), 23 deletions(-) create mode 100644 resources/volcano.tif diff --git a/CMakeLists.txt b/CMakeLists.txt index 986816bdc..87745cc59 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ message(STATUS "\n\n-- ====== Finding Dependencies ======") #-------------------------------------- # Find ignition-common ign_find_package(ignition-common5 - COMPONENTS graphics profiler + COMPONENTS geospatial graphics profiler REQUIRED_BY heightmap mesh dartsim tpe tpelib bullet) set(IGN_COMMON_VER ${ignition-common5_VERSION_MAJOR}) diff --git a/dartsim/CMakeLists.txt b/dartsim/CMakeLists.txt index 5e9572ce5..f5bfa8a0b 100644 --- a/dartsim/CMakeLists.txt +++ b/dartsim/CMakeLists.txt @@ -31,6 +31,7 @@ target_link_libraries(${dartsim_plugin} ${PROJECT_LIBRARY_TARGET_NAME}-heightmap ${PROJECT_LIBRARY_TARGET_NAME}-mesh ignition-common${IGN_COMMON_VER}::ignition-common${IGN_COMMON_VER} + ignition-common${IGN_COMMON_VER}::geospatial ignition-math${IGN_MATH_VER}::eigen3 PRIVATE # We need to link this, even when the profiler isn't used to get headers. @@ -84,6 +85,7 @@ ign_build_tests( ${features} ignition-plugin${IGN_PLUGIN_VER}::loader ignition-common${IGN_COMMON_VER}::ignition-common${IGN_COMMON_VER} + ignition-common${IGN_COMMON_VER}::geospatial ${PROJECT_LIBRARY_TARGET_NAME}-sdf ${PROJECT_LIBRARY_TARGET_NAME}-heightmap ${PROJECT_LIBRARY_TARGET_NAME}-mesh diff --git a/dartsim/src/CustomHeightmapShape.cc b/dartsim/src/CustomHeightmapShape.cc index 3d5a287d6..97830f208 100644 --- a/dartsim/src/CustomHeightmapShape.cc +++ b/dartsim/src/CustomHeightmapShape.cc @@ -19,7 +19,8 @@ #include #include -#include +#include +#include #include namespace ignition { @@ -33,36 +34,23 @@ CustomHeightmapShape::CustomHeightmapShape( int _subSampling) : dart::dynamics::HeightmapShape() { - double heightmapSizeZ = _input.MaxElevation(); + float heightmapSizeZ = _input.MaxElevation() - _input.MinElevation(); const bool flipY = false; const int vertSize = (_input.Width() * _subSampling) - _subSampling + 1; + math::Vector3d scale; scale.X(_size(0) / vertSize); scale.Y(_size(1) / vertSize); - if (math::equal(heightmapSizeZ, 0.0)) + if (math::equal(heightmapSizeZ, 0.0f)) scale.Z(1.0); else scale.Z(fabs(_size(2)) / heightmapSizeZ); auto sizeIgn = ignition::math::eigen3::convert(_size); - // We need to make a copy here in order to use the non-const FillHeightMap - // function - common::ImageHeightmap copyData; - try - { - const auto &image = dynamic_cast(_input); - copyData.Load(image.Filename()); - } - catch(const std::bad_cast &) - { - ignerr << "Only image heightmaps are supported at the moment." << std::endl; - return; - } - std::vector heightsFloat; - copyData.FillHeightMap(_subSampling, vertSize, sizeIgn, scale, flipY, + _input.FillHeightMap(_subSampling, vertSize, sizeIgn, scale, flipY, heightsFloat); this->setHeightField(vertSize, vertSize, heightsFloat); diff --git a/dartsim/src/CustomHeightmapShape.hh b/dartsim/src/CustomHeightmapShape.hh index 4c641ceec..0bebc4534 100644 --- a/dartsim/src/CustomHeightmapShape.hh +++ b/dartsim/src/CustomHeightmapShape.hh @@ -19,7 +19,7 @@ #define IGNITION_PHYSICS_DARTSIM_SRC_CUSTOMHEIGHTMAPSHAPE_HH_ #include -#include +#include namespace ignition { namespace physics { diff --git a/dartsim/src/EntityManagement_TEST.cc b/dartsim/src/EntityManagement_TEST.cc index a97ddc7ac..d1830b2fd 100644 --- a/dartsim/src/EntityManagement_TEST.cc +++ b/dartsim/src/EntityManagement_TEST.cc @@ -19,7 +19,8 @@ #include -#include +#include +#include #include #include @@ -205,6 +206,7 @@ TEST(EntityManagement_TEST, ConstructEmptyWorld) EXPECT_NEAR(meshShapeScaledSize[1], 0.3831, 1e-4); EXPECT_NEAR(meshShapeScaledSize[2], 0.0489, 1e-4); + // image heightmap auto heightmapLink = model->ConstructEmptyLink("heightmap_link"); heightmapLink->AttachFixedJoint(child, "heightmap_joint"); @@ -230,6 +232,38 @@ TEST(EntityManagement_TEST, ConstructEmptyWorld) EXPECT_NEAR(size.X(), heightmapShapeRecast->GetSize()[0], 1e-6); EXPECT_NEAR(size.Y(), heightmapShapeRecast->GetSize()[1], 1e-6); EXPECT_NEAR(size.Z(), heightmapShapeRecast->GetSize()[2], 1e-6); + + // dem heightmap + auto demLink = model->ConstructEmptyLink("dem_link"); + demLink->AttachFixedJoint(child, "dem_joint"); + + auto demFilename = ignition::common::joinPaths( + IGNITION_PHYSICS_RESOURCE_DIR, "volcano.tif"); + ignition::common::Dem dem; + EXPECT_EQ(0, dem.Load(demFilename)); + + ignition::math::Vector3d sizeDem; + sizeDem.X(dem.WorldWidth()); + sizeDem.Y(dem.WorldHeight()); + sizeDem.Z(dem.MaxElevation() - dem.MinElevation()); + + auto demShape = demLink->AttachHeightmapShape("dem", dem, + ignition::math::eigen3::convert(pose), + ignition::math::eigen3::convert(sizeDem)); + + // there is a loss in precision with large dems since heightmaps use floats + EXPECT_NEAR(sizeDem.X(), demShape->GetSize()[0], 1e-3); + EXPECT_NEAR(sizeDem.Y(), demShape->GetSize()[1], 1e-3); + EXPECT_NEAR(sizeDem.Z(), demShape->GetSize()[2], 1e-6); + + auto demShapeGeneric = demLink->GetShape("dem"); + ASSERT_NE(nullptr, demShapeGeneric); + EXPECT_EQ(nullptr, demShapeGeneric->CastToBoxShape()); + auto demShapeRecast = demShapeGeneric->CastToHeightmapShape(); + ASSERT_NE(nullptr, demShapeRecast); + EXPECT_NEAR(sizeDem.X(), demShapeRecast->GetSize()[0], 1e-3); + EXPECT_NEAR(sizeDem.Y(), demShapeRecast->GetSize()[1], 1e-3); + EXPECT_NEAR(sizeDem.Z(), demShapeRecast->GetSize()[2], 1e-6); } TEST(EntityManagement_TEST, RemoveEntities) diff --git a/heightmap/CMakeLists.txt b/heightmap/CMakeLists.txt index 50efd33a0..0d31f22ae 100644 --- a/heightmap/CMakeLists.txt +++ b/heightmap/CMakeLists.txt @@ -3,7 +3,7 @@ ign_add_component(heightmap INTERFACE target_link_libraries(${heightmap} INTERFACE - ignition-common${IGN_COMMON_VER}::graphics) + ignition-common${IGN_COMMON_VER}::geospatial) install( DIRECTORY include/ diff --git a/heightmap/include/ignition/physics/heightmap/HeightmapShape.hh b/heightmap/include/ignition/physics/heightmap/HeightmapShape.hh index 0f400181e..294c8d193 100644 --- a/heightmap/include/ignition/physics/heightmap/HeightmapShape.hh +++ b/heightmap/include/ignition/physics/heightmap/HeightmapShape.hh @@ -20,7 +20,7 @@ #include -#include +#include #include #include diff --git a/resources/volcano.tif b/resources/volcano.tif new file mode 100644 index 0000000000000000000000000000000000000000..fa51cbc23c9753d0142689d66eeb33accb776e40 GIT binary patch literal 67006 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