Skip to content

Commit 2deaf73

Browse files
committed
nav service compiles, register it
1 parent 0cb6b02 commit 2deaf73

File tree

5 files changed

+237
-11
lines changed

5 files changed

+237
-11
lines changed

src/viam/sdk/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ target_sources(viamsdk
127127
services/private/motion_client.cpp
128128
services/private/motion_server.cpp
129129
services/private/navigation_client.cpp
130+
services/private/navigation_server.cpp
130131
services/service.cpp
131132
spatialmath/geometry.cpp
132133
spatialmath/orientation.cpp

src/viam/sdk/registry/registry.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@
4848
#include <viam/sdk/services/private/mlmodel_server.hpp>
4949
#include <viam/sdk/services/private/motion_client.hpp>
5050
#include <viam/sdk/services/private/motion_server.hpp>
51-
// todo nav service
51+
#include <viam/sdk/services/private/navigation_client.hpp>
52+
#include <viam/sdk/services/private/navigation_server.hpp>
5253
#include <viam/sdk/services/service.hpp>
5354

5455
namespace viam {
@@ -191,6 +192,7 @@ void register_resources() {
191192
Registry::register_resource<impl::GenericServiceClient, impl::GenericServiceServer>();
192193
Registry::register_resource<impl::MLModelServiceClient, impl::MLModelServiceServer>();
193194
Registry::register_resource<impl::MotionClient, impl::MotionServer>();
195+
Registry::register_resource<impl::NavigationClient, impl::NavigationServer>();
194196
}
195197

196198
void Registry::initialize() {

src/viam/sdk/services/navigation.hpp

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,39 @@ class Navigation : public Service {
3737
};
3838

3939
struct Waypoint {
40-
Waypoint(const viam::service::navigation::v1::Waypoint& proto) {
41-
this->id = proto.id();
42-
this->location = proto.location();
43-
}
40+
Waypoint(const viam::service::navigation::v1::Waypoint& proto) {
41+
this->id = proto.id();
42+
this->location = proto.location();
43+
}
44+
45+
operator viam::service::navigation::v1::Waypoint() {
46+
viam::service::navigation::v1::Waypoint ret;
47+
*ret.mutable_id() = id;
48+
*ret.mutable_location() = location;
49+
return ret;
50+
}
51+
4452
std::string id;
4553
GeoPoint location;
4654
};
4755

4856
struct Path {
4957
Path(const viam::service::navigation::v1::Path& proto) {
5058
this->destination_waypoint_id = proto.destination_waypoint_id();
51-
this->geopoints = std::vector<GeoPoint>(proto.geopoints().begin(), proto.geopoints().end());
59+
this->geopoints =
60+
std::vector<GeoPoint>(proto.geopoints().begin(), proto.geopoints().end());
5261
}
62+
63+
operator viam::service::navigation::v1::Path() {
64+
viam::service::navigation::v1::Path ret;
65+
*ret.mutable_destination_waypoint_id() = destination_waypoint_id;
66+
auto dest_points = ret.mutable_geopoints();
67+
for (const auto& x : geopoints) {
68+
*dest_points->Add() = x;
69+
}
70+
return ret;
71+
}
72+
5373
std::string destination_waypoint_id;
5474
std::vector<GeoPoint> geopoints;
5575
};
@@ -59,11 +79,18 @@ class Navigation : public Service {
5979
virtual Mode get_mode(const std::string name, const ProtoStruct& extra) = 0;
6080
virtual void set_mode(const std::string name, const Mode mode, const ProtoStruct& extra) = 0;
6181
virtual LocationResponse get_location(const std::string name, const ProtoStruct& extra) = 0;
62-
virtual std::unique_ptr<std::vector<Waypoint>> get_waypoints(const std::string name, const ProtoStruct& extra) = 0;
63-
virtual void add_waypoint(const std::string name, const GeoPoint& location, const ProtoStruct& extra) = 0;
64-
virtual void remove_waypoint(const std::string name, const std::string id, const ProtoStruct& extra) = 0;
65-
virtual std::unique_ptr<std::vector<GeoGeometry>> get_obstacles(const std::string name, const ProtoStruct& extra) = 0;
66-
virtual std::unique_ptr<std::vector<Path>> get_paths(const std::string name, const ProtoStruct& extra) = 0;
82+
virtual std::unique_ptr<std::vector<Waypoint>> get_waypoints(const std::string name,
83+
const ProtoStruct& extra) = 0;
84+
virtual void add_waypoint(const std::string name,
85+
const GeoPoint& location,
86+
const ProtoStruct& extra) = 0;
87+
virtual void remove_waypoint(const std::string name,
88+
const std::string id,
89+
const ProtoStruct& extra) = 0;
90+
virtual std::unique_ptr<std::vector<GeoGeometry>> get_obstacles(const std::string name,
91+
const ProtoStruct& extra) = 0;
92+
virtual std::unique_ptr<std::vector<Path>> get_paths(const std::string name,
93+
const ProtoStruct& extra) = 0;
6794
virtual MapType get_properties(const std::string) = 0;
6895
virtual ProtoStruct do_command(const ProtoStruct& command) = 0;
6996

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
#include <memory>
2+
3+
#include <grpcpp/support/status.h>
4+
5+
#include <viam/sdk/common/pose.hpp>
6+
#include <viam/sdk/common/proto_value.hpp>
7+
#include <viam/sdk/common/service_helper.hpp>
8+
#include <viam/sdk/common/utils.hpp>
9+
#include <viam/sdk/services/motion.hpp>
10+
#include <viam/sdk/services/private/navigation_server.hpp>
11+
#include <viam/sdk/spatialmath/geometry.hpp>
12+
13+
namespace viam {
14+
namespace sdk {
15+
namespace impl {
16+
17+
using namespace service::navigation::v1;
18+
19+
::grpc::Status NavigationServer::GetMode(::grpc::ServerContext* context,
20+
const GetModeRequest* request,
21+
GetModeResponse* response) noexcept {
22+
return make_service_helper<Navigation>(
23+
"NavigationServer::GetMode", this, request)([&](auto& helper, auto& nav) {
24+
response->set_mode(Mode(nav->get_mode(request->name(), struct_to_map(request->extra()))));
25+
});
26+
}
27+
28+
::grpc::Status NavigationServer::SetMode(::grpc::ServerContext* context,
29+
const SetModeRequest* request,
30+
SetModeResponse* response) noexcept {
31+
return make_service_helper<Navigation>(
32+
"NavigationServer::SetMode", this, request)([&](auto& helper, auto& nav) {
33+
nav->set_mode(
34+
request->name(), Navigation::Mode(request->mode()), struct_to_map(request->extra()));
35+
});
36+
}
37+
38+
::grpc::Status NavigationServer::GetLocation(::grpc::ServerContext* context,
39+
const GetLocationRequest* request,
40+
GetLocationResponse* response) noexcept {
41+
return make_service_helper<Navigation>(
42+
"NavigationServer::GetLocation", this, request)([&](auto& helper, auto& nav) {
43+
const auto& loc = nav->get_location(request->name(), struct_to_map(request->extra()));
44+
*response->mutable_location() = loc.location;
45+
response->set_compass_heading(loc.compass_heading);
46+
});
47+
}
48+
49+
// helper; copies vec<Src> into RepeatedPtrField<Dst>.
50+
template <typename Src, typename Dst>
51+
void vecToRepeatedPtr(std::vector<Src>& vec, google::protobuf::RepeatedPtrField<Dst>* dest) {
52+
dest->Reserve(vec.size());
53+
for (auto& x : vec) {
54+
*dest->Add() = x;
55+
}
56+
}
57+
58+
::grpc::Status NavigationServer::GetWaypoints(::grpc::ServerContext* context,
59+
const GetWaypointsRequest* request,
60+
GetWaypointsResponse* response) noexcept {
61+
return make_service_helper<Navigation>(
62+
"NavigationServer::GetWaypoints", this, request)([&](auto& helper, auto& nav) {
63+
const auto& waypoints =
64+
nav->get_waypoints(request->name(), struct_to_map(request->extra()));
65+
vecToRepeatedPtr(*waypoints, response->mutable_waypoints());
66+
});
67+
}
68+
69+
::grpc::Status NavigationServer::AddWaypoint(::grpc::ServerContext* context,
70+
const AddWaypointRequest* request,
71+
AddWaypointResponse* response) noexcept {
72+
return make_service_helper<Navigation>(
73+
"NavigationServer::AddWaypoint", this, request)([&](auto& helper, auto& nav) {
74+
nav->add_waypoint(request->name(), request->location(), struct_to_map(request->extra()));
75+
});
76+
}
77+
78+
::grpc::Status NavigationServer::RemoveWaypoint(::grpc::ServerContext* context,
79+
const RemoveWaypointRequest* request,
80+
RemoveWaypointResponse* response) noexcept {
81+
return make_service_helper<Navigation>(
82+
"NavigationServer::RemoveWaypoint", this, request)([&](auto& helper, auto& nav) {
83+
nav->remove_waypoint(request->name(), request->id(), struct_to_map(request->extra()));
84+
});
85+
}
86+
87+
::grpc::Status NavigationServer::GetObstacles(::grpc::ServerContext* context,
88+
const GetObstaclesRequest* request,
89+
GetObstaclesResponse* response) noexcept {
90+
return make_service_helper<Navigation>(
91+
"NavigationServer::GetObstacles", this, request)([&](auto& helper, auto& nav) {
92+
const auto& obstacles =
93+
nav->get_obstacles(request->name(), struct_to_map(request->extra()));
94+
vecToRepeatedPtr(*obstacles, response->mutable_obstacles());
95+
});
96+
}
97+
98+
::grpc::Status NavigationServer::GetPaths(::grpc::ServerContext* context,
99+
const GetPathsRequest* request,
100+
GetPathsResponse* response) noexcept {
101+
return make_service_helper<Navigation>(
102+
"NavigationServer::GetPaths", this, request)([&](auto& helper, auto& nav) {
103+
const auto& paths = nav->get_paths(request->name(), struct_to_map(request->extra()));
104+
vecToRepeatedPtr(*paths, response->mutable_paths());
105+
});
106+
}
107+
108+
::grpc::Status NavigationServer::GetProperties(::grpc::ServerContext* context,
109+
const GetPropertiesRequest* request,
110+
GetPropertiesResponse* response) noexcept {
111+
return make_service_helper<Navigation>(
112+
"NavigationServer::GetProperties", this, request)([&](auto& helper, auto& nav) {
113+
response->set_map_type(
114+
viam::service::navigation::v1::MapType(nav->get_properties(request->name())));
115+
});
116+
}
117+
118+
::grpc::Status NavigationServer::DoCommand(
119+
::grpc::ServerContext*,
120+
const ::viam::common::v1::DoCommandRequest* request,
121+
::viam::common::v1::DoCommandResponse* response) noexcept {
122+
return make_service_helper<Motion>(
123+
"NavigationServer::DoCommand", this, request)([&](auto&, auto& motion) {
124+
const ProtoStruct result = motion->do_command(struct_to_map(request->command()));
125+
*response->mutable_result() = map_to_struct(result);
126+
});
127+
};
128+
129+
} // namespace impl
130+
} // namespace sdk
131+
} // namespace viam
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/// @file services/private/navigation_server.hpp
2+
///
3+
/// @brief Implements a gRPC server for the `Navigation` service.
4+
#pragma once
5+
6+
#include <memory>
7+
8+
#include <viam/api/service/navigation/v1/navigation.grpc.pb.h>
9+
10+
#include <viam/sdk/resource/resource_manager.hpp>
11+
#include <viam/sdk/resource/resource_server_base.hpp>
12+
#include <viam/sdk/rpc/server.hpp>
13+
#include <viam/sdk/services/navigation.hpp>
14+
15+
namespace viam {
16+
namespace sdk {
17+
namespace impl {
18+
19+
using namespace service::navigation::v1;
20+
21+
/// @class NavigationServer
22+
/// @brief gRPC server implementation of a `Navigation` service.
23+
/// @ingroup Navigation
24+
class NavigationServer : public ResourceServer,
25+
public viam::service::navigation::v1::NavigationService::Service {
26+
public:
27+
using interface_type = Navigation;
28+
using service_type = service::navigation::v1::NavigationService;
29+
explicit NavigationServer(std::shared_ptr<ResourceManager> manager) : ResourceServer(std::move(manager)){}
30+
31+
::grpc::Status GetMode(::grpc::ServerContext* context,
32+
const GetModeRequest* request,
33+
GetModeResponse* response) noexcept override;
34+
::grpc::Status SetMode(::grpc::ServerContext* context,
35+
const SetModeRequest* request,
36+
SetModeResponse* response) noexcept override;
37+
::grpc::Status GetLocation(::grpc::ServerContext* context,
38+
const GetLocationRequest* request,
39+
GetLocationResponse* response) noexcept override;
40+
::grpc::Status GetWaypoints(::grpc::ServerContext* context,
41+
const GetWaypointsRequest* request,
42+
GetWaypointsResponse* response) noexcept override;
43+
::grpc::Status AddWaypoint(::grpc::ServerContext* context,
44+
const AddWaypointRequest* request,
45+
AddWaypointResponse* response) noexcept override;
46+
::grpc::Status RemoveWaypoint(::grpc::ServerContext* context,
47+
const RemoveWaypointRequest* request,
48+
RemoveWaypointResponse* response) noexcept override;
49+
::grpc::Status GetObstacles(::grpc::ServerContext* context,
50+
const GetObstaclesRequest* request,
51+
GetObstaclesResponse* response) noexcept override;
52+
::grpc::Status GetPaths(::grpc::ServerContext* context,
53+
const GetPathsRequest* request,
54+
GetPathsResponse* response) noexcept override;
55+
::grpc::Status GetProperties(::grpc::ServerContext* context,
56+
const GetPropertiesRequest* request,
57+
GetPropertiesResponse* response) noexcept override;
58+
::grpc::Status DoCommand(::grpc::ServerContext* context,
59+
const ::viam::common::v1::DoCommandRequest* request,
60+
::viam::common::v1::DoCommandResponse* response) noexcept override;
61+
};
62+
63+
} // namespace impl
64+
} // namespace sdk
65+
} // namespace viam

0 commit comments

Comments
 (0)