Rework lidar cache to support grpc streaming

This commit is contained in:
Piv
2020-05-31 16:01:43 +09:30
parent 7750fa80d7
commit 31d6bed897
5 changed files with 105 additions and 30 deletions

View File

@@ -18,9 +18,14 @@ import com.google.protobuf.Empty;
import org.vato.carcontroller.PersonTrackingGrpc;
import org.vato.carcontroller.PointScan;
import org.vato.carcontroller.StreamMessage;
import org.vato.carcontroller.Updaters.AbstractUpdater;
import org.vato.carcontroller.Updaters.GrpcUpdater;
import org.vato.carcontroller.Updaters.ZmqUpdater;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import io.grpc.ManagedChannel;
@@ -28,7 +33,8 @@ import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;
public class LidarView extends SurfaceView
implements AbstractUpdater.MapChangedListener<PointScan> {
implements AbstractUpdater.MapChangedListener<PointScan>,
GrpcUpdater.GrpcUpdateBootstrapper<PointScan> {
private static final String LIDAR_TOPIC = "lidar_map";
@@ -36,7 +42,10 @@ public class LidarView extends SurfaceView
private Thread lidarThread;
private String port;
private SurfaceHolder surfaceHolder;
private boolean useGrpcStreams;
PersonTrackingGrpc.PersonTrackingStub stub;
private float timeBetweenMessages = 0.01f;
private Map<Integer, Paint> groupNumPaints = new HashMap<>();
private int mBitmapX, mBitmapY, mViewWidth, mViewHeight;
private Bitmap mBitmap;
@@ -61,8 +70,14 @@ public class LidarView extends SurfaceView
String host = prefs.getString("host", "10.0.0.53");
port = prefs.getString("zmqPort", "5050");
String gRPCPort = prefs.getString("port", "50051");
lidar = new ZmqUpdater<>(PointScan.getDefaultInstance().getParserForType(), LIDAR_TOPIC,
host, port);
useGrpcStreams = prefs.getBoolean("use_grpc_streams", false);
if (useGrpcStreams) {
lidar = new GrpcUpdater<>(PointScan.getDefaultInstance().getParserForType(), this);
} else {
lidar = new ZmqUpdater<>(PointScan.getDefaultInstance().getParserForType(), LIDAR_TOPIC,
host, port);
}
lidar.addMapChangedListener(this);
surfaceHolder = getHolder();
lidarThread = new Thread(lidar);
@@ -75,7 +90,16 @@ public class LidarView extends SurfaceView
* Called by MainActivity.onResume() to start a thread.
*/
public void resume() {
StreamObserver<Empty> response = new StreamObserver<Empty>() {
if (useGrpcStreams) {
lidarThread.start();
} else {
doZmqLidarStream();
}
}
private void doZmqLidarStream() {
// use async grpc method, ZMQ doesn't need to connect straight away.
stub.startTracking(Empty.newBuilder().build(), new StreamObserver<Empty>() {
@Override
public void onNext(Empty value) {
lidarThread.start();
@@ -91,9 +115,7 @@ public class LidarView extends SurfaceView
public void onCompleted() {
// Don't care.
}
};
// use async grpc method, ZMQ doesn't need to connect straight away.
stub.startTracking(Empty.newBuilder().build(), response);
});
}
@Override
@@ -135,6 +157,7 @@ public class LidarView extends SurfaceView
try {
lidarThread.join(1000);
} catch (InterruptedException e) {
Log.d("LIDAR", "Lidar failed to join", e);
}
}
@@ -148,8 +171,18 @@ public class LidarView extends SurfaceView
Collectors.toList())) {
// Now for each point, draw a circle for the point (so it's big enough) in the correct spot,
// and create a colour for that point to paint it correctly.
// TODO: Dynamically change the colour of the paint object based on the point group number.
canvas.drawCircle((float) point.x, (float) point.y, 5, new Paint());
if (!groupNumPaints.containsKey(point.groupNumber)) {
Paint paint = new Paint();
paint.setColor(
Color.HSVToColor(new float[]{convertGroupNumberToHue(
point.groupNumber), 1f, 1f}));
groupNumPaints.put(point.groupNumber, paint);
}
// TODO:
canvas.drawCircle((float) point.x, (float) point.y, 5,
Objects.requireNonNull(groupNumPaints
.get(point.groupNumber))); // Can't be null as we just added it.
}
canvas.restore();
surfaceHolder.unlockCanvasAndPost(canvas);
@@ -157,17 +190,24 @@ public class LidarView extends SurfaceView
}
/**
*
* @param groupNumber
* @return
*/
private static int convertGroupNumberToHue(int groupNumber){
return 0;
private static int convertGroupNumberToHue(int groupNumber) {
return (43 * groupNumber) % 360;
}
@Override
public void bootstrap(StreamObserver<PointScan> responseObserver) {
stub.lidarStream(
StreamMessage.newBuilder().setTimeBetweenMessages(timeBetweenMessages).build(),
responseObserver);
}
private static class Point {
private double x;
private double y;
private int groupNumber;
private Point(double x, double y) {
this.x = x;
@@ -175,7 +215,9 @@ public class LidarView extends SurfaceView
}
static Point fromProtoPoint(org.vato.carcontroller.Point point) {
return fromHist(point.getDistance(), point.getAngle());
Point p = fromHist(point.getDistance(), point.getAngle());
p.groupNumber = point.getGroupNumber();
return p;
}
static Point fromHist(double distance, double angle) {

View File

@@ -10,7 +10,7 @@ import io.grpc.stub.StreamObserver;
public class GrpcUpdater<T extends MessageLite> extends AbstractUpdater<T> {
GrpcUpdateBootstrapper<T> bootstrapper;
public GrpcUpdater(Parser parser, GrpcUpdateBootstrapper bootstrapper) {
public GrpcUpdater(Parser<T> parser, GrpcUpdateBootstrapper<T> bootstrapper) {
super(parser);
this.bootstrapper = bootstrapper;
}