From 5a290a1770986919f322992ee540d4f235b4c856 Mon Sep 17 00:00:00 2001 From: Eric Undersander Date: Mon, 4 Sep 2023 20:43:45 -0400 Subject: [PATCH 1/7] gfx-replay scaling fix --- src/esp/gfx/replay/Recorder.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/esp/gfx/replay/Recorder.cpp b/src/esp/gfx/replay/Recorder.cpp index 2095dd5037..64a1678426 100644 --- a/src/esp/gfx/replay/Recorder.cpp +++ b/src/esp/gfx/replay/Recorder.cpp @@ -58,16 +58,22 @@ void Recorder::onCreateRenderAssetInstance( auto adjustedCreation = creation; + // Reference code for including the root node scale in the creation scale. This seems + // to be incorrect/unnecessary, so it is currently commented out. We don't remember + // the legacy reason for this code. + // We assume constant node scaling over the node's lifetime. Bake node scale // into creation. - auto nodeScale = node->absoluteTransformation().scaling(); + // auto nodeScale = node->absoluteTransformation().scaling(); + // todo: check for reflection (rotationShear.determinant() < 0.0f) and bake // into scaling (negate X scale). - if (nodeScale != Mn::Vector3(1.f, 1.f, 1.f)) { - adjustedCreation.scale = adjustedCreation.scale - ? *adjustedCreation.scale * nodeScale - : nodeScale; - } + + // if (nodeScale != Mn::Vector3(1.f, 1.f, 1.f)) { + // adjustedCreation.scale = adjustedCreation.scale + // ? *adjustedCreation.scale * nodeScale + // : nodeScale; + // } getKeyframe().creations.emplace_back(instanceKey, std::move(adjustedCreation)); From 1ba255645526715be5292d25a9d1e89ed69aebc3 Mon Sep 17 00:00:00 2001 From: Mikael Dallaire Cote <110583667+0mdc@users.noreply.github.com> Date: Sun, 10 Sep 2023 18:12:46 -0400 Subject: [PATCH 2/7] Encode URDF link scaling in creationInfo rather than directly in nodes. --- .../physics/bullet/BulletPhysicsManager.cpp | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/esp/physics/bullet/BulletPhysicsManager.cpp b/src/esp/physics/bullet/BulletPhysicsManager.cpp index 2074ef40a8..5e6410232e 100644 --- a/src/esp/physics/bullet/BulletPhysicsManager.cpp +++ b/src/esp/physics/bullet/BulletPhysicsManager.cpp @@ -296,14 +296,14 @@ bool BulletPhysicsManager::attachLinkGeometry( Mn::Color4(material->m_matColor.m_specularColor); } + auto scale = Mn::Vector3{1.0f, 1.0f, 1.0f}; switch (visual.m_geometry.m_type) { case metadata::URDF::GEOM_CAPSULE: visualMeshInfo.type = esp::assets::AssetType::PRIMITIVE; // should be registered and cached already visualMeshInfo.filepath = visual.m_geometry.m_meshFileName; // scale by radius as suggested by magnum docs - visualGeomComponent.scale( - Mn::Vector3(visual.m_geometry.m_capsuleRadius)); + scale = Mn::Vector3(visual.m_geometry.m_capsuleRadius); // Magnum capsule is Y up, URDF is Z up visualGeomComponent.setTransformation( visualGeomComponent.transformation() * @@ -316,10 +316,9 @@ bool BulletPhysicsManager::attachLinkGeometry( visualMeshInfo.filepath = "cylinderSolid_rings_1_segments_12_halfLen_1_useTexCoords_false_" "useTangents_false_capEnds_true"; - visualGeomComponent.scale( - Mn::Vector3(visual.m_geometry.m_capsuleRadius, - visual.m_geometry.m_capsuleHeight / 2.0, - visual.m_geometry.m_capsuleRadius)); + scale = Mn::Vector3(visual.m_geometry.m_capsuleRadius, + visual.m_geometry.m_capsuleHeight / 2.0, + visual.m_geometry.m_capsuleRadius); // Magnum cylinder is Y up, URDF is Z up visualGeomComponent.setTransformation( visualGeomComponent.transformation() * @@ -328,17 +327,16 @@ bool BulletPhysicsManager::attachLinkGeometry( case metadata::URDF::GEOM_BOX: visualMeshInfo.type = esp::assets::AssetType::PRIMITIVE; visualMeshInfo.filepath = "cubeSolid"; - visualGeomComponent.scale(visual.m_geometry.m_boxSize * 0.5); + scale = visual.m_geometry.m_boxSize * 0.5; break; case metadata::URDF::GEOM_SPHERE: { visualMeshInfo.type = esp::assets::AssetType::PRIMITIVE; // default sphere prim is already constructed w/ radius 1 visualMeshInfo.filepath = "icosphereSolid_subdivs_1"; - visualGeomComponent.scale( - Mn::Vector3(visual.m_geometry.m_sphereRadius)); + scale = Mn::Vector3(visual.m_geometry.m_sphereRadius); } break; case metadata::URDF::GEOM_MESH: { - visualGeomComponent.scale(visual.m_geometry.m_meshScale); + scale = visual.m_geometry.m_meshScale; visualMeshInfo.filepath = visual.m_geometry.m_meshFileName; } break; case metadata::URDF::GEOM_PLANE: @@ -358,7 +356,7 @@ bool BulletPhysicsManager::attachLinkGeometry( flags |= assets::RenderAssetInstanceCreationInfo::Flag::IsRGBD; flags |= assets::RenderAssetInstanceCreationInfo::Flag::IsSemantic; assets::RenderAssetInstanceCreationInfo creation( - visualMeshInfo.filepath, Mn::Vector3{1}, flags, lightSetup); + visualMeshInfo.filepath, std::move(scale), flags, lightSetup); auto* geomNode = resourceManager_.loadAndCreateRenderAssetInstance( visualMeshInfo, creation, &visualGeomComponent, drawables, From a7887c27d1f7f239e50dfd5ea92f53160de63bd7 Mon Sep 17 00:00:00 2001 From: Mikael Dallaire Cote <110583667+0mdc@users.noreply.github.com> Date: Sun, 10 Sep 2023 18:13:55 -0400 Subject: [PATCH 3/7] Remove comment in Recorder.cpp. --- src/esp/gfx/replay/Recorder.cpp | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/src/esp/gfx/replay/Recorder.cpp b/src/esp/gfx/replay/Recorder.cpp index 64a1678426..f576ff28df 100644 --- a/src/esp/gfx/replay/Recorder.cpp +++ b/src/esp/gfx/replay/Recorder.cpp @@ -55,28 +55,7 @@ void Recorder::onCreateRenderAssetInstance( CORRADE_INTERNAL_ASSERT(findInstance(node) == ID_UNDEFINED); RenderAssetInstanceKey instanceKey = getNewInstanceKey(); - - auto adjustedCreation = creation; - - // Reference code for including the root node scale in the creation scale. This seems - // to be incorrect/unnecessary, so it is currently commented out. We don't remember - // the legacy reason for this code. - - // We assume constant node scaling over the node's lifetime. Bake node scale - // into creation. - // auto nodeScale = node->absoluteTransformation().scaling(); - - // todo: check for reflection (rotationShear.determinant() < 0.0f) and bake - // into scaling (negate X scale). - - // if (nodeScale != Mn::Vector3(1.f, 1.f, 1.f)) { - // adjustedCreation.scale = adjustedCreation.scale - // ? *adjustedCreation.scale * nodeScale - // : nodeScale; - // } - - getKeyframe().creations.emplace_back(instanceKey, - std::move(adjustedCreation)); + getKeyframe().creations.emplace_back(instanceKey, creation); // Constructing NodeDeletionHelper here is equivalent to calling // node->addFeature. We keep a pointer to deletionHelper so we can delete it From f63b1365e58cfe8e98c129e9847cbed021a08a2e Mon Sep 17 00:00:00 2001 From: Mikael Dallaire Cote <110583667+0mdc@users.noreply.github.com> Date: Sun, 10 Sep 2023 18:50:58 -0400 Subject: [PATCH 4/7] Remove unnecessary std::move. --- src/esp/physics/bullet/BulletPhysicsManager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/esp/physics/bullet/BulletPhysicsManager.cpp b/src/esp/physics/bullet/BulletPhysicsManager.cpp index 5e6410232e..c4d55c238c 100644 --- a/src/esp/physics/bullet/BulletPhysicsManager.cpp +++ b/src/esp/physics/bullet/BulletPhysicsManager.cpp @@ -356,7 +356,7 @@ bool BulletPhysicsManager::attachLinkGeometry( flags |= assets::RenderAssetInstanceCreationInfo::Flag::IsRGBD; flags |= assets::RenderAssetInstanceCreationInfo::Flag::IsSemantic; assets::RenderAssetInstanceCreationInfo creation( - visualMeshInfo.filepath, std::move(scale), flags, lightSetup); + visualMeshInfo.filepath, scale, flags, lightSetup); auto* geomNode = resourceManager_.loadAndCreateRenderAssetInstance( visualMeshInfo, creation, &visualGeomComponent, drawables, From 0da1a9dba6bb15d834679a41f6c0ee68ec5e046b Mon Sep 17 00:00:00 2001 From: Mikael Dallaire Cote <110583667+0mdc@users.noreply.github.com> Date: Mon, 25 Sep 2023 11:00:13 -0400 Subject: [PATCH 5/7] Add test for replay rendering of scaled articulated objects. --- .../ReplayBatchRendererTest_AO_batch.png | Bin 0 -> 14181 bytes .../ReplayBatchRendererTest_AO_classic.png | Bin 0 -> 14663 bytes .../urdf/fridge/fridge_scaled.urdf | 134 ++++++++++++++++++ src/tests/BatchReplayRendererTest.cpp | 116 +++++++++++++++ 4 files changed, 250 insertions(+) create mode 100644 data/test_assets/screenshots/ReplayBatchRendererTest_AO_batch.png create mode 100644 data/test_assets/screenshots/ReplayBatchRendererTest_AO_classic.png create mode 100644 data/test_assets/urdf/fridge/fridge_scaled.urdf diff --git a/data/test_assets/screenshots/ReplayBatchRendererTest_AO_batch.png b/data/test_assets/screenshots/ReplayBatchRendererTest_AO_batch.png new file mode 100644 index 0000000000000000000000000000000000000000..83239ef396bff569b9d08e7e1c4cccd022f323af GIT binary patch literal 14181 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 literal 0 HcmV?d00001 diff --git a/data/test_assets/screenshots/ReplayBatchRendererTest_AO_classic.png b/data/test_assets/screenshots/ReplayBatchRendererTest_AO_classic.png new file mode 100644 index 0000000000000000000000000000000000000000..db8967616cb5568aa05158a125a6a621c164d1d6 GIT binary patch literal 14663 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 Con93H literal 0 HcmV?d00001 diff --git a/data/test_assets/urdf/fridge/fridge_scaled.urdf b/data/test_assets/urdf/fridge/fridge_scaled.urdf new file mode 100644 index 0000000000..67fade1014 --- /dev/null +++ b/data/test_assets/urdf/fridge/fridge_scaled.urdf @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/tests/BatchReplayRendererTest.cpp b/src/tests/BatchReplayRendererTest.cpp index 266ca0538d..2cde6c79cd 100644 --- a/src/tests/BatchReplayRendererTest.cpp +++ b/src/tests/BatchReplayRendererTest.cpp @@ -10,6 +10,7 @@ #include "esp/gfx/replay/Recorder.h" #include "esp/gfx/replay/ReplayManager.h" #include "esp/metadata/managers/ObjectAttributesManager.h" +#include "esp/physics/objectManagers/ArticulatedObjectManager.h" #include "esp/physics/objectManagers/RigidObjectManager.h" #include "esp/sensor/CameraSensor.h" #include "esp/sensor/Sensor.h" @@ -50,6 +51,7 @@ struct BatchReplayRendererTest : Cr::TestSuite::Tester { void testIntegration(); void testUnproject(); void testBatchPlayerDeletion(); + void testArticulatedObject(); void testClose(); const Magnum::Float maxThreshold = 255.f; @@ -157,6 +159,23 @@ const struct { }}, }; +const struct { + const char* name; + Cr::Containers::Pointer (*create)( + const ReplayRendererConfiguration& configuration); +} TestArticulatedObjectData[]{ + {"classic", + [](const ReplayRendererConfiguration& configuration) { + return Cr::Containers::Pointer{ + new esp::sim::ClassicReplayRenderer{configuration}}; + }}, + {"batch", + [](const ReplayRendererConfiguration& configuration) { + return Cr::Containers::Pointer{ + new esp::sim::BatchReplayRenderer{configuration}}; + }}, +}; + const struct { const char* name; Cr::Containers::Pointer (*create)( @@ -183,6 +202,11 @@ BatchReplayRendererTest::BatchReplayRendererTest() { addTests({&BatchReplayRendererTest::testBatchPlayerDeletion}); +#ifdef ESP_BUILD_WITH_BULLET + addInstancedTests({&BatchReplayRendererTest::testArticulatedObject}, + Cr::Containers::arraySize(TestArticulatedObjectData)); +#endif + addInstancedTests({&BatchReplayRendererTest::testClose}, Cr::Containers::arraySize(TestCloseData)); } // ctor @@ -470,6 +494,98 @@ void BatchReplayRendererTest::testBatchPlayerDeletion() { } } +void BatchReplayRendererTest::testArticulatedObject() { + auto&& data = TestArticulatedObjectData[testCaseInstanceId()]; + setTestCaseDescription(data.name); + + const auto sensorSpecs = getDefaultSensorSpecs(TestFlag::Color); + constexpr int numEnvs = 1; + const std::string userPrefix = "sensor_"; + const std::string screenshotPrefix = + "ReplayBatchRendererTest_AO_" + std::string(data.name); + + const std::string assetPath = + Cr::Utility::Path::join(TEST_ASSETS, "urdf/fridge/fridge.urdf"); + const std::string assetPathScaled = + Cr::Utility::Path::join(TEST_ASSETS, "urdf/fridge/fridge_scaled.urdf"); + std::vector serKeyframes; + + // Record sequence + { + SimulatorConfiguration simConfig{}; + simConfig.enableGfxReplaySave = true; + simConfig.createRenderer = false; + simConfig.enablePhysics = true; + auto sim = Simulator::create_unique(simConfig); + auto aoManager = sim->getArticulatedObjectManager(); + auto& sceneRoot = sim->getActiveSceneGraph().getRootNode(); + auto& recorder = *sim->getGfxReplayManager()->getRecorder(); + + { + auto fridgeA = aoManager->addArticulatedObjectFromURDF(assetPath); + CORRADE_COMPARE(aoManager->getNumObjects(), 1); + CORRADE_VERIFY(fridgeA); + fridgeA->setTranslation(Mn::Vector3(-5.0, -2.5, -2.5)); + + auto fridgeB = aoManager->addArticulatedObjectFromURDF(assetPathScaled); + CORRADE_COMPARE(aoManager->getNumObjects(), 2); + CORRADE_VERIFY(fridgeB); + fridgeB->setTranslation(Mn::Vector3(-5.0, -2.5, 2.5)); + + auto fridgeC = aoManager->addArticulatedObjectFromURDF( + assetPath, false, 0.5f /* Global scale */); + CORRADE_COMPARE(aoManager->getNumObjects(), 3); + CORRADE_VERIFY(fridgeC); + fridgeC->setTranslation(Mn::Vector3(-5.0, 2.5, -2.5)); + + auto fridgeD = aoManager->addArticulatedObjectFromURDF( + assetPathScaled, false, 0.5f /* Global scale */); + CORRADE_COMPARE(aoManager->getNumObjects(), 4); + CORRADE_VERIFY(fridgeD); + fridgeD->setTranslation(Mn::Vector3(-5.0, 2.5, 2.5)); + + auto& recorder = *sim->getGfxReplayManager()->getRecorder(); + for (const auto& sensor : sensorSpecs) { + recorder.addUserTransformToKeyframe( + userPrefix + sensor->uuid, Mn::Vector3(0.0f, 0.0f, 0.0f), + Mn::Quaternion::rotation(Mn::Deg(90.f), + Mn::Vector3(0.0f, 1.0f, 0.0f))); + } + + std::string serKeyframe = esp::gfx::replay::Recorder::keyframeToString( + recorder.extractKeyframe()); + serKeyframes.emplace_back(std::move(serKeyframe)); + } + } + CORRADE_COMPARE(serKeyframes.size(), 1); + + // Play sequence + { + ReplayRendererConfiguration batchRendererConfig; + batchRendererConfig.sensorSpecifications = sensorSpecs; + batchRendererConfig.numEnvironments = numEnvs; + batchRendererConfig.standalone = true; + Cr::Containers::Pointer renderer = + data.create(batchRendererConfig); + + std::vector colorBuffer; + std::vector colorImageView; + colorImageView.emplace_back(getRGBView( + renderer->sensorSize(0).x(), renderer->sensorSize(0).y(), colorBuffer)); + + renderer->setEnvironmentKeyframe(0, serKeyframes[0]); + renderer->setSensorTransformsFromKeyframe(0, userPrefix); + renderer->render(colorImageView, nullptr); + + // Test color output + std::string groundTruthImageFile = screenshotPrefix + ".png"; + CORRADE_COMPARE_WITH( + Mn::ImageView2D{colorImageView[0]}, + Cr::Utility::Path::join(screenshotDir, groundTruthImageFile), + (Mn::DebugTools::CompareImageToFile{maxThreshold, meanThreshold})); + } +} + void BatchReplayRendererTest::testClose() { auto&& data = TestIntegrationData[testCaseInstanceId()]; setTestCaseDescription(data.name); From a3c80f075598c5ae0f69fc8a8c5fbedca083a7ce Mon Sep 17 00:00:00 2001 From: Mikael Dallaire Cote <110583667+0mdc@users.noreply.github.com> Date: Mon, 25 Sep 2023 14:08:33 -0400 Subject: [PATCH 6/7] Update MetadataMediatorTest ao file count. --- src/tests/MetadataMediatorTest.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/MetadataMediatorTest.cpp b/src/tests/MetadataMediatorTest.cpp index 6f5d47c0fe..a67ce8c983 100644 --- a/src/tests/MetadataMediatorTest.cpp +++ b/src/tests/MetadataMediatorTest.cpp @@ -493,13 +493,13 @@ void MetadataMediatorTest::testDataset1() { ESP_WARNING() << "Starting test LoadArticulatedObjects"; const auto& aoAttributedsMgr = MM_->getAOAttributesManager(); int numAOHandles = aoAttributedsMgr->getNumObjects(); - // verify # of urdf filepaths loaded - should be 7; - CORRADE_COMPARE(numAOHandles, 7); + // verify # of urdf filepaths loaded - should be 8; + CORRADE_COMPARE(numAOHandles, 8); namespace Dir = Cr::Utility::Path; std::map urdfTestFilenames = aoAttributedsMgr->getArticulatedObjectModelFilenames(); - CORRADE_COMPARE(urdfTestFilenames.size(), 7); + CORRADE_COMPARE(urdfTestFilenames.size(), 8); // test that each stub name key corresponds to the actual file name passed // through the key making process for (std::map::const_iterator iter = From 95307049f006b9f0c64eac19208dcededa2640a7 Mon Sep 17 00:00:00 2001 From: Mikael Dallaire Cote <110583667+0mdc@users.noreply.github.com> Date: Wed, 27 Sep 2023 13:50:41 -0400 Subject: [PATCH 7/7] Disable classic replay AO test. --- .../ReplayBatchRendererTest_AO_classic.png | Bin 14663 -> 0 bytes src/tests/BatchReplayRendererTest.cpp | 5 ----- 2 files changed, 5 deletions(-) delete mode 100644 data/test_assets/screenshots/ReplayBatchRendererTest_AO_classic.png diff --git a/data/test_assets/screenshots/ReplayBatchRendererTest_AO_classic.png b/data/test_assets/screenshots/ReplayBatchRendererTest_AO_classic.png deleted file mode 100644 index db8967616cb5568aa05158a125a6a621c164d1d6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14663 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 Con93H diff --git a/src/tests/BatchReplayRendererTest.cpp b/src/tests/BatchReplayRendererTest.cpp index 2cde6c79cd..0899d2b105 100644 --- a/src/tests/BatchReplayRendererTest.cpp +++ b/src/tests/BatchReplayRendererTest.cpp @@ -164,11 +164,6 @@ const struct { Cr::Containers::Pointer (*create)( const ReplayRendererConfiguration& configuration); } TestArticulatedObjectData[]{ - {"classic", - [](const ReplayRendererConfiguration& configuration) { - return Cr::Containers::Pointer{ - new esp::sim::ClassicReplayRenderer{configuration}}; - }}, {"batch", [](const ReplayRendererConfiguration& configuration) { return Cr::Containers::Pointer{