Skip to content

Commit 5c32ba3

Browse files
authored
[RSDK-10923] Add IsHoldingSomething to Gripper API (#454)
1 parent 345e1a3 commit 5c32ba3

File tree

8 files changed

+73
-1
lines changed

8 files changed

+73
-1
lines changed

src/viam/sdk/components/gripper.hpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <string>
77

8+
#include <viam/sdk/common/proto_value.hpp>
89
#include <viam/sdk/resource/stoppable.hpp>
910

1011
namespace viam {
@@ -20,6 +21,13 @@ namespace sdk {
2021
/// specific gripper implementations. This class cannot be used on its own.
2122
class Gripper : public Component, public Stoppable {
2223
public:
24+
/// @struct holding_status
25+
/// @brief whether the gripper is holding something (along with other contextual info)
26+
struct holding_status {
27+
bool is_holding_something;
28+
ProtoStruct meta;
29+
};
30+
2331
/// @brief Open the gripper.
2432
inline void open() {
2533
return open({});
@@ -40,6 +48,17 @@ class Gripper : public Component, public Stoppable {
4048
/// @return bool indicating if the gripper grabbed something.
4149
virtual bool grab(const ProtoStruct& extra) = 0;
4250

51+
/// @brief Reports whether the gripper is holding onto a object (alongside other information).
52+
/// @return holding_status (see `holding_status` struct for more info).
53+
inline holding_status is_holding_something() {
54+
return holding_status({});
55+
}
56+
57+
/// @brief Reports whether the gripper is holding onto a object (alongside other information).
58+
/// @param extra Any additional arguments to the method.
59+
/// @return holding_status (see `holding_status` struct for more info).
60+
virtual holding_status is_holding_something(const ProtoStruct& extra) = 0;
61+
4362
/// @brief Reports if the gripper is in motion.
4463
virtual bool is_moving() = 0;
4564

src/viam/sdk/components/private/gripper_client.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
#include <viam/api/component/gripper/v1/gripper.pb.h>
55

66
#include <viam/sdk/common/client_helper.hpp>
7-
#include <viam/sdk/common/proto_value.hpp>
7+
#include <viam/sdk/common/proto_convert.hpp>
88
#include <viam/sdk/spatialmath/geometry.hpp>
99

1010
namespace viam {
@@ -26,6 +26,17 @@ bool GripperClient::grab(const ProtoStruct& extra) {
2626
});
2727
}
2828

29+
Gripper::holding_status GripperClient::is_holding_something(const ProtoStruct& extra) {
30+
return make_client_helper(this, *stub_, &StubType::IsHoldingSomething)
31+
.with(extra)
32+
.invoke([](auto& response) {
33+
Gripper::holding_status holding_status;
34+
holding_status.is_holding_something = response.is_holding_something();
35+
holding_status.meta = from_proto(response.meta());
36+
return holding_status;
37+
});
38+
}
39+
2940
bool GripperClient::is_moving() {
3041
return make_client_helper(this, *stub_, &StubType::IsMoving).invoke([](auto& response) {
3142
return response.is_moving();

src/viam/sdk/components/private/gripper_client.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
#include <viam/api/component/gripper/v1/gripper.grpc.pb.h>
1111

12+
#include <viam/sdk/common/proto_value.hpp>
13+
1214
#include <viam/sdk/components/gripper.hpp>
1315

1416
namespace viam {
@@ -25,6 +27,7 @@ class GripperClient : public Gripper {
2527

2628
void open(const ProtoStruct& extra) override;
2729
bool grab(const ProtoStruct& extra) override;
30+
Gripper::holding_status is_holding_something(const ProtoStruct& extra) override;
2831
void stop(const ProtoStruct& extra) override;
2932
bool is_moving() override;
3033
ProtoStruct do_command(const ProtoStruct& command) override;

src/viam/sdk/components/private/gripper_server.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@ ::grpc::Status GripperServer::Grab(
2626
});
2727
}
2828

29+
::grpc::Status GripperServer::IsHoldingSomething(
30+
::grpc::ServerContext*,
31+
const ::viam::component::gripper::v1::IsHoldingSomethingRequest* request,
32+
::viam::component::gripper::v1::IsHoldingSomethingResponse* response) noexcept {
33+
return make_service_helper<Gripper>(
34+
"GripperServer::IsHoldingSomething", this, request)([&](auto& helper, auto& gripper) {
35+
const Gripper::holding_status res = gripper->is_holding_something(helper.getExtra());
36+
response->set_is_holding_something(res.is_holding_something);
37+
*(response->mutable_meta()) = to_proto(res.meta);
38+
});
39+
}
40+
2941
::grpc::Status GripperServer::Stop(::grpc::ServerContext*,
3042
const ::viam::component::gripper::v1::StopRequest* request,
3143
::viam::component::gripper::v1::StopResponse*) noexcept {

src/viam/sdk/components/private/gripper_server.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ class GripperServer : public ResourceServer,
3434
const ::viam::component::gripper::v1::StopRequest* request,
3535
::viam::component::gripper::v1::StopResponse* response) noexcept override;
3636

37+
::grpc::Status IsHoldingSomething(
38+
::grpc::ServerContext* context,
39+
const ::viam::component::gripper::v1::IsHoldingSomethingRequest* request,
40+
::viam::component::gripper::v1::IsHoldingSomethingResponse* response) noexcept override;
41+
3742
::grpc::Status IsMoving(
3843
::grpc::ServerContext* context,
3944
const ::viam::component::gripper::v1::IsMovingRequest* request,

src/viam/sdk/tests/mocks/mock_gripper.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ bool MockGripper::is_moving() {
2828
return false;
2929
}
3030

31+
Gripper::holding_status MockGripper::is_holding_something(const ProtoStruct& extra) {
32+
Gripper::holding_status res;
33+
res.is_holding_something = false;
34+
res.meta = extra;
35+
return res;
36+
}
37+
3138
ProtoStruct MockGripper::do_command(const ProtoStruct& command) {
3239
return (peek_command = command);
3340
}

src/viam/sdk/tests/mocks/mock_gripper.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class MockGripper : public sdk::Gripper {
1717

1818
void open(const sdk::ProtoStruct& extra) override;
1919
bool grab(const sdk::ProtoStruct& extra) override;
20+
Gripper::holding_status is_holding_something(const sdk::ProtoStruct& extra) override;
2021
void stop(const sdk::ProtoStruct& extra) override;
2122
bool is_moving() override;
2223
sdk::ProtoStruct do_command(const sdk::ProtoStruct& command) override;

src/viam/sdk/tests/test_gripper.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
BOOST_TEST_DONT_PRINT_LOG_VALUE(std::vector<viam::sdk::GeometryConfig>)
1010

11+
BOOST_TEST_DONT_PRINT_LOG_VALUE(viam::sdk::ProtoValue)
12+
1113
namespace viam {
1214
namespace sdktests {
1315

@@ -38,6 +40,18 @@ BOOST_AUTO_TEST_CASE(test_grab) {
3840
client_to_mock_pipeline<Gripper>(mock, [](Gripper& client) { BOOST_CHECK(client.grab()); });
3941
}
4042

43+
BOOST_AUTO_TEST_CASE(test_is_holding_something) {
44+
std::shared_ptr<MockGripper> mock = MockGripper::get_mock_gripper();
45+
client_to_mock_pipeline<Gripper>(mock, [](Gripper& client) {
46+
const ProtoStruct extra = {
47+
{"BEEP", "BOOP"},
48+
};
49+
Gripper::holding_status holding_status = client.is_holding_something(extra);
50+
BOOST_CHECK_EQUAL(holding_status.is_holding_something, false);
51+
BOOST_CHECK_EQUAL(holding_status.meta["BEEP"], ProtoValue("BOOP"));
52+
});
53+
}
54+
4155
BOOST_AUTO_TEST_CASE(test_stop) {
4256
std::shared_ptr<MockGripper> mock = MockGripper::get_mock_gripper();
4357
client_to_mock_pipeline<Gripper>(mock, [&](Gripper& client) {

0 commit comments

Comments
 (0)