Skip to content

Commit

Permalink
Merge pull request #12 from tank104/AddCameraServer
Browse files Browse the repository at this point in the history
Added camera_server to package.
  • Loading branch information
tank104 committed Nov 28, 2022
2 parents 3dcc129 + f644b60 commit 5fa9a76
Show file tree
Hide file tree
Showing 9 changed files with 260 additions and 7 deletions.
3 changes: 3 additions & 0 deletions MavSdk/MavSdk.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,9 @@ The libraries can be used onboard a drone on a companion computer or on the grou
<ItemGroup>
<Protobuf Include="..\proto\protos\camera\camera.proto" Link="proto\camera\camera.proto" ProtoRoot="..\proto\protos" />
</ItemGroup>
<ItemGroup>
<Protobuf Include="..\proto\protos\camera_server\camera_server.proto" Link="proto\camera_server\camera_server.proto" ProtoRoot="..\proto\protos" />
</ItemGroup>
<ItemGroup>
<Protobuf Include="..\proto\protos\component_information\component_information.proto" Link="proto\component_information\component_information.proto" ProtoRoot="..\proto\protos" />
</ItemGroup>
Expand Down
1 change: 0 additions & 1 deletion MavSdk/MavSdkSystem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ namespace Mavsdk
public class MavSdkSystem : IMavSdkSystem
{
#region Constructors

public MavSdkSystem(Uri address)
{
_channel = GrpcChannel.ForAddress(address);
Expand Down
2 changes: 2 additions & 0 deletions MavSdk/Plugins/IMissionRaw.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ namespace Mavsdk.Plugins
public interface IMissionRaw
{
IObservable<Unit> UploadMission(List<MissionItem> missionItems);
IObservable<Unit> UploadGeofence(List<MissionItem> missionItems);
IObservable<Unit> UploadRallyPoints(List<MissionItem> missionItems);
IObservable<Unit> CancelMissionUpload();
IObservable<List<MissionItem>> DownloadMission();
IObservable<Unit> CancelMissionDownload();
Expand Down
5 changes: 4 additions & 1 deletion MavSdk/Plugins/ITelemetry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,14 @@ public interface ITelemetry
IObservable<DistanceSensor> DistanceSensor();
IObservable<ScaledPressure> ScaledPressure();
IObservable<Heading> Heading();
IObservable<Altitude> Altitude();
IObservable<Unit> SetRatePosition(double rateHz);
IObservable<Unit> SetRateHome(double rateHz);
IObservable<Unit> SetRateInAir(double rateHz);
IObservable<Unit> SetRateLandedState(double rateHz);
IObservable<Unit> SetRateVtolState(double rateHz);
IObservable<Unit> SetRateAttitude(double rateHz);
IObservable<Unit> SetRateAttitudeQuaternion(double rateHz);
IObservable<Unit> SetRateAttitudeEuler(double rateHz);
IObservable<Unit> SetRateCameraAttitude(double rateHz);
IObservable<Unit> SetRateVelocityNed(double rateHz);
IObservable<Unit> SetRateGpsInfo(double rateHz);
Expand All @@ -64,6 +66,7 @@ public interface ITelemetry
IObservable<Unit> SetRateRawImu(double rateHz);
IObservable<Unit> SetRateUnixEpochTime(double rateHz);
IObservable<Unit> SetRateDistanceSensor(double rateHz);
IObservable<Unit> SetRateAltitude(double rateHz);
IObservable<GpsGlobalOrigin> GetGpsGlobalOrigin();
}
}
42 changes: 42 additions & 0 deletions MavSdk/Plugins/MissionRaw.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,48 @@ public IObservable<Unit> UploadMission(List<MissionItem> missionItems)
});
}

public IObservable<Unit> UploadGeofence(List<MissionItem> missionItems)
{
return Observable.Create<Unit>(observer =>
{
var request = new UploadGeofenceRequest();
request.MissionItems.AddRange(missionItems);
var uploadGeofenceResponse = _missionRawServiceClient.UploadGeofence(request);
var missionRawResult = uploadGeofenceResponse.MissionRawResult;
if (missionRawResult.Result == MissionRawResult.Types.Result.Success)
{
observer.OnCompleted();
}
else
{
observer.OnError(new MissionRawException(missionRawResult.Result, missionRawResult.ResultStr));
}
return Task.FromResult(Disposable.Empty);
});
}

