Skip to content

Commit

Permalink
grpc : Dynamic plugin loading
Browse files Browse the repository at this point in the history
Split proto files(one for each plugin), load plugins based on plugins.conf file
  • Loading branch information
Rjasuja committed Oct 27, 2017
1 parent 97d98b9 commit 7f63bed
Show file tree
Hide file tree
Showing 11 changed files with 309 additions and 84 deletions.
30 changes: 30 additions & 0 deletions grpc/proto/action.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
syntax = "proto3";

package dronecorerpc;

service ActionRPC {
rpc Arm(ActionEmpty) returns(ActionResult) {}
rpc TakeOff(ActionEmpty) returns(ActionResult) {}
rpc Land(ActionEmpty) returns(ActionResult) {}
}

// FIXME these different Empty types are ugly
message ActionEmpty {}

message ActionResult {

enum Result {
SUCCESS = 0;
NO_DEVICE = 1;
CONNECTION_ERROR = 2;
BUSY = 3;
COMMAND_DENIED = 4;
COMMAND_DENIED_LANDED_STATE_UNKNOWN = 5;
COMMAND_DENIED_NOT_LANDED = 6;
TIMEOUT = 7;
UNKNOWN = 8;
}
Result result = 1;
string result_str = 2;
}

62 changes: 0 additions & 62 deletions grpc/proto/dronecore.proto
Original file line number Diff line number Diff line change
Expand Up @@ -5,68 +5,6 @@ package dronecorerpc;

// Interface exported by the server.
service DroneCoreRPC {
rpc Arm(Empty) returns(ActionResult) {}
rpc TakeOff(Empty) returns(ActionResult) {}
rpc Land(Empty) returns(ActionResult) {}
rpc SendMission(Mission) returns(MissionResult) {}
rpc StartMission(Empty) returns(MissionResult) {}
}

message Empty {}

message ActionResult {

enum Result {
Result_SUCCESS = 0;
Result_NO_DEVICE = 1;
Result_CONNECTION_ERROR = 2;
Result_BUSY = 3;
Result_COMMAND_DENIED = 4;
Result_COMMAND_DENIED_LANDED_STATE_UNKNOWN = 5;
Result_COMMAND_DENIED_NOT_LANDED = 6;
Result_TIMEOUT = 7;
Result_UNKNOWN = 8;
}
Result result = 1;
string result_str = 2;
}

message MissionResult {

enum Result {
Result_SUCCESS = 0;
Result_ERROR = 1;
Result_TOO_MANY_MISSION_ITEMS = 2;
Result_BUSY = 3;
Result_TIMEOUT = 4;
Result_INVALID_ARGUMENT = 5;
Result_UNKNOWN = 6;
}
Result result = 1;
string result_str = 2;
}

message MissionItem {

enum CameraAction {
CameraAction_TAKE_PHOTO = 0;
CameraAction_START_PHOTO_INTERVAL = 1;
CameraAction_STOP_PHOTO_INTERVAL = 2;
CameraAction_START_VIDEO = 3;
CameraAction_STOP_VIDEO = 4;
CameraAction_NONE = 5;
}

double latitude_deg = 1;
double longitude_deg = 2;
double relative_altitude_m = 3;
float speed_m_s = 4;
bool is_fly_through = 5;
float gimbal_pitch_deg = 6;
float gimbal_yaw_deg = 7;
CameraAction camera_action = 8;
}

message Mission {
repeated MissionItem mission_items = 1;
}
51 changes: 51 additions & 0 deletions grpc/proto/mission.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
syntax = "proto3";

package dronecorerpc;

service MissionRPC {
rpc SendMission(Mission) returns(MissionResult) {}
rpc StartMission(MissionEmpty) returns(MissionResult) {}
}

message MissionEmpty {}

message MissionResult {

enum Result {
SUCCESS = 0;
ERROR = 1;
TOO_MANY_MISSION_ITEMS = 2;
BUSY = 3;
TIMEOUT = 4;
INVALID_ARGUMENT = 5;
UNKNOWN = 6;
}
Result result = 1;
string result_str = 2;
}

message MissionItem {
double latitude_deg = 1;
double longitude_deg = 2;
double relative_altitude_m = 3;
float speed_m_s = 4;
bool is_fly_through = 5;
float gimbal_pitch_deg = 6;
float gimbal_yaw_deg = 7;

enum CameraAction {
NONE = 0;
TAKE_PHOTO = 1;
START_PHOTO_INTERVAL = 2;
STOP_PHOTO_INTERVAL = 3;
START_VIDEO = 4;
STOP_VIDEO = 5;
}
CameraAction camera_action = 8;
}

message Mission {
repeated MissionItem mission_items = 1;
}


3 changes: 3 additions & 0 deletions grpc/proto/plugins.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
telemetry
action
mission
16 changes: 16 additions & 0 deletions grpc/proto/telemetry.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
syntax = "proto3";

package dronecorerpc;

service TelemetryRPC {
rpc TelemetryPositionSubscription(TelemetryEmpty) returns(stream TelemetryPosition) {}
}

message TelemetryEmpty {}

message TelemetryPosition {
double latitude_deg = 1;
double longitude_deg = 2;
float absolute_altitude_m = 3;
float relative_altitude_m = 4;
}
29 changes: 29 additions & 0 deletions grpc/python_client/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,33 @@ if(${PYTHONINTERP_FOUND})
${proto_dir}/dronecore.proto
DEPENDS ${proto_dir}/dronecore.proto
)
add_custom_command(TARGET pydronecore
COMMAND ${PYTHON_EXECUTABLE}
-m grpc_tools.protoc
-I ${proto_dir}
--python_out=.
--grpc_python_out=.
${proto_dir}/action.proto
DEPENDS ${proto_dir}/action.proto
)

