Add primary functionality to lidar view based on slam view.

Also go back to java 8.
This commit is contained in:
Piv
2020-03-22 20:21:57 +10:30
parent 03f6c2b9f7
commit bd735fd6b0
5 changed files with 93 additions and 42 deletions

2
.idea/misc.xml generated
View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_9" project-jdk-name="1.8" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View File

@@ -19,8 +19,8 @@ android {
} }
} }
compileOptions { compileOptions {
sourceCompatibility = 9.8 sourceCompatibility = 1.8
targetCompatibility = 9.8 targetCompatibility = 1.8
} }
} }

View File

@@ -1,35 +1,95 @@
package com.example.carcontroller.LIDAR; package com.example.carcontroller.LIDAR;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.SurfaceHolder; import android.view.SurfaceHolder;
import android.view.SurfaceView; import android.view.SurfaceView;
import androidx.preference.PreferenceManager;
import com.example.carcontroller.Empty;
import com.example.carcontroller.Int32Value;
import com.example.carcontroller.PersonTrackingGrpc; import com.example.carcontroller.PersonTrackingGrpc;
import com.example.carcontroller.PointScan;
import com.example.carcontroller.Updaters.AbstractUpdater;
import com.example.carcontroller.Updaters.ZmqUpdater;
public class LidarView extends SurfaceView implements Runnable { import java.util.stream.Collectors;
private boolean running; import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;
public class LidarView extends SurfaceView implements AbstractUpdater.MapChangedListener<PointScan> {
private static final String LIDAR_TOPIC = "lidar_map";
private AbstractUpdater<PointScan> lidar;
private Thread lidarThread; private Thread lidarThread;
private SurfaceHolder holder; private String port;
PersonTrackingGrpc.PersonTrackingBlockingStub stub; private SurfaceHolder surfaceHolder;
PersonTrackingGrpc.PersonTrackingStub stub;
private int mBitmapX, mBitmapY, mViewWidth, mViewHeight; private int mBitmapX, mBitmapY, mViewWidth, mViewHeight;
private Bitmap mBitmap; private Bitmap mBitmap;
public LidarView(Context context) { public LidarView(Context context) {
super(context); super(context);
init();
} }
public LidarView(Context context, AttributeSet attrs) { public LidarView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
init();
} }
public LidarView(Context context, AttributeSet attrs, int defStyleAttr) { public LidarView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr); super(context, attrs, defStyleAttr);
init();
}
private void init() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
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);
lidar.addMapChangedListener(this);
surfaceHolder = getHolder();
lidarThread = new Thread(lidar);
ManagedChannel channel = ManagedChannelBuilder.forAddress(host, Integer.parseInt(gRPCPort)).usePlaintext().build();
stub = PersonTrackingGrpc.newStub(channel);
}
/**
* Called by MainActivity.onResume() to start a thread.
*/
public void resume() {
StreamObserver<Empty> response = new StreamObserver<Empty>() {
@Override
public void onNext(Empty value) {
lidarThread.start();
}
@Override
public void onError(Throwable t) {
// TODO: close the activity,
System.out.println(t.getMessage());
}
@Override
public void onCompleted() {
// Don't care.
}
};
// use async grpc method, ZMQ doesn't need to connect straight away.
stub.startTracking(Int32Value.newBuilder().setValue(Integer.parseInt(port)).build(), response);
} }
@Override @Override
@@ -42,7 +102,7 @@ public class LidarView extends SurfaceView implements Runnable {
float x = event.getX(); float x = event.getX();
float y = event.getY(); float y = event.getY();
// Get the group that was selected and select on the grpc controller. // TODO: Get the group that was selected and select on the grpc controller.
switch (event.getAction()) { switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_DOWN:
break; break;
@@ -50,36 +110,31 @@ public class LidarView extends SurfaceView implements Runnable {
return true; return true;
} }
@Override
public void run() {
Canvas canvas;
while (running) {
if (holder.getSurface().isValid()) {
canvas = holder.lockCanvas();
canvas.save();
// Get the updated points from the raspberry pi.
public void stop() {
// Iterate through every point (hist point) and draw to the canvas. // TODO: Use grpc to tell zmq to stop.
lidar.stop();
}
}
}
public void pause() {
running = false;
try { try {
lidarThread.join(); lidarThread.join(1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
} }
} }
public void resume() { @Override
lidarThread = new Thread(this); public void mapChanged(PointScan points) {
lidarThread.start(); if (surfaceHolder.getSurface().isValid()) {
running = true; Canvas canvas = surfaceHolder.lockCanvas();
canvas.save();
canvas.drawColor(Color.WHITE);
for (Point point : points.getPointsList().stream().map(Point::fromProtoPoint).collect(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());
}
canvas.restore();
surfaceHolder.unlockCanvasAndPost(canvas);
}
} }
private static class Point { private static class Point {
@@ -91,8 +146,8 @@ public class LidarView extends SurfaceView implements Runnable {
this.y = y; this.y = y;
} }
static Point fromXY(double x, double y) { static Point fromProtoPoint(com.example.carcontroller.Point point) {
return new Point(x, y); return fromHist(point.getDistance(), point.getAngle());
} }
static Point fromHist(double distance, double angle) { static Point fromHist(double distance, double angle) {

View File

@@ -31,7 +31,6 @@ public class SlamView extends SurfaceView implements AbstractUpdater.MapChangedL
private AbstractUpdater<SlamScan> slam; private AbstractUpdater<SlamScan> slam;
private Thread mapThread; private Thread mapThread;
private Context context;
private SurfaceHolder surfaceHolder; private SurfaceHolder surfaceHolder;
private Paint paint; private Paint paint;
private SlamControlGrpc.SlamControlStub stub; private SlamControlGrpc.SlamControlStub stub;
@@ -41,24 +40,21 @@ public class SlamView extends SurfaceView implements AbstractUpdater.MapChangedL
public SlamView(Context context) { public SlamView(Context context) {
super(context); super(context);
this.context = context;
init(); init();
} }
public SlamView(Context context, AttributeSet attrs) { public SlamView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
this.context = context;
init(); init();
} }
public SlamView(Context context, AttributeSet attrs, int defStyleAttr) { public SlamView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr); super(context, attrs, defStyleAttr);
this.context = context;
init(); init();
} }
private void init() { private void init() {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext());
String host = prefs.getString("host", "10.0.0.53"); String host = prefs.getString("host", "10.0.0.53");
port = prefs.getString("zmqPort", "5050"); port = prefs.getString("zmqPort", "5050");
String gRPCPort = prefs.getString("port", "50051"); String gRPCPort = prefs.getString("port", "50051");
@@ -104,10 +100,10 @@ public class SlamView extends SurfaceView implements AbstractUpdater.MapChangedL
} }
public void stop() { public void stop() {
// Use grpc to tell the loader to stop. Interrupt the loader thread as well. // TODO: Use grpc to tell zmq to stop.
slam.stop(); slam.stop();
try { try {
mapThread.join(); mapThread.join(1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
} }
} }

View File

@@ -27,5 +27,5 @@ service PersonTracking{
rpc stop_tracking(Empty) returns (Empty) {} rpc stop_tracking(Empty) returns (Empty) {}
rpc get_scan_data(Empty) returns (PointScan) {} rpc start_tracking(Int32Value) returns (Empty) {}
} }