From f749e33dbffa14a2a5af9b2f7d402e4006fee21f Mon Sep 17 00:00:00 2001 From: Matthew MacFarquhar Date: Tue, 18 Nov 2025 10:00:54 -0500 Subject: [PATCH 1/5] feat: implement Get3DModels for arm --- src/viam/sdk/components/arm.hpp | 12 +++++++++++ .../sdk/components/private/arm_client.cpp | 9 +++++++++ .../sdk/components/private/arm_client.hpp | 2 ++ .../sdk/components/private/arm_server.cpp | 12 +++++++++++ .../sdk/components/private/arm_server.hpp | 4 ++++ .../tests/Testing/Temporary/CTestCostData.txt | 1 + .../sdk/tests/Testing/Temporary/LastTest.log | 3 +++ src/viam/sdk/tests/mocks/mock_arm.cpp | 8 ++++++++ src/viam/sdk/tests/mocks/mock_arm.hpp | 3 ++- src/viam/sdk/tests/test_arm.cpp | 20 +++++++++++++++++++ 10 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/viam/sdk/tests/Testing/Temporary/CTestCostData.txt create mode 100644 src/viam/sdk/tests/Testing/Temporary/LastTest.log diff --git a/src/viam/sdk/components/arm.hpp b/src/viam/sdk/components/arm.hpp index 79b60bb26..02415bb5b 100644 --- a/src/viam/sdk/components/arm.hpp +++ b/src/viam/sdk/components/arm.hpp @@ -3,6 +3,7 @@ /// @brief Defines an `Arm` component #pragma once +#include #include #include @@ -142,6 +143,17 @@ class Arm : public Component, public Stoppable { return get_kinematics({}); } + /// @brief Returns `3DModel`s associated with the calling arm + /// @param extra Any additional arguments to the method + /// @return A map of `3DModel`s associated with the calling arm + virtual std::map get_3d_models(const ProtoStruct& extra) = 0; + + /// @brief Returns `3DModel`s associated with the calling arm + /// @return A map of `3DModel`s associated with the calling arm + inline std::map get_3d_models() { + return get_3d_models({}); + } + /// @brief Returns `GeometryConfig`s associated with the calling arm inline std::vector get_geometries() { return get_geometries({}); diff --git a/src/viam/sdk/components/private/arm_client.cpp b/src/viam/sdk/components/private/arm_client.cpp index 619580ad4..20b753715 100644 --- a/src/viam/sdk/components/private/arm_client.cpp +++ b/src/viam/sdk/components/private/arm_client.cpp @@ -106,6 +106,15 @@ Arm::KinematicsData ArmClient::get_kinematics(const ProtoStruct& extra) { }); } +std::map ArmClient::get_3d_models(const ProtoStruct& extra) { + return make_client_helper(this, *stub_, &StubType::Get3DModels) + .with(extra) + .invoke([](auto& response) { + return std::map(response.models().begin(), + response.models().end()); + }); +} + std::vector ArmClient::get_geometries(const ProtoStruct& extra) { return make_client_helper(this, *stub_, &StubType::GetGeometries) .with(extra) diff --git a/src/viam/sdk/components/private/arm_client.hpp b/src/viam/sdk/components/private/arm_client.hpp index 6608a1340..7d403584a 100644 --- a/src/viam/sdk/components/private/arm_client.hpp +++ b/src/viam/sdk/components/private/arm_client.hpp @@ -33,10 +33,12 @@ class ArmClient : public Arm { void stop(const ProtoStruct& extra) override; ProtoStruct do_command(const ProtoStruct& command) override; Arm::KinematicsData get_kinematics(const ProtoStruct& extra) override; + std::map get_3d_models(const ProtoStruct& extra) override; std::vector get_geometries(const ProtoStruct& extra) override; // Using declarations to introduce convenience overloads of interface which do not need to be // passed the ProtoStruct parameter. + using Arm::get_3d_models; using Arm::get_end_position; using Arm::get_geometries; using Arm::get_joint_positions; diff --git a/src/viam/sdk/components/private/arm_server.cpp b/src/viam/sdk/components/private/arm_server.cpp index 3c1970412..f7e54893e 100644 --- a/src/viam/sdk/components/private/arm_server.cpp +++ b/src/viam/sdk/components/private/arm_server.cpp @@ -135,6 +135,18 @@ ::grpc::Status ArmServer::GetKinematics( }); } +::grpc::Status ArmServer::Get3DModels(::grpc::ServerContext*, + const ::viam::common::v1::Get3DModelsRequest* request, + ::viam::common::v1::Get3DModelsResponse* response) noexcept { + return make_service_helper( + "ArmServer::Get3DModels", this, request)([&](auto& helper, auto& arm) { + const std::map models = + arm->get_3d_models(helper.getExtra()); + + response->mutable_models()->insert(models.begin(), models.end()); + }); +} + ::grpc::Status ArmServer::GetGeometries( ::grpc::ServerContext*, const ::viam::common::v1::GetGeometriesRequest* request, diff --git a/src/viam/sdk/components/private/arm_server.hpp b/src/viam/sdk/components/private/arm_server.hpp index f19788b60..dae2a5af9 100644 --- a/src/viam/sdk/components/private/arm_server.hpp +++ b/src/viam/sdk/components/private/arm_server.hpp @@ -67,6 +67,10 @@ class ArmServer : public ResourceServer, public viam::component::arm::v1::ArmSer const ::viam::common::v1::GetKinematicsRequest* request, ::viam::common::v1::GetKinematicsResponse* response) noexcept override; + ::grpc::Status Get3DModels(::grpc::ServerContext* context, + const ::viam::common::v1::Get3DModelsRequest* request, + ::viam::common::v1::Get3DModelsResponse* response) noexcept override; + ::grpc::Status GetGeometries( ::grpc::ServerContext* context, const ::viam::common::v1::GetGeometriesRequest* request, diff --git a/src/viam/sdk/tests/Testing/Temporary/CTestCostData.txt b/src/viam/sdk/tests/Testing/Temporary/CTestCostData.txt new file mode 100644 index 000000000..ed97d539c --- /dev/null +++ b/src/viam/sdk/tests/Testing/Temporary/CTestCostData.txt @@ -0,0 +1 @@ +--- diff --git a/src/viam/sdk/tests/Testing/Temporary/LastTest.log b/src/viam/sdk/tests/Testing/Temporary/LastTest.log new file mode 100644 index 000000000..c8340cadd --- /dev/null +++ b/src/viam/sdk/tests/Testing/Temporary/LastTest.log @@ -0,0 +1,3 @@ +Start testing: Nov 18 09:37 EST +---------------------------------------------------------- +End testing: Nov 18 09:37 EST diff --git a/src/viam/sdk/tests/mocks/mock_arm.cpp b/src/viam/sdk/tests/mocks/mock_arm.cpp index 2eb4c8fb0..0a11824c9 100644 --- a/src/viam/sdk/tests/mocks/mock_arm.cpp +++ b/src/viam/sdk/tests/mocks/mock_arm.cpp @@ -7,6 +7,10 @@ namespace viam { namespace sdktests { namespace arm { +std::map fake_3d_models() { + return {{"model1", common::v1::Mesh::default_instance()}}; +} + sdk::Arm::KinematicsData fake_kinematics() { return sdk::Arm::KinematicsDataSVA{{std::vector{1, 2, 3, 4}}}; } @@ -59,6 +63,10 @@ std::vector MockArm::get_geometries(const sdk::ProtoStruct& return fake_geometries(); } +std::map MockArm::get_3d_models(const sdk::ProtoStruct&) { + return fake_3d_models(); +} + } // namespace arm } // namespace sdktests } // namespace viam diff --git a/src/viam/sdk/tests/mocks/mock_arm.hpp b/src/viam/sdk/tests/mocks/mock_arm.hpp index fdd7537eb..47806fe50 100644 --- a/src/viam/sdk/tests/mocks/mock_arm.hpp +++ b/src/viam/sdk/tests/mocks/mock_arm.hpp @@ -7,6 +7,7 @@ namespace sdktests { namespace arm { sdk::Arm::KinematicsData fake_kinematics(); +std::map fake_3d_models(); class MockArm : public sdk::Arm { public: @@ -29,7 +30,7 @@ class MockArm : public sdk::Arm { sdk::ProtoStruct do_command(const sdk::ProtoStruct& command) override; sdk::Arm::KinematicsData get_kinematics(const sdk::ProtoStruct&) override; std::vector get_geometries(const sdk::ProtoStruct&) override; - + std::map get_3d_models(const sdk::ProtoStruct&) override; sdk::pose current_location; std::vector joint_positions; std::vector> move_thru_positions; diff --git a/src/viam/sdk/tests/test_arm.cpp b/src/viam/sdk/tests/test_arm.cpp index 933fe781b..73e32fc5d 100644 --- a/src/viam/sdk/tests/test_arm.cpp +++ b/src/viam/sdk/tests/test_arm.cpp @@ -104,6 +104,26 @@ BOOST_AUTO_TEST_CASE(test_do_command) { }); } +BOOST_AUTO_TEST_CASE(test_get_3d_models) { + std::shared_ptr mock = MockArm::get_mock_arm(); + client_to_mock_pipeline(mock, [](Arm& client) { + const auto& models = client.get_3d_models(); + const auto& expected = fake_3d_models(); + + // Compare keysets directly + std::set model_keys; + std::set expected_keys; + for (const auto& [key, _] : models) { + model_keys.insert(key); + } + for (const auto& [key, _] : expected) { + expected_keys.insert(key); + } + BOOST_CHECK_EQUAL_COLLECTIONS( + model_keys.begin(), model_keys.end(), expected_keys.begin(), expected_keys.end()); + }); +} + BOOST_AUTO_TEST_SUITE_END() } // namespace sdktests From d1e2fc6d8ef0ec23d17d9a48d83aff0e62f1481e Mon Sep 17 00:00:00 2001 From: Matthew MacFarquhar Date: Tue, 18 Nov 2025 10:01:33 -0500 Subject: [PATCH 2/5] remove temp dir --- src/viam/sdk/tests/Testing/Temporary/CTestCostData.txt | 1 - src/viam/sdk/tests/Testing/Temporary/LastTest.log | 3 --- 2 files changed, 4 deletions(-) delete mode 100644 src/viam/sdk/tests/Testing/Temporary/CTestCostData.txt delete mode 100644 src/viam/sdk/tests/Testing/Temporary/LastTest.log diff --git a/src/viam/sdk/tests/Testing/Temporary/CTestCostData.txt b/src/viam/sdk/tests/Testing/Temporary/CTestCostData.txt deleted file mode 100644 index ed97d539c..000000000 --- a/src/viam/sdk/tests/Testing/Temporary/CTestCostData.txt +++ /dev/null @@ -1 +0,0 @@ ---- diff --git a/src/viam/sdk/tests/Testing/Temporary/LastTest.log b/src/viam/sdk/tests/Testing/Temporary/LastTest.log deleted file mode 100644 index c8340cadd..000000000 --- a/src/viam/sdk/tests/Testing/Temporary/LastTest.log +++ /dev/null @@ -1,3 +0,0 @@ -Start testing: Nov 18 09:37 EST ----------------------------------------------------------- -End testing: Nov 18 09:37 EST From 319b316abb878c78e0f37da354bc5a019e0da2ee Mon Sep 17 00:00:00 2001 From: Lia Stratopoulos <167905060+lia-viam@users.noreply.github.com> Date: Tue, 18 Nov 2025 15:26:45 -0500 Subject: [PATCH 3/5] add sdk mesh type --- src/viam/sdk/CMakeLists.txt | 2 ++ src/viam/sdk/common/mesh.cpp | 22 +++++++++++++++++++ src/viam/sdk/common/mesh.hpp | 41 ++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 src/viam/sdk/common/mesh.cpp create mode 100644 src/viam/sdk/common/mesh.hpp diff --git a/src/viam/sdk/CMakeLists.txt b/src/viam/sdk/CMakeLists.txt index 52a6eabdd..f15e25ae4 100644 --- a/src/viam/sdk/CMakeLists.txt +++ b/src/viam/sdk/CMakeLists.txt @@ -66,6 +66,7 @@ target_sources(viamsdk common/exception.cpp common/instance.cpp common/linear_algebra.cpp + common/mesh.cpp common/pose.cpp common/proto_value.cpp common/utils.cpp @@ -177,6 +178,7 @@ target_sources(viamsdk ../../viam/sdk/common/exception.hpp ../../viam/sdk/common/instance.hpp ../../viam/sdk/common/linear_algebra.hpp + ../../viam/sdk/common/mesh.hpp ../../viam/sdk/common/pose.hpp ../../viam/sdk/common/proto_convert.hpp ../../viam/sdk/common/proto_value.hpp diff --git a/src/viam/sdk/common/mesh.cpp b/src/viam/sdk/common/mesh.cpp new file mode 100644 index 000000000..cbb9b8ec7 --- /dev/null +++ b/src/viam/sdk/common/mesh.cpp @@ -0,0 +1,22 @@ +#include + +#include + +#include + +namespace viam { +namespace sdk { + +namespace proto_convert_details { +void to_proto_impl::operator()(const mesh& self, common::v1::Mesh* proto) const { + proto->set_content_type(self.content_type); + proto->set_mesh(bytes_to_string(self.data)); +} + +mesh from_proto_impl::operator()(const common::v1::Mesh* proto) const { + return mesh{proto->content_type(), string_to_bytes(proto->mesh())}; +} + +} // namespace proto_convert_details +} // namespace sdk +} // namespace viam diff --git a/src/viam/sdk/common/mesh.hpp b/src/viam/sdk/common/mesh.hpp new file mode 100644 index 000000000..bb239258a --- /dev/null +++ b/src/viam/sdk/common/mesh.hpp @@ -0,0 +1,41 @@ +#pragma once + +#include + +#include +#include + +namespace viam { +namespace common { +namespace v1 { + +class Mesh; + +} // namespace v1 +} // namespace common +} // namespace viam + +namespace viam { +namespace sdk { + +struct mesh { + std::string content_type; + std::vector data; +}; + +namespace proto_convert_details { + +template <> +struct to_proto_impl { + void operator()(const mesh&, common::v1::Mesh*) const; +}; + +template <> +struct from_proto_impl { + mesh operator()(const common::v1::Mesh*) const; +}; + +} // namespace proto_convert_details + +} // namespace sdk +} // namespace viam From 2686d14b009c91897bf8be8ff961a8179c78f988 Mon Sep 17 00:00:00 2001 From: Matthew MacFarquhar Date: Tue, 18 Nov 2025 17:27:44 -0500 Subject: [PATCH 4/5] use newly provided common mesh.cxx --- src/viam/sdk/components/arm.hpp | 6 +++--- src/viam/sdk/components/private/arm_client.cpp | 9 ++++++--- src/viam/sdk/components/private/arm_client.hpp | 2 +- src/viam/sdk/components/private/arm_server.cpp | 7 ++++--- src/viam/sdk/tests/mocks/mock_arm.cpp | 7 ++++--- src/viam/sdk/tests/mocks/mock_arm.hpp | 4 ++-- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/src/viam/sdk/components/arm.hpp b/src/viam/sdk/components/arm.hpp index 02415bb5b..c9d2f75d4 100644 --- a/src/viam/sdk/components/arm.hpp +++ b/src/viam/sdk/components/arm.hpp @@ -3,12 +3,12 @@ /// @brief Defines an `Arm` component #pragma once -#include #include #include #include +#include #include #include #include @@ -146,11 +146,11 @@ class Arm : public Component, public Stoppable { /// @brief Returns `3DModel`s associated with the calling arm /// @param extra Any additional arguments to the method /// @return A map of `3DModel`s associated with the calling arm - virtual std::map get_3d_models(const ProtoStruct& extra) = 0; + virtual std::map get_3d_models(const ProtoStruct& extra) = 0; /// @brief Returns `3DModel`s associated with the calling arm /// @return A map of `3DModel`s associated with the calling arm - inline std::map get_3d_models() { + inline std::map get_3d_models() { return get_3d_models({}); } diff --git a/src/viam/sdk/components/private/arm_client.cpp b/src/viam/sdk/components/private/arm_client.cpp index 20b753715..64f09fd5d 100644 --- a/src/viam/sdk/components/private/arm_client.cpp +++ b/src/viam/sdk/components/private/arm_client.cpp @@ -106,12 +106,15 @@ Arm::KinematicsData ArmClient::get_kinematics(const ProtoStruct& extra) { }); } -std::map ArmClient::get_3d_models(const ProtoStruct& extra) { +std::map ArmClient::get_3d_models(const ProtoStruct& extra) { return make_client_helper(this, *stub_, &StubType::Get3DModels) .with(extra) .invoke([](auto& response) { - return std::map(response.models().begin(), - response.models().end()); + std::map models; + for (const auto& [key, value] : response.models()) { + models.emplace(key, from_proto(value)); + } + return models; }); } diff --git a/src/viam/sdk/components/private/arm_client.hpp b/src/viam/sdk/components/private/arm_client.hpp index 7d403584a..41d6cc003 100644 --- a/src/viam/sdk/components/private/arm_client.hpp +++ b/src/viam/sdk/components/private/arm_client.hpp @@ -33,7 +33,7 @@ class ArmClient : public Arm { void stop(const ProtoStruct& extra) override; ProtoStruct do_command(const ProtoStruct& command) override; Arm::KinematicsData get_kinematics(const ProtoStruct& extra) override; - std::map get_3d_models(const ProtoStruct& extra) override; + std::map get_3d_models(const ProtoStruct& extra) override; std::vector get_geometries(const ProtoStruct& extra) override; // Using declarations to introduce convenience overloads of interface which do not need to be diff --git a/src/viam/sdk/components/private/arm_server.cpp b/src/viam/sdk/components/private/arm_server.cpp index f7e54893e..0e7113eed 100644 --- a/src/viam/sdk/components/private/arm_server.cpp +++ b/src/viam/sdk/components/private/arm_server.cpp @@ -140,10 +140,11 @@ ::grpc::Status ArmServer::Get3DModels(::grpc::ServerContext*, ::viam::common::v1::Get3DModelsResponse* response) noexcept { return make_service_helper( "ArmServer::Get3DModels", this, request)([&](auto& helper, auto& arm) { - const std::map models = - arm->get_3d_models(helper.getExtra()); + const std::map models = arm->get_3d_models(helper.getExtra()); - response->mutable_models()->insert(models.begin(), models.end()); + for (const auto& [key, mesh] : models) { + response->mutable_models()->insert({key, to_proto(mesh)}); + } }); } diff --git a/src/viam/sdk/tests/mocks/mock_arm.cpp b/src/viam/sdk/tests/mocks/mock_arm.cpp index 0a11824c9..e8993b8ce 100644 --- a/src/viam/sdk/tests/mocks/mock_arm.cpp +++ b/src/viam/sdk/tests/mocks/mock_arm.cpp @@ -1,3 +1,4 @@ +#include "viam/sdk/common/mesh.hpp" #include #include "mock_arm.hpp" @@ -7,8 +8,8 @@ namespace viam { namespace sdktests { namespace arm { -std::map fake_3d_models() { - return {{"model1", common::v1::Mesh::default_instance()}}; +std::map fake_3d_models() { + return {{"model1", sdk::mesh{"model1", {1, 2, 3, 4}}}}; } sdk::Arm::KinematicsData fake_kinematics() { @@ -63,7 +64,7 @@ std::vector MockArm::get_geometries(const sdk::ProtoStruct& return fake_geometries(); } -std::map MockArm::get_3d_models(const sdk::ProtoStruct&) { +std::map MockArm::get_3d_models(const sdk::ProtoStruct&) { return fake_3d_models(); } diff --git a/src/viam/sdk/tests/mocks/mock_arm.hpp b/src/viam/sdk/tests/mocks/mock_arm.hpp index 47806fe50..7052f4b05 100644 --- a/src/viam/sdk/tests/mocks/mock_arm.hpp +++ b/src/viam/sdk/tests/mocks/mock_arm.hpp @@ -7,7 +7,7 @@ namespace sdktests { namespace arm { sdk::Arm::KinematicsData fake_kinematics(); -std::map fake_3d_models(); +std::map fake_3d_models(); class MockArm : public sdk::Arm { public: @@ -30,7 +30,7 @@ class MockArm : public sdk::Arm { sdk::ProtoStruct do_command(const sdk::ProtoStruct& command) override; sdk::Arm::KinematicsData get_kinematics(const sdk::ProtoStruct&) override; std::vector get_geometries(const sdk::ProtoStruct&) override; - std::map get_3d_models(const sdk::ProtoStruct&) override; + std::map get_3d_models(const sdk::ProtoStruct&) override; sdk::pose current_location; std::vector joint_positions; std::vector> move_thru_positions; From 24e435c44eee57f787e115fa29e2671802783e63 Mon Sep 17 00:00:00 2001 From: Matthew MacFarquhar Date: Tue, 18 Nov 2025 17:43:15 -0500 Subject: [PATCH 5/5] use old for each syntax --- src/viam/sdk/components/private/arm_client.cpp | 4 ++-- src/viam/sdk/components/private/arm_server.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/viam/sdk/components/private/arm_client.cpp b/src/viam/sdk/components/private/arm_client.cpp index 64f09fd5d..88b775dc7 100644 --- a/src/viam/sdk/components/private/arm_client.cpp +++ b/src/viam/sdk/components/private/arm_client.cpp @@ -111,8 +111,8 @@ std::map ArmClient::get_3d_models(const ProtoStruct& extra) { .with(extra) .invoke([](auto& response) { std::map models; - for (const auto& [key, value] : response.models()) { - models.emplace(key, from_proto(value)); + for (const auto& entry : response.models()) { + models.emplace(entry.first, from_proto(entry.second)); } return models; }); diff --git a/src/viam/sdk/components/private/arm_server.cpp b/src/viam/sdk/components/private/arm_server.cpp index 0e7113eed..d8850f669 100644 --- a/src/viam/sdk/components/private/arm_server.cpp +++ b/src/viam/sdk/components/private/arm_server.cpp @@ -142,8 +142,8 @@ ::grpc::Status ArmServer::Get3DModels(::grpc::ServerContext*, "ArmServer::Get3DModels", this, request)([&](auto& helper, auto& arm) { const std::map models = arm->get_3d_models(helper.getExtra()); - for (const auto& [key, mesh] : models) { - response->mutable_models()->insert({key, to_proto(mesh)}); + for (const auto& entry : models) { + response->mutable_models()->insert({entry.first, to_proto(entry.second)}); } }); }