Add primary functionality to lidar view based on slam view.
Also go back to java 8.
This commit is contained in:
2
.idea/misc.xml
generated
2
.idea/misc.xml
generated
@@ -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">
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
compileOptions {
|
compileOptions {
|
||||||
sourceCompatibility = 9.8
|
sourceCompatibility = 1.8
|
||||||
targetCompatibility = 9.8
|
targetCompatibility = 1.8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user