Fix SLAM controller, use PUB instead of PAIR sockets for zmq updater.

This commit is contained in:
Piv
2020-02-15 20:28:35 +10:30
parent ab885115e3
commit f281829595
4 changed files with 53 additions and 13 deletions

View File

@@ -1,12 +1,12 @@
package com.example.carcontroller.SLAM; package com.example.carcontroller.SLAM;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceManager;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.os.Bundle; import android.os.Bundle;
import android.widget.SeekBar; import android.widget.SeekBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceManager;
import com.example.carcontroller.PiLoader; import com.example.carcontroller.PiLoader;
import com.example.carcontroller.R; import com.example.carcontroller.R;
@@ -75,21 +75,28 @@ public class SlamController extends AppCompatActivity implements SeekBar.OnSeekB
grpcController = new PiLoader(prefs.getString("host", "10.0.0.53"), Integer.parseInt(prefs.getString("port", "50051"))); grpcController = new PiLoader(prefs.getString("host", "10.0.0.53"), Integer.parseInt(prefs.getString("port", "50051")));
} }
// Should call the equivalent of the load method either here or in the loader. // Should call the equivalent of the load method either here or in the loader.
// Test without the grpc for steering.
grpcController.start(); grpcController.start();
if (slamView != null) {
slamView.resume(); slamView.resume();
} }
}
@Override @Override
protected void onPause() { protected void onPause() {
super.onPause(); super.onPause();
grpcController.stop(); grpcController.stop();
if (slamView != null) {
slamView.stop(); slamView.stop();
} }
}
@Override @Override
protected void onStop() { protected void onStop() {
super.onStop(); super.onStop();
grpcController.stop(); grpcController.stop();
if (slamView != null) {
slamView.stop(); slamView.stop();
} }
}
} }

View File

@@ -12,9 +12,16 @@ import android.view.SurfaceView;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
import com.example.carcontroller.Empty;
import com.example.carcontroller.SlamControlGrpc;
import com.example.carcontroller.SlamDetails;
import com.example.carcontroller.SlamLocation; import com.example.carcontroller.SlamLocation;
import com.google.protobuf.ByteString; import com.google.protobuf.ByteString;
import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import io.grpc.stub.StreamObserver;
public class SlamView extends SurfaceView implements SlamUpdater.MapChangedListener { public class SlamView extends SurfaceView implements SlamUpdater.MapChangedListener {
private SlamUpdater slam; private SlamUpdater slam;
@@ -23,6 +30,10 @@ public class SlamView extends SurfaceView implements SlamUpdater.MapChangedListe
private int width; private int width;
private SurfaceHolder surfaceHolder; private SurfaceHolder surfaceHolder;
private Paint paint; private Paint paint;
private SlamControlGrpc.SlamControlStub stub;
private ManagedChannel channel;
private int mapSizePixels;
private int mapSizeMeters;
public SlamView(Context context) { public SlamView(Context context) {
super(context); super(context);
@@ -46,21 +57,45 @@ public class SlamView extends SurfaceView implements SlamUpdater.MapChangedListe
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
String host = prefs.getString("host", "10.0.0.53"); String host = prefs.getString("host", "10.0.0.53");
String port = prefs.getString("zmqPort", "5050"); String port = prefs.getString("zmqPort", "5050");
String gRPCPort = prefs.getString("port", "50051");
mapSizePixels = Integer.parseInt(prefs.getString("MAPSIZEPIXELS", "540"));
mapSizeMeters = Integer.parseInt(prefs.getString("MAPSIZEMETRES", "10"));
slam = new ZmqSlamUpdater(host, port); slam = new ZmqSlamUpdater(host, port);
slam.addMapChangedListener(this); slam.addMapChangedListener(this);
surfaceHolder = getHolder(); surfaceHolder = getHolder();
paint = new Paint(); paint = new Paint();
paint.setColor(Color.BLUE); paint.setColor(Color.BLUE);
mapThread = new Thread(slam);
channel = ManagedChannelBuilder.forAddress(host, Integer.parseInt(gRPCPort)).usePlaintext().build();
stub = SlamControlGrpc.newStub(channel);
} }
/** /**
* Called by MainActivity.onResume() to start a thread. * Called by MainActivity.onResume() to start a thread.
*/ */
public void resume() { public void resume() {
mapThread = new Thread(slam); StreamObserver<Empty> response = new StreamObserver<Empty>() {
@Override
public void onNext(Empty value) {
mapThread.start(); mapThread.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.startMapStreaming(SlamDetails.newBuilder().setMapSizePixels(mapSizePixels).setMapSizeMeters(mapSizeMeters).build(), response);
}
public void stop() { public void stop() {
// Use grpc to tell the loader to stop. Interrupt the loader thread as well. // Use grpc to tell the loader to stop. Interrupt the loader thread as well.
slam.stop(); slam.stop();

View File

@@ -35,14 +35,11 @@ public class ZmqSlamUpdater extends SlamUpdater {
@Override @Override
public void run() { public void run() {
// Should send a gRPC message to start listening...
running = true; running = true;
// Receive map from zmq and update appropriately. // Receive map from zmq and update appropriately.
try (ZMQ.Socket socket = context.createSocket(SocketType.PAIR)) { try (ZMQ.Socket socket = context.createSocket(SocketType.SUB)) {
socket.connect("tcp://" + host + ":" + port); socket.connect("tcp://" + host + ":" + port);
socket.send("Hi"); socket.subscribe("slam_map");
while (running) { while (running) {
byte[] map = socket.recv(); byte[] map = socket.recv();
fireMapChanged(SlamScan.parseFrom(map)); fireMapChanged(SlamScan.parseFrom(map));

View File

@@ -9,6 +9,7 @@ import "empty.proto";
message SlamDetails { message SlamDetails {
int32 map_size_pixels = 1; int32 map_size_pixels = 1;
int32 map_size_meters = 2; int32 map_size_meters = 2;
int32 port = 3;
} }
message SlamRow{ message SlamRow{