Fix SLAM controller, use PUB instead of PAIR sockets for zmq updater.
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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{
|
||||||
|
|||||||
Reference in New Issue
Block a user