public IObservable<Unit> UploadRallyPoints(List<MissionItem> missionItems)
{
return Observable.Create<Unit>(observer =>
{
var request = new UploadRallyPointsRequest();
request.MissionItems.AddRange(missionItems);
var uploadRallyPointsResponse = _missionRawServiceClient.UploadRallyPoints(request);
var missionRawResult = uploadRallyPointsResponse.MissionRawResult;
if (missionRawResult.Result == MissionRawResult.Types.Result.Success)
{
observer.OnCompleted();
}
else
{
observer.OnError(new MissionRawException(missionRawResult.Result, missionRawResult.ResultStr));
}
return Task.FromResult(Disposable.Empty);
});
}

public IObservable<Unit> CancelMissionUpload()
{
return Observable.Create<Unit>(observer =>
Expand Down
72 changes: 68 additions & 4 deletions MavSdk/Plugins/Telemetry.cs
Original file line number Diff line number Diff line change
Expand Up @@ -748,6 +748,28 @@ public IObservable<Heading> Heading()
));
}

public IObservable<Altitude> Altitude()
{
return Observable.Using(() => _telemetryServiceClient.SubscribeAltitude(new SubscribeAltitudeRequest()),
reader => Observable.Create(
async (IObserver<Altitude> observer) =>
{
try
{
while (await reader.ResponseStream.MoveNext(CancellationToken.None))
{
observer.OnNext(reader.ResponseStream.Current.Altitude);
}
observer.OnCompleted();
}
catch (Exception ex)
{
observer.OnError(ex);
}
}
));
}

public IObservable<Unit> SetRatePosition(double rateHz)
{
return Observable.Create<Unit>(observer =>
Expand Down Expand Up @@ -853,14 +875,35 @@ public IObservable<Unit> SetRateVtolState(double rateHz)
});
}

public IObservable<Unit> SetRateAttitude(double rateHz)
public IObservable<Unit> SetRateAttitudeQuaternion(double rateHz)
{
return Observable.Create<Unit>(observer =>
{
var request = new SetRateAttitudeQuaternionRequest();
request.RateHz = rateHz;
var setRateAttitudeQuaternionResponse = _telemetryServiceClient.SetRateAttitudeQuaternion(request);
var telemetryResult = setRateAttitudeQuaternionResponse.TelemetryResult;
if (telemetryResult.Result == TelemetryResult.Types.Result.Success)
{
observer.OnCompleted();
}
else
{
observer.OnError(new TelemetryException(telemetryResult.Result, telemetryResult.ResultStr));
}
return Task.FromResult(Disposable.Empty);
});
}

