mirror of
https://github.com/YikeStone/android_ros_sensors.git
synced 2025-08-07 05:04:08 +05:30
Compare commits
No commits in common. "kinetic" and "v1.0.1" have entirely different histories.
@ -62,7 +62,6 @@
|
|||||||
android:onClick="advancedCheckboxClicked"
|
android:onClick="advancedCheckboxClicked"
|
||||||
android:text="@string/show_advanced"/>
|
android:text="@string/show_advanced"/>
|
||||||
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
@ -120,14 +119,7 @@
|
|||||||
android:layout_gravity="bottom"
|
android:layout_gravity="bottom"
|
||||||
android:onClick="cancelButtonClicked"
|
android:onClick="cancelButtonClicked"
|
||||||
android:text="@string/cancel"/>
|
android:text="@string/cancel"/>
|
||||||
<Button
|
|
||||||
android:id="@+id/reset_node_prefix"
|
|
||||||
style="@style/padded"
|
|
||||||
android:layout_width="fill_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:onClick="resetNodePrefixButtonClicked"
|
|
||||||
android:text="@string/reset_node_prefix"/>
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/connection_layout"
|
android:id="@+id/connection_layout"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
<string name="app_name">ROS for Android</string>
|
<string name="app_name">ROS for Android</string>
|
||||||
<string name="use_master">Connect</string>
|
<string name="use_master">Connect</string>
|
||||||
<string name="cancel">Cancel</string>
|
<string name="cancel">Cancel</string>
|
||||||
<string name="reset_node_prefix">Reset Prefix</string>
|
|
||||||
<string name="qr_code">Read QRCode</string>
|
<string name="qr_code">Read QRCode</string>
|
||||||
<string name="master_uri_hint">http://localhost:11311/</string>
|
<string name="master_uri_hint">http://localhost:11311/</string>
|
||||||
<string name="new_master">New Public Master</string>
|
<string name="new_master">New Public Master</string>
|
||||||
|
@ -30,7 +30,6 @@ import android.os.Bundle;
|
|||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.AutoCompleteTextView;
|
import android.widget.AutoCompleteTextView;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
@ -56,7 +55,6 @@ import java.util.Collections;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Random;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@ -118,8 +116,6 @@ public class MasterChooser extends AppCompatActivity {
|
|||||||
*/
|
*/
|
||||||
private static final int RECENT_MASTER_HISTORY_COUNT = 5;
|
private static final int RECENT_MASTER_HISTORY_COUNT = 5;
|
||||||
|
|
||||||
private static boolean resetNodePrefix = false;
|
|
||||||
|
|
||||||
private String selectedInterface;
|
private String selectedInterface;
|
||||||
private AutoCompleteTextView uriText;
|
private AutoCompleteTextView uriText;
|
||||||
private Button connectButton;
|
private Button connectButton;
|
||||||
@ -347,14 +343,6 @@ public class MasterChooser extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void resetNodePrefixButtonClicked(View unused) {
|
|
||||||
resetNodePrefix = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static boolean getResetNodePrefixButtonClicked(){
|
|
||||||
return resetNodePrefix;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void advancedCheckboxClicked(View view) {
|
public void advancedCheckboxClicked(View view) {
|
||||||
boolean checked = ((CheckBox) view).isChecked();
|
boolean checked = ((CheckBox) view).isChecked();
|
||||||
LinearLayout advancedOptions = (LinearLayout) findViewById(R.id.advancedOptions);
|
LinearLayout advancedOptions = (LinearLayout) findViewById(R.id.advancedOptions);
|
||||||
|
@ -18,11 +18,16 @@ package org.ros.android.view.camera;
|
|||||||
|
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
import android.graphics.ImageFormat;
|
import android.graphics.ImageFormat;
|
||||||
import android.graphics.SurfaceTexture;
|
|
||||||
import android.hardware.Camera;
|
import android.hardware.Camera;
|
||||||
import android.hardware.Camera.PreviewCallback;
|
import android.hardware.Camera.PreviewCallback;
|
||||||
import android.hardware.Camera.Size;
|
import android.hardware.Camera.Size;
|
||||||
|
import android.util.AttributeSet;
|
||||||
|
import android.view.SurfaceHolder;
|
||||||
|
import android.view.SurfaceView;
|
||||||
|
import android.view.View;
|
||||||
|
import android.view.ViewGroup;
|
||||||
import org.ros.exception.RosRuntimeException;
|
import org.ros.exception.RosRuntimeException;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -33,22 +38,17 @@ import java.util.List;
|
|||||||
*
|
*
|
||||||
* @author damonkohler@google.com (Damon Kohler)
|
* @author damonkohler@google.com (Damon Kohler)
|
||||||
*/
|
*/
|
||||||
public class CameraPreviewView {
|
public class CameraPreviewView extends ViewGroup {
|
||||||
|
|
||||||
private final static double ASPECT_TOLERANCE = 0.1;
|
private final static double ASPECT_TOLERANCE = 0.1;
|
||||||
|
|
||||||
private SurfaceTexture surfaceTexture;
|
private SurfaceHolder surfaceHolder;
|
||||||
private Camera camera;
|
private Camera camera;
|
||||||
private Size previewSize;
|
private Size previewSize;
|
||||||
private byte[] previewBuffer;
|
private byte[] previewBuffer;
|
||||||
private RawImageListener rawImageListener;
|
private RawImageListener rawImageListener;
|
||||||
private BufferingPreviewCallback bufferingPreviewCallback;
|
private BufferingPreviewCallback bufferingPreviewCallback;
|
||||||
|
|
||||||
public CameraPreviewView() {
|
|
||||||
surfaceTexture = new SurfaceTexture(10);
|
|
||||||
bufferingPreviewCallback = new BufferingPreviewCallback();
|
|
||||||
}
|
|
||||||
|
|
||||||
private final class BufferingPreviewCallback implements PreviewCallback {
|
private final class BufferingPreviewCallback implements PreviewCallback {
|
||||||
@Override
|
@Override
|
||||||
public void onPreviewFrame(byte[] data, Camera camera) {
|
public void onPreviewFrame(byte[] data, Camera camera) {
|
||||||
@ -61,6 +61,52 @@ public class CameraPreviewView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private final class SurfaceHolderCallback implements SurfaceHolder.Callback {
|
||||||
|
@Override
|
||||||
|
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void surfaceCreated(SurfaceHolder holder) {
|
||||||
|
try {
|
||||||
|
if (camera != null) {
|
||||||
|
camera.setPreviewDisplay(holder);
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RosRuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void surfaceDestroyed(SurfaceHolder holder) {
|
||||||
|
releaseCamera();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void init(Context context) {
|
||||||
|
SurfaceView surfaceView = new SurfaceView(context);
|
||||||
|
addView(surfaceView);
|
||||||
|
surfaceHolder = surfaceView.getHolder();
|
||||||
|
surfaceHolder.addCallback(new SurfaceHolderCallback());
|
||||||
|
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
|
||||||
|
bufferingPreviewCallback = new BufferingPreviewCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
public CameraPreviewView(Context context) {
|
||||||
|
super(context);
|
||||||
|
init(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CameraPreviewView(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
init(context);
|
||||||
|
}
|
||||||
|
|
||||||
|
public CameraPreviewView(Context context, AttributeSet attrs, int defStyle) {
|
||||||
|
super(context, attrs, defStyle);
|
||||||
|
init(context);
|
||||||
|
}
|
||||||
|
|
||||||
public void releaseCamera() {
|
public void releaseCamera() {
|
||||||
if (camera == null) {
|
if (camera == null) {
|
||||||
return;
|
return;
|
||||||
@ -87,7 +133,7 @@ public class CameraPreviewView {
|
|||||||
camera.startPreview();
|
camera.startPreview();
|
||||||
try {
|
try {
|
||||||
// This may have no effect if the SurfaceHolder is not yet created.
|
// This may have no effect if the SurfaceHolder is not yet created.
|
||||||
camera.setPreviewTexture(surfaceTexture);
|
camera.setPreviewDisplay(surfaceHolder);
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
throw new RosRuntimeException(e);
|
throw new RosRuntimeException(e);
|
||||||
}
|
}
|
||||||
@ -96,7 +142,7 @@ public class CameraPreviewView {
|
|||||||
private void setupCameraParameters() {
|
private void setupCameraParameters() {
|
||||||
Camera.Parameters parameters = camera.getParameters();
|
Camera.Parameters parameters = camera.getParameters();
|
||||||
List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
|
List<Size> supportedPreviewSizes = parameters.getSupportedPreviewSizes();
|
||||||
previewSize = getOptimalPreviewSize(supportedPreviewSizes, 640, 480);
|
previewSize = getOptimalPreviewSize(supportedPreviewSizes, getWidth(), getHeight());
|
||||||
parameters.setPreviewSize(previewSize.width, previewSize.height);
|
parameters.setPreviewSize(previewSize.width, previewSize.height);
|
||||||
parameters.setPreviewFormat(ImageFormat.NV21);
|
parameters.setPreviewFormat(ImageFormat.NV21);
|
||||||
camera.setParameters(parameters);
|
camera.setParameters(parameters);
|
||||||
@ -142,4 +188,29 @@ public class CameraPreviewView {
|
|||||||
camera.addCallbackBuffer(previewBuffer);
|
camera.addCallbackBuffer(previewBuffer);
|
||||||
camera.setPreviewCallbackWithBuffer(bufferingPreviewCallback);
|
camera.setPreviewCallbackWithBuffer(bufferingPreviewCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
||||||
|
if (changed && getChildCount() > 0) {
|
||||||
|
final View child = getChildAt(0);
|
||||||
|
final int width = r - l;
|
||||||
|
final int height = b - t;
|
||||||
|
|
||||||
|
int previewWidth = width;
|
||||||
|
int previewHeight = height;
|
||||||
|
if (previewSize != null) {
|
||||||
|
previewWidth = previewSize.width;
|
||||||
|
previewHeight = previewSize.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Center the child SurfaceView within the parent.
|
||||||
|
if (width * previewHeight > height * previewWidth) {
|
||||||
|
final int scaledChildWidth = previewWidth * height / previewHeight;
|
||||||
|
child.layout((width - scaledChildWidth) / 2, 0, (width + scaledChildWidth) / 2, height);
|
||||||
|
} else {
|
||||||
|
final int scaledChildHeight = previewHeight * width / previewWidth;
|
||||||
|
child.layout(0, (height - scaledChildHeight) / 2, width, (height + scaledChildHeight) / 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,16 +62,13 @@ class CompressedImagePublisher implements RawImageListener {
|
|||||||
private Rect rect;
|
private Rect rect;
|
||||||
private ChannelBufferOutputStream stream;
|
private ChannelBufferOutputStream stream;
|
||||||
|
|
||||||
private static String sID;
|
public CompressedImagePublisher(ConnectedNode connectedNode) {
|
||||||
|
|
||||||
public CompressedImagePublisher(ConnectedNode connectedNode, String nodeID) {
|
|
||||||
sID = nodeID;
|
|
||||||
this.connectedNode = connectedNode;
|
this.connectedNode = connectedNode;
|
||||||
this.loadStatus = false;
|
this.loadStatus = false;
|
||||||
this.yamlFile = "camera.yaml";
|
this.yamlFile = "camera.yaml";
|
||||||
this.lastTime = connectedNode.getCurrentTime();
|
this.lastTime = connectedNode.getCurrentTime();
|
||||||
|
|
||||||
NameResolver resolver = connectedNode.getResolver().newChild("android_" + sID + "_camera");
|
NameResolver resolver = connectedNode.getResolver().newChild("camera");
|
||||||
imagePublisher =
|
imagePublisher =
|
||||||
connectedNode.newPublisher(resolver.resolve("image/compressed"), sensor_msgs.CompressedImage._TYPE);
|
connectedNode.newPublisher(resolver.resolve("image/compressed"), sensor_msgs.CompressedImage._TYPE);
|
||||||
cameraInfoPublisher =
|
cameraInfoPublisher =
|
||||||
|
@ -30,20 +30,26 @@ import org.ros.node.NodeMain;
|
|||||||
*/
|
*/
|
||||||
public class RosCameraPreviewView extends CameraPreviewView implements NodeMain {
|
public class RosCameraPreviewView extends CameraPreviewView implements NodeMain {
|
||||||
|
|
||||||
private static String sID;
|
public RosCameraPreviewView(Context context) {
|
||||||
|
super(context);
|
||||||
|
}
|
||||||
|
|
||||||
public RosCameraPreviewView(String nodeID){
|
public RosCameraPreviewView(Context context, AttributeSet attrs) {
|
||||||
sID = nodeID;
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public RosCameraPreviewView(Context context, AttributeSet attrs, int defStyle) {
|
||||||
|
super(context, attrs, defStyle);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public GraphName getDefaultNodeName() {
|
public GraphName getDefaultNodeName() {
|
||||||
return GraphName.of("android_"+sID+"_camera");
|
return GraphName.of("ros_camera_preview_view");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onStart(ConnectedNode connectedNode) {
|
public void onStart(ConnectedNode connectedNode) {
|
||||||
setRawImageListener(new CompressedImagePublisher(connectedNode, sID));
|
setRawImageListener(new CompressedImagePublisher(connectedNode));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -50,7 +50,7 @@ public class MainActivity extends RosActivity {
|
|||||||
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||||
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
setContentView(R.layout.main);
|
setContentView(R.layout.main);
|
||||||
//rosCameraPreviewView = (RosCameraPreviewView) findViewById(R.id.ros_camera_preview_view);
|
rosCameraPreviewView = (RosCameraPreviewView) findViewById(R.id.ros_camera_preview_view);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
<resources>
|
<resources>
|
||||||
<string name="app_name">CameraImu</string>
|
<string name="app_name">CameraImu</string>
|
||||||
<string name="sID_key">sID</string>
|
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -54,7 +54,6 @@ import org.ros.node.topic.Publisher;
|
|||||||
* @author axelfurlan@gmail.com (Axel Furlan)
|
* @author axelfurlan@gmail.com (Axel Furlan)
|
||||||
*/
|
*/
|
||||||
public class ImuPublisher implements NodeMain {
|
public class ImuPublisher implements NodeMain {
|
||||||
private static String sID;
|
|
||||||
private ImuThread imuThread;
|
private ImuThread imuThread;
|
||||||
private SensorListener sensorListener;
|
private SensorListener sensorListener;
|
||||||
private SensorManager sensorManager;
|
private SensorManager sensorManager;
|
||||||
@ -161,7 +160,7 @@ public class ImuPublisher implements NodeMain {
|
|||||||
//long time_delta_millis = System.currentTimeMillis() - SystemClock.uptimeMillis();
|
//long time_delta_millis = System.currentTimeMillis() - SystemClock.uptimeMillis();
|
||||||
//this.imu.getHeader().setStamp(Time.fromMillis(time_delta_millis + event.timestamp/1000000));
|
//this.imu.getHeader().setStamp(Time.fromMillis(time_delta_millis + event.timestamp/1000000));
|
||||||
this.imu.getHeader().setStamp(connectedNode.getCurrentTime());
|
this.imu.getHeader().setStamp(connectedNode.getCurrentTime());
|
||||||
this.imu.getHeader().setFrameId("/android_" + sID + "imu");// TODO Make parameter
|
this.imu.getHeader().setFrameId("/imu");// TODO Make parameter
|
||||||
|
|
||||||
publisher.publish(this.imu);
|
publisher.publish(this.imu);
|
||||||
|
|
||||||
@ -177,13 +176,12 @@ public class ImuPublisher implements NodeMain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public ImuPublisher(SensorManager manager, String nodeID) {
|
public ImuPublisher(SensorManager manager) {
|
||||||
this.sensorManager = manager;
|
this.sensorManager = manager;
|
||||||
sID = nodeID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public GraphName getDefaultNodeName() {
|
public GraphName getDefaultNodeName() {
|
||||||
return GraphName.of("android_" + sID + "/imuPublisher");
|
return GraphName.of("android_sensors_driver/imuPublisher");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onError(Node node, Throwable throwable) {
|
public void onError(Node node, Throwable throwable) {
|
||||||
@ -192,7 +190,7 @@ public class ImuPublisher implements NodeMain {
|
|||||||
public void onStart(ConnectedNode node) {
|
public void onStart(ConnectedNode node) {
|
||||||
try {
|
try {
|
||||||
this.connectedNode = node;
|
this.connectedNode = node;
|
||||||
this.publisher = node.newPublisher("android_" + sID + "/imu", "sensor_msgs/Imu");
|
this.publisher = node.newPublisher("android/imu", "sensor_msgs/Imu");
|
||||||
// Determine if we have the various needed sensors
|
// Determine if we have the various needed sensors
|
||||||
boolean hasAccel = false;
|
boolean hasAccel = false;
|
||||||
boolean hasGyro = false;
|
boolean hasGyro = false;
|
||||||
|
@ -17,7 +17,6 @@ package org.ros.android.android_tutorial_camera_imu;
|
|||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.annotation.TargetApi;
|
import android.annotation.TargetApi;
|
||||||
import android.app.Activity;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.hardware.Camera;
|
import android.hardware.Camera;
|
||||||
@ -27,23 +26,14 @@ import android.os.Build;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.support.v4.app.ActivityCompat;
|
import android.support.v4.app.ActivityCompat;
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.CompoundButton;
|
|
||||||
import android.widget.RadioButton;
|
|
||||||
import android.widget.Switch;
|
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import android.util.Log;
|
|
||||||
import org.ros.address.InetAddressFactory;
|
import org.ros.address.InetAddressFactory;
|
||||||
import org.ros.android.MasterChooser;
|
|
||||||
import org.ros.android.RosActivity;
|
import org.ros.android.RosActivity;
|
||||||
import org.ros.android.view.camera.RosCameraPreviewView;
|
import org.ros.android.view.camera.RosCameraPreviewView;
|
||||||
import org.ros.node.NodeConfiguration;
|
import org.ros.node.NodeConfiguration;
|
||||||
import org.ros.node.NodeMainExecutor;
|
import org.ros.node.NodeMainExecutor;
|
||||||
import android.content.SharedPreferences;
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ethan.rublee@gmail.com (Ethan Rublee)
|
* @author ethan.rublee@gmail.com (Ethan Rublee)
|
||||||
@ -58,18 +48,9 @@ public class MainActivity extends RosActivity {
|
|||||||
private NavSatFixPublisher fix_pub;
|
private NavSatFixPublisher fix_pub;
|
||||||
private ImuPublisher imu_pub;
|
private ImuPublisher imu_pub;
|
||||||
|
|
||||||
private Switch cameraSwitch;
|
|
||||||
private Switch imuSwitch;
|
|
||||||
private Switch gpsSwitch;
|
|
||||||
|
|
||||||
private boolean cameraRunning;
|
|
||||||
|
|
||||||
private NodeMainExecutor nodeMainExecutor;
|
private NodeMainExecutor nodeMainExecutor;
|
||||||
private LocationManager mLocationManager;
|
private LocationManager mLocationManager;
|
||||||
private SensorManager mSensorManager;
|
private SensorManager mSensorManager;
|
||||||
private static String sID = "";
|
|
||||||
|
|
||||||
private NodeConfiguration nodeConfigurationGPS, nodeConfigurationCamera, nodeConfigurationImu;
|
|
||||||
|
|
||||||
public MainActivity() {
|
public MainActivity() {
|
||||||
super("ROS", "Camera & Imu");
|
super("ROS", "Camera & Imu");
|
||||||
@ -79,76 +60,28 @@ public class MainActivity extends RosActivity {
|
|||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
requestWindowFeature(Window.FEATURE_NO_TITLE);
|
||||||
|
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
||||||
setContentView(R.layout.activity_main);
|
setContentView(R.layout.activity_main);
|
||||||
cameraRunning = false;
|
|
||||||
cameraSwitch = (Switch) findViewById(R.id.camera_switch);
|
|
||||||
imuSwitch = (Switch) findViewById(R.id.imu_switch);
|
|
||||||
gpsSwitch = (Switch) findViewById(R.id.gps_switch);
|
|
||||||
|
|
||||||
imuSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
rosCameraPreviewView = findViewById(R.id.ros_camera_preview_view);
|
||||||
@Override
|
mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
|
||||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
mSensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);
|
||||||
|
|
||||||
if(isChecked)
|
|
||||||
nodeMainExecutor.execute(imu_pub, nodeConfigurationImu);
|
|
||||||
|
|
||||||
else
|
|
||||||
nodeMainExecutor.shutdownNodeMain(imu_pub);
|
|
||||||
|
|
||||||
Log.v("IMU publisher", ""+isChecked);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
gpsSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
|
||||||
|
|
||||||
if(isChecked)
|
|
||||||
nodeMainExecutor.execute(fix_pub, nodeConfigurationGPS);
|
|
||||||
|
|
||||||
else
|
|
||||||
nodeMainExecutor.shutdownNodeMain(fix_pub);
|
|
||||||
|
|
||||||
Log.v("IMU publisher", ""+isChecked);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
cameraSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
|
|
||||||
@Override
|
|
||||||
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
|
|
||||||
|
|
||||||
if(isChecked) {
|
|
||||||
rosCameraPreviewView.setCamera(getCamera());
|
|
||||||
nodeMainExecutor.execute(rosCameraPreviewView, nodeConfigurationCamera);
|
|
||||||
cameraRunning = true;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nodeMainExecutor.shutdownNodeMain(rosCameraPreviewView);
|
|
||||||
cameraRunning = false;
|
|
||||||
}
|
|
||||||
Log.v("IMU publisher", ""+isChecked);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSwitchCameraButtonClicked(View view) {
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent event) {
|
||||||
final Toast toast;
|
//if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
|
||||||
if(!cameraRunning)
|
if (event.getAction() == MotionEvent.ACTION_UP) {
|
||||||
{
|
int numberOfCameras = Camera.getNumberOfCameras();
|
||||||
toast = Toast.makeText(this, "Camera Publisher not running", Toast.LENGTH_SHORT);
|
final Toast toast;
|
||||||
}
|
if (numberOfCameras > 1) {
|
||||||
else {
|
cameraId = (cameraId + 1) % numberOfCameras;
|
||||||
int numberOfCameras = Camera.getNumberOfCameras();
|
rosCameraPreviewView.releaseCamera();
|
||||||
|
rosCameraPreviewView.setCamera(getCamera());
|
||||||
if (numberOfCameras > 1) {
|
toast = Toast.makeText(this, "Switching cameras.", Toast.LENGTH_SHORT);
|
||||||
cameraId = (cameraId + 1) % numberOfCameras;
|
} else {
|
||||||
rosCameraPreviewView.releaseCamera();
|
toast = Toast.makeText(this, "No alternative cameras to switch to.", Toast.LENGTH_SHORT);
|
||||||
rosCameraPreviewView.setCamera(getCamera());
|
|
||||||
toast = Toast.makeText(this, "Switching cameras.", Toast.LENGTH_SHORT);
|
|
||||||
} else {
|
|
||||||
toast = Toast.makeText(this, "No alternative cameras to switch to.", Toast.LENGTH_SHORT);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
runOnUiThread(new Runnable() {
|
runOnUiThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
@ -156,15 +89,13 @@ public class MainActivity extends RosActivity {
|
|||||||
toast.show();
|
toast.show();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
//}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) //API = 15
|
@Override @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) //API = 15
|
||||||
protected void init(NodeMainExecutor nodeMainExecutor) {
|
protected void init(NodeMainExecutor nodeMainExecutor) {
|
||||||
sID = MasterChooser.sID;
|
|
||||||
rosCameraPreviewView = new RosCameraPreviewView(sID);
|
|
||||||
mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
|
|
||||||
mSensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE);
|
|
||||||
|
|
||||||
this.nodeMainExecutor = nodeMainExecutor;
|
this.nodeMainExecutor = nodeMainExecutor;
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
@ -175,32 +106,40 @@ public class MainActivity extends RosActivity {
|
|||||||
PERMISSIONS[3] = Manifest.permission.WRITE_EXTERNAL_STORAGE;
|
PERMISSIONS[3] = Manifest.permission.WRITE_EXTERNAL_STORAGE;
|
||||||
ActivityCompat.requestPermissions(this, PERMISSIONS, 0);
|
ActivityCompat.requestPermissions(this, PERMISSIONS, 0);
|
||||||
}else {
|
}else {
|
||||||
initGPS();
|
NodeConfiguration nodeConfiguration1 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress());
|
||||||
initCamera();
|
nodeConfiguration1.setMasterUri(getMasterUri());
|
||||||
|
nodeConfiguration1.setNodeName("android_sensors_driver_nav_sat_fix");
|
||||||
|
this.fix_pub = new NavSatFixPublisher(mLocationManager);
|
||||||
|
nodeMainExecutor.execute(this.fix_pub, nodeConfiguration1);
|
||||||
|
|
||||||
|
rosCameraPreviewView.setCamera(getCamera());
|
||||||
|
NodeConfiguration nodeConfiguration2 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress());
|
||||||
|
nodeConfiguration2.setMasterUri(getMasterUri());
|
||||||
|
nodeConfiguration2.setNodeName("android_sensors_driver_camera");
|
||||||
|
nodeMainExecutor.execute(this.rosCameraPreviewView, nodeConfiguration2);
|
||||||
}
|
}
|
||||||
initImu();
|
|
||||||
|
|
||||||
|
NodeConfiguration nodeConfiguration3 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress());
|
||||||
|
nodeConfiguration3.setMasterUri(getMasterUri());
|
||||||
|
nodeConfiguration3.setNodeName("android_sensors_driver_imu");
|
||||||
|
this.imu_pub = new ImuPublisher(mSensorManager);
|
||||||
|
nodeMainExecutor.execute(this.imu_pub, nodeConfiguration3);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initGPS() {
|
private void executeGPS() {
|
||||||
this.fix_pub = new NavSatFixPublisher(mLocationManager, sID);
|
NodeConfiguration nodeConfiguration1 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress());
|
||||||
nodeConfigurationGPS = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress());
|
nodeConfiguration1.setMasterUri(getMasterUri());
|
||||||
nodeConfigurationGPS.setMasterUri(getMasterUri());
|
nodeConfiguration1.setNodeName("android_sensors_driver_nav_sat_fix");
|
||||||
nodeConfigurationGPS.setNodeName(fix_pub.getDefaultNodeName());
|
this.fix_pub = new NavSatFixPublisher(mLocationManager);
|
||||||
|
nodeMainExecutor.execute(this.fix_pub, nodeConfiguration1);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initCamera() {
|
private void executeCamera() {
|
||||||
rosCameraPreviewView.setCamera(getCamera());
|
rosCameraPreviewView.setCamera(getCamera());
|
||||||
nodeConfigurationCamera = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress());
|
NodeConfiguration nodeConfiguration2 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress());
|
||||||
nodeConfigurationCamera.setMasterUri(getMasterUri());
|
nodeConfiguration2.setMasterUri(getMasterUri());
|
||||||
nodeConfigurationCamera.setNodeName(rosCameraPreviewView.getDefaultNodeName());
|
nodeConfiguration2.setNodeName("android_sensors_driver_camera");
|
||||||
}
|
nodeMainExecutor.execute(this.rosCameraPreviewView, nodeConfiguration2);
|
||||||
|
|
||||||
private void initImu() {
|
|
||||||
nodeConfigurationImu = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress());
|
|
||||||
nodeConfigurationImu.setMasterUri(getMasterUri());
|
|
||||||
this.imu_pub = new ImuPublisher(mSensorManager, sID);
|
|
||||||
nodeConfigurationImu.setNodeName(imu_pub.getDefaultNodeName());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Camera getCamera() {
|
private Camera getCamera() {
|
||||||
@ -208,10 +147,10 @@ public class MainActivity extends RosActivity {
|
|||||||
Camera.Parameters camParams = cam.getParameters();
|
Camera.Parameters camParams = cam.getParameters();
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
|
||||||
if (camParams.getSupportedFocusModes().contains(
|
if (camParams.getSupportedFocusModes().contains(
|
||||||
Camera.Parameters.FOCUS_MODE_INFINITY)) {
|
Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) {
|
||||||
camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
|
camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
|
||||||
} else {
|
} else {
|
||||||
camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_INFINITY);
|
camParams.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//cam.setParameters(camParams);
|
//cam.setParameters(camParams);
|
||||||
@ -224,41 +163,17 @@ public class MainActivity extends RosActivity {
|
|||||||
if (requestCode == 0) {
|
if (requestCode == 0) {
|
||||||
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
||||||
// permission was granted, yay! Do the
|
// permission was granted, yay! Do the
|
||||||
initGPS();
|
executeGPS();
|
||||||
}
|
}
|
||||||
if (grantResults.length > 1 && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
|
if (grantResults.length > 1 && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
|
||||||
// permission was granted, yay! Do the
|
// permission was granted, yay! Do the
|
||||||
initCamera();
|
executeCamera();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (grantResults.length > 2 && grantResults[2] == PackageManager.PERMISSION_GRANTED &&
|
||||||
|
grantResults[3] == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
// permission was granted, yay! Do the
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onRadioButtonClicked(View view) {
|
|
||||||
|
|
||||||
boolean checked = ((RadioButton) view).isChecked();
|
|
||||||
|
|
||||||
switch(view.getId()) {
|
|
||||||
|
|
||||||
case R.id.res480:
|
|
||||||
if (checked)
|
|
||||||
rosCameraPreviewView.setPreviewSize(640, 480);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.res720:
|
|
||||||
if (checked)
|
|
||||||
rosCameraPreviewView.setPreviewSize(1280, 720);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case R.id.res1080:
|
|
||||||
if (checked)
|
|
||||||
rosCameraPreviewView.setPreviewSize(1920, 1080);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cameraRunning){
|
|
||||||
rosCameraPreviewView.releaseCamera();
|
|
||||||
rosCameraPreviewView.setCamera(getCamera());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -55,7 +55,6 @@ import org.ros.node.topic.Publisher;
|
|||||||
public class NavSatFixPublisher implements NodeMain {
|
public class NavSatFixPublisher implements NodeMain {
|
||||||
|
|
||||||
private NavSatThread navSatThread;
|
private NavSatThread navSatThread;
|
||||||
private static String sID;
|
|
||||||
private LocationManager locationManager;
|
private LocationManager locationManager;
|
||||||
private NavSatListener navSatFixListener;
|
private NavSatListener navSatFixListener;
|
||||||
private Publisher<NavSatFix> publisher;
|
private Publisher<NavSatFix> publisher;
|
||||||
@ -103,7 +102,7 @@ public class NavSatFixPublisher implements NodeMain {
|
|||||||
NavSatFix fix = this.publisher.newMessage();
|
NavSatFix fix = this.publisher.newMessage();
|
||||||
//fix.getHeader().setStamp(Time.fromMillis(System.currentTimeMillis()));
|
//fix.getHeader().setStamp(Time.fromMillis(System.currentTimeMillis()));
|
||||||
fix.getHeader().setStamp(connectedNode.getCurrentTime());
|
fix.getHeader().setStamp(connectedNode.getCurrentTime());
|
||||||
fix.getHeader().setFrameId("/android_"+sID+"_gps");
|
fix.getHeader().setFrameId("/gps");
|
||||||
|
|
||||||
fix.getStatus().setStatus(currentStatus);
|
fix.getStatus().setStatus(currentStatus);
|
||||||
fix.getStatus().setService(NavSatStatus.SERVICE_GPS);
|
fix.getStatus().setService(NavSatStatus.SERVICE_GPS);
|
||||||
@ -143,16 +142,15 @@ public class NavSatFixPublisher implements NodeMain {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public NavSatFixPublisher(LocationManager manager, String nodeID) {
|
public NavSatFixPublisher(LocationManager manager) {
|
||||||
this.locationManager = manager;
|
this.locationManager = manager;
|
||||||
sID = nodeID;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//@Override
|
//@Override
|
||||||
public void onStart(ConnectedNode node) {
|
public void onStart(ConnectedNode node) {
|
||||||
try {
|
try {
|
||||||
this.connectedNode = node;
|
this.connectedNode = node;
|
||||||
this.publisher = node.newPublisher("android_" + sID + "/fix", "sensor_msgs/NavSatFix");
|
this.publisher = node.newPublisher("android/fix", "sensor_msgs/NavSatFix");
|
||||||
this.navSatFixListener = new NavSatListener(publisher);
|
this.navSatFixListener = new NavSatListener(publisher);
|
||||||
this.navSatThread = new NavSatThread(this.locationManager, this.navSatFixListener);
|
this.navSatThread = new NavSatThread(this.locationManager, this.navSatFixListener);
|
||||||
this.navSatThread.start();
|
this.navSatThread.start();
|
||||||
@ -180,7 +178,7 @@ public class NavSatFixPublisher implements NodeMain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public GraphName getDefaultNodeName() {
|
public GraphName getDefaultNodeName() {
|
||||||
return GraphName.of("android_" + sID + "/imuPublisher");
|
return GraphName.of("android_sensors_driver/imuPublisher");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onError(Node node, Throwable throwable) {
|
public void onError(Node node, Throwable throwable) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user