From e3cab3bc2f681e2381e9e8c46f873549c85d5216 Mon Sep 17 00:00:00 2001 From: Nick Franczak Date: Wed, 3 Jun 2026 15:00:56 -0400 Subject: [PATCH 1/2] max tcp speed --- src/viam/sdk/tests/test_arm.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/viam/sdk/tests/test_arm.cpp b/src/viam/sdk/tests/test_arm.cpp index ebe5bc52b..5a7d0ccbf 100644 --- a/src/viam/sdk/tests/test_arm.cpp +++ b/src/viam/sdk/tests/test_arm.cpp @@ -142,6 +142,22 @@ BOOST_AUTO_TEST_CASE(thru_joint_positions_vel_scalar_acc_vector) { }); } +BOOST_AUTO_TEST_CASE(thru_joint_positions_max_tcp_speed) { + std::shared_ptr mock = MockArm::get_mock_arm(); + client_to_mock_pipeline(mock, [&](Arm& client) { + std::vector> positions{{1.0, 2.0}, {3.0}}; + Arm::MoveOptions opts; + opts.max_vel_degs_per_sec = Arm::MoveLimit(1.0); + opts.max_acc_degs_per_sec2 = Arm::MoveLimit(2.0); + opts.max_tcp_speed = 42.0; + client.move_through_joint_positions(positions, opts, {}); + BOOST_CHECK_EQUAL(mock->move_thru_positions, positions); + + BOOST_REQUIRE(mock->move_opts.max_tcp_speed); + BOOST_CHECK_EQUAL(*mock->move_opts.max_tcp_speed, 42.0); + }); +} + BOOST_AUTO_TEST_CASE(test_stop) { std::shared_ptr mock = MockArm::get_mock_arm(); client_to_mock_pipeline(mock, [&](Arm& client) { From b12f578f3cbe3a6ae17f3f917c32383efdb3c12b Mon Sep 17 00:00:00 2001 From: Nick Franczak Date: Wed, 3 Jun 2026 15:02:01 -0400 Subject: [PATCH 2/2] max tcp speed components code --- src/viam/sdk/components/arm.hpp | 1 + src/viam/sdk/components/private/arm_client.cpp | 4 ++++ src/viam/sdk/components/private/arm_server.cpp | 4 ++++ 3 files changed, 9 insertions(+) diff --git a/src/viam/sdk/components/arm.hpp b/src/viam/sdk/components/arm.hpp index a8e89fcf5..e181dc4a9 100644 --- a/src/viam/sdk/components/arm.hpp +++ b/src/viam/sdk/components/arm.hpp @@ -46,6 +46,7 @@ class Arm : public Component, public Stoppable { struct MoveOptions { boost::optional max_vel_degs_per_sec; boost::optional max_acc_degs_per_sec2; + boost::optional max_tcp_speed; }; /// @brief Get the current position of the end of the arm. diff --git a/src/viam/sdk/components/private/arm_client.cpp b/src/viam/sdk/components/private/arm_client.cpp index a57cb59c1..9d98d679e 100644 --- a/src/viam/sdk/components/private/arm_client.cpp +++ b/src/viam/sdk/components/private/arm_client.cpp @@ -91,6 +91,10 @@ void ArmClient::move_through_joint_positions(const std::vectorset_max_tcp_speed(*options.max_tcp_speed); + } + for (const auto& pos : positions) { viam::component::arm::v1::JointPositions jpos; jpos.mutable_values()->Add(pos.begin(), pos.end()); diff --git a/src/viam/sdk/components/private/arm_server.cpp b/src/viam/sdk/components/private/arm_server.cpp index 13fbabee6..5530f157f 100644 --- a/src/viam/sdk/components/private/arm_server.cpp +++ b/src/viam/sdk/components/private/arm_server.cpp @@ -84,6 +84,10 @@ ::grpc::Status ArmServer::MoveThroughJointPositions( opts.max_acc_degs_per_sec2 = request->options().max_acc_degs_per_sec2(); } + if (request->options().has_max_tcp_speed()) { + opts.max_tcp_speed = request->options().max_tcp_speed(); + } + arm->move_through_joint_positions(positions, opts, helper.getExtra()); }); }