public IObservable<Unit> SetRateAttitudeEuler(double rateHz)
{
return Observable.Create<Unit>(observer =>
{
var request = new SetRateAttitudeRequest();
var request = new SetRateAttitudeEulerRequest();
request.RateHz = rateHz;
var setRateAttitudeResponse = _telemetryServiceClient.SetRateAttitude(request);
var telemetryResult = setRateAttitudeResponse.TelemetryResult;
var setRateAttitudeEulerResponse = _telemetryServiceClient.SetRateAttitudeEuler(request);
var telemetryResult = setRateAttitudeEulerResponse.TelemetryResult;
if (telemetryResult.Result == TelemetryResult.Types.Result.Success)
{
observer.OnCompleted();
Expand Down Expand Up @@ -1210,6 +1253,27 @@ public IObservable<Unit> SetRateDistanceSensor(double rateHz)
});
}

public IObservable<Unit> SetRateAltitude(double rateHz)
{
return Observable.Create<Unit>(observer =>
{
var request = new SetRateAltitudeRequest();
request.RateHz = rateHz;
var setRateAltitudeResponse = _telemetryServiceClient.SetRateAltitude(request);
var telemetryResult = setRateAltitudeResponse.TelemetryResult;
if (telemetryResult.Result == TelemetryResult.Types.Result.Success)
{
observer.OnCompleted();
}
else
{
observer.OnError(new TelemetryException(telemetryResult.Result, telemetryResult.ResultStr));
}
return Task.FromResult(Disposable.Empty);
});
}

public IObservable<GpsGlobalOrigin> GetGpsGlobalOrigin()
{
return Observable.Create<GpsGlobalOrigin>(observer =>
Expand Down
123 changes: 123 additions & 0 deletions Mavsdk/Plugins/CameraServer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Threading;
using System.Threading.Tasks;
using Grpc.Net.Client;
using Mavsdk.Rpc.CameraServer;

using Version = Mavsdk.Rpc.Info.Version;

namespace Mavsdk.Plugins
{
public class CameraServer : ICameraServer
{
private readonly CameraServerService.CameraServerServiceClient _cameraServerServiceClient;

internal CameraServer(GrpcChannel channel)
{
_cameraServerServiceClient = new CameraServerService.CameraServerServiceClient(channel);
}

public IObservable<Unit> SetInformation(Information information)
{
return Observable.Create<Unit>(observer =>
{
var request = new SetInformationRequest();
request.Information = information;
var setInformationResponse = _cameraServerServiceClient.SetInformation(request);
var cameraServerResult = setInformationResponse.CameraServerResult;
if (cameraServerResult.Result == CameraServerResult.Types.Result.Success)
{
observer.OnCompleted();
}
else
{
observer.OnError(new CameraServerException(cameraServerResult.Result, cameraServerResult.ResultStr));
}
return Task.FromResult(Disposable.Empty);
});
}

public IObservable<Unit> SetInProgress(bool inProgress)
{
return Observable.Create<Unit>(observer =>
{
var request = new SetInProgressRequest();
request.InProgress = inProgress;
var setInProgressResponse = _cameraServerServiceClient.SetInProgress(request);
var cameraServerResult = setInProgressResponse.CameraServerResult;
if (cameraServerResult.Result == CameraServerResult.Types.Result.Success)
{
observer.OnCompleted();
}
else
{
observer.OnError(new CameraServerException(cameraServerResult.Result, cameraServerResult.ResultStr));
}
return Task.FromResult(Disposable.Empty);
});
}

public IObservable<int> TakePhoto()
{
return Observable.Using(() => _cameraServerServiceClient.SubscribeTakePhoto(new SubscribeTakePhotoRequest()),
reader => Observable.Create(
async (IObserver<int> observer) =>
{
try
{
while (await reader.ResponseStream.MoveNext(CancellationToken.None))
{
observer.OnNext(reader.ResponseStream.Current.Index);
}
observer.OnCompleted();
}
catch (Exception ex)
{
observer.OnError(ex);
}
}
));
}

public IObservable<Unit> RespondTakePhoto(TakePhotoFeedback takePhotoFeedback, CaptureInfo captureInfo)
{
return Observable.Create<Unit>(observer =>
{
var request = new RespondTakePhotoRequest();
request.TakePhotoFeedback = takePhotoFeedback;
request.CaptureInfo = captureInfo;
var respondTakePhotoResponse = _cameraServerServiceClient.RespondTakePhoto(request);
var cameraServerResult = respondTakePhotoResponse.CameraServerResult;
if (cameraServerResult.Result == CameraServerResult.Types.Result.Success)
{
observer.OnCompleted();
}
else
{
observer.OnError(new CameraServerException(cameraServerResult.Result, cameraServerResult.ResultStr));
}
return Task.FromResult(Disposable.Empty);
});
}
}

public class CameraServerException : Exception
{
public CameraServerResult.Types.Result Result { get; }
public string ResultStr { get; }

public CameraServerException(CameraServerResult.Types.Result result, string resultStr)
{
Result = result;
ResultStr = resultStr;
}
}
}
17 changes: 17 additions & 0 deletions Mavsdk/Plugins/ICameraServer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;
using System.Collections.Generic;
using System.Reactive;
using Mavsdk.Rpc.CameraServer;

using Version = Mavsdk.Rpc.Info.Version;

namespace Mavsdk.Plugins
{
public interface ICameraServer
{
IObservable<Unit> SetInformation(Information information);
IObservable<Unit> SetInProgress(bool inProgress);
IObservable<int> TakePhoto();
IObservable<Unit> RespondTakePhoto(TakePhotoFeedback takePhotoFeedback, CaptureInfo captureInfo);
}
}

0 comments on commit 5fa9a76

Please sign in to comment.