Skip to content

Commit aba2ec8

Browse files
committed
[RSDK-10923] Add IsHoldingSomething to Gripper API
1 parent 345e1a3 commit aba2ec8

File tree

7 files changed

+63
-0
lines changed

7 files changed

+63
-0
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_convert.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: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,23 @@ 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+
if response
36+
.has_meta() {
37+
holding_status.meta = from_proto(response.meta());
38+
}
39+
else {
40+
holding_status.meta = {};
41+
}
42+
return holding_status;
43+
});
44+
}
45+
2946
bool GripperClient::is_moving() {
3047
return make_client_helper(this, *stub_, &StubType::IsMoving).invoke([](auto& response) {
3148
return response.is_moving();

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class GripperClient : public Gripper {
2525

2626
void open(const ProtoStruct& extra) override;
2727
bool grab(const ProtoStruct& extra) override;
28+
Gripper::holding_status is_holding_something(const ProtoStruct& extra) override;
2829
void stop(const ProtoStruct& extra) override;
2930
bool is_moving() override;
3031
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+
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&) {
32+
Gripper::holding_status res;
33+
res.is_holding_something = false;
34+
res.meta = {};
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: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ 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 MockGripper::is_holding_something(
21+
const sdk::ProtoStruct& extra) override;
2022
void stop(const sdk::ProtoStruct& extra) override;
2123
bool is_moving() override;
2224
sdk::ProtoStruct do_command(const sdk::ProtoStruct& command) override;

0 commit comments

Comments
 (0)