add_custom_command(TARGET pydronecore
COMMAND ${PYTHON_EXECUTABLE}
-m grpc_tools.protoc
-I ${proto_dir}
--python_out=.
--grpc_python_out=.
${proto_dir}/mission.proto
DEPENDS ${proto_dir}/mission.proto
)

add_custom_command(TARGET pydronecore
COMMAND ${PYTHON_EXECUTABLE}
-m grpc_tools.protoc
-I ${proto_dir}
--python_out=.
--grpc_python_out=.
${proto_dir}/telemetry.proto
DEPENDS ${proto_dir}/telemetry.proto
)
endif()
35 changes: 32 additions & 3 deletions grpc/python_client/async_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,44 @@
import grpc
import time
import dronecore_pb2 as dc
import dronecore_pb2_grpc
#import dronecore_pb2_grpc
# import dronecore_pb2_grpc
import action_pb2 as dc_action
import action_pb2_grpc
import telemetry_pb2 as dc_telemetry
import telemetry_pb2_grpc

class Colors:
BLUE = "\033[34m"
RESET = "\033[0m"

def wait_until(status):
ret = status.result()
return ret

def print_altitude(telemetry_stub, stop):
for i, position in enumerate(
telemetry_stub.TelemetryPositionSubscription(
dc_telemetry.TelemetryEmpty())):
# Position updates with SITL are too fast, we skip 9/10.
if i % 10 == 0:
print(Colors.BLUE, end="")
print("Got relative altitude: {:.2f} m".
format(position.relative_altitude_m))
print(Colors.RESET, end="")
if stop.is_set():
break

def run():
channel = grpc.insecure_channel('0.0.0.0:50051')
stub = dronecore_pb2_grpc.DroneCoreRPCStub(channel)
# stub = dronecore_pb2_grpc.DroneCoreRPCStub(channel)
action_stub = action_pb2_grpc.ActionRPCStub(channel)
telemetry_stub = telemetry_pb2_grpc.TelemetryRPCStub(channel)

# We use this stop event later to stop the thread.
t_stop = threading.Event()
t = threading.Thread(target=print_altitude, args=(telemetry_stub, t_stop))
t.start()

arm_result = stub.Arm.future(dc.Empty())
arm_result = wait_until(arm_result)
Expand All @@ -38,7 +67,7 @@ def run():
print("landing ok")
else:
print("landing failed: " + land_result.result_str)

time.sleep(3)

if __name__ == '__main__':
run()
17 changes: 12 additions & 5 deletions grpc/python_client/fly_mission.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,12 @@
from threading import Thread
import time
import dronecore_pb2 as dc
import dronecore_pb2_grpc
#import dronecore_pb2_grpc
# import dronecore_pb2_grpc
import action_pb2 as dc_action
import action_pb2_grpc
import mission_pb2 as dc_mission
import mission_pb2_grpc


thread_status = True
Expand All @@ -22,7 +27,9 @@ def wait_func(future_status):
def run():
global thread_status
channel = grpc.insecure_channel('0.0.0.0:50051')
stub = dronecore_pb2_grpc.DroneCoreRPCStub(channel)
# stub = dronecore_pb2_grpc.DroneCoreRPCStub(channel)
action_stub = action_pb2_grpc.ActionRPCStub(channel)
mission_stub = mission_pb2_grpc.MissionRPCStub(channel)

mission_items = []

Expand Down Expand Up @@ -86,13 +93,13 @@ def run():
gimbal_yaw_deg=0,
camera_action=dc.MissionItem.CameraAction_STOP_PHOTO_INTERVAL))

stub.SendMission(dc.Mission(mission_items=mission_items))
mission_stub.SendMission(dc.Mission(mission_items=mission_items))
time.sleep(1)

stub.Arm(dc.Empty())
action_stub.Arm(dc.Empty())
time.sleep(1)

future_status = stub.StartMission.future(dc.Empty())
future_status = mission_stub.StartMission.future(dc_mission.MissionEmpty())
t = Thread(target=wait_func, args=(future_status,))
t.start()

Expand Down
14 changes: 8 additions & 6 deletions grpc/python_client/sync_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,32 @@
import grpc
import time
import dronecore_pb2 as dc
import dronecore_pb2_grpc

#import dronecore_pb2_grpc
import action_pb2 as dc_action
import action_pb2_grpc

def run():
channel = grpc.insecure_channel('0.0.0.0:50051')
stub = dronecore_pb2_grpc.DroneCoreRPCStub(channel)
# stub = dronecore_pb2_grpc.DroneCoreRPCStub(channel)
action_stub = action_pb2_grpc.ActionRPCStub(channel)

arm_result = stub.Arm(dc.Empty())
arm_result = action_stub.Arm(dc.Empty())
if arm_result.result == dc.ActionResult.SUCCESS:
print("arming ok")
else:
print("arming failed: " + arm_result.result_str)

time.sleep(2)

takeoff_result = stub.TakeOff(dc.Empty())
takeoff_result = action_stub.TakeOff(dc.Empty())
if takeoff_result.result == dc.ActionResult.SUCCESS:
print("takeoff ok")
else:
print("takeoff failed: " + takeoff_result.result_str)

time.sleep(5)

land_result = stub.Land(dc.Empty())
land_result = action_stub.Land(dc.Empty())
if land_result.result == dc.ActionResult.SUCCESS:
print("landing ok")
else:
Expand Down
Loading

0 comments on commit 7f63bed

Please sign in to comment.