ImuNode.java
Go to the documentation of this file.
1 /*
2  * Copyright 2017 Intermodalics All Rights Reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package eu.intermodalics.tango_ros_streamer.nodes;
18 
19 import android.app.Activity;
20 import android.content.Context;
21 import android.hardware.Sensor;
22 import android.hardware.SensorEvent;
23 import android.hardware.SensorEventListener;
24 import android.hardware.SensorManager;
25 
26 import org.ros.namespace.GraphName;
27 import org.ros.node.AbstractNodeMain;
28 import org.ros.node.ConnectedNode;
29 import org.ros.node.NodeMain;
30 import org.ros.node.topic.Publisher;
31 
32 import eu.intermodalics.tango_ros_common.ConnectedNodeLogger;
33 import sensor_msgs.Imu;
34 
38 public class ImuNode extends AbstractNodeMain implements NodeMain, SensorEventListener {
39  private static final String TAG = ImuNode.class.getSimpleName();
40  private static final String NODE_NAME = "android";
41 
42  private ConnectedNode mConnectedNode;
43  private Publisher<Imu> mImuPublisher;
44  private Imu mImuMessage;
45  private ConnectedNodeLogger mLog;
46 
47  private SensorManager mSensorManager;
48  private Sensor mRotationSensor;
49  private Sensor mGyroscopeSensor;
50  private Sensor mAccelerometerSensor;
51  private boolean mNewRotationData = false;
52  private boolean mNewGyroscopeData = false;
53  private boolean mNewAccelerometerData = false;
54 
55  public ImuNode(Activity activity) {
56  mSensorManager = (SensorManager) activity.getSystemService(Context.SENSOR_SERVICE);
57  mRotationSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ROTATION_VECTOR);
58  mGyroscopeSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);
59  mAccelerometerSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
60  }
61 
62  public GraphName getDefaultNodeName() { return GraphName.of(NODE_NAME); }
63 
64  public void onStart(ConnectedNode connectedNode) {
65  mConnectedNode = connectedNode;
66  mLog = new ConnectedNodeLogger(connectedNode);
67  mImuPublisher = connectedNode.newPublisher("android/imu", Imu._TYPE);
68  mImuMessage = mConnectedNode.getTopicMessageFactory().newFromType(Imu._TYPE);
69 
70  mSensorManager.registerListener(this, mRotationSensor, SensorManager.SENSOR_DELAY_FASTEST);
71  mSensorManager.registerListener(this, mGyroscopeSensor, SensorManager.SENSOR_DELAY_FASTEST);
72  mSensorManager.registerListener(this, mAccelerometerSensor, SensorManager.SENSOR_DELAY_FASTEST);
73  }
74 
75  @Override
76  public void onAccuracyChanged(Sensor sensor, int accuracy) {
77  // Not used.
78  }
79 
80  @Override
81  public void onSensorChanged(SensorEvent event) {
82  switch (event.sensor.getType()) {
83  case Sensor.TYPE_ROTATION_VECTOR:
84  mNewRotationData = true;
85  float[] quaternion = new float[4];
86  SensorManager.getQuaternionFromVector(quaternion, event.values);
87  mImuMessage.getOrientation().setW(quaternion[0]);
88  mImuMessage.getOrientation().setX(quaternion[1]);
89  mImuMessage.getOrientation().setY(quaternion[2]);
90  mImuMessage.getOrientation().setZ(quaternion[3]);
91  mImuMessage.setOrientationCovariance(new double[]{0, 0, 0, 0, 0, 0, 0, 0, 0});
92  break;
93  case Sensor.TYPE_GYROSCOPE:
94  mNewGyroscopeData = true;
95  mImuMessage.getAngularVelocity().setX(event.values[0]);
96  mImuMessage.getAngularVelocity().setY(event.values[1]);
97  mImuMessage.getAngularVelocity().setZ(event.values[2]);
98  mImuMessage.setAngularVelocityCovariance(new double[]{0, 0, 0, 0, 0, 0, 0, 0, 0});
99  break;
100  case Sensor.TYPE_ACCELEROMETER:
101  mNewAccelerometerData = true;
102  mImuMessage.getLinearAcceleration().setX(event.values[0]);
103  mImuMessage.getLinearAcceleration().setY(event.values[1]);
104  mImuMessage.getLinearAcceleration().setZ(event.values[2]);
105  mImuMessage.setLinearAccelerationCovariance(new double[]{0, 0, 0, 0, 0, 0, 0, 0, 0});
106  break;
107  default:
108  break;
109  }
110  if (mNewRotationData && mNewGyroscopeData && mNewAccelerometerData) {
111  try {
112  mImuMessage.getHeader().setStamp(mConnectedNode.getCurrentTime());
113  mImuMessage.getHeader().setFrameId("imu");
114  mImuPublisher.publish(mImuMessage);
115  } catch (NullPointerException e) {
116  mLog.error(TAG, "Could not get current time. If you are using simulated time, " +
117  "/clock might not be published yet.");
118  e.printStackTrace();
119  }
120  mNewRotationData = false;
121  mNewGyroscopeData = false;
122  mNewAccelerometerData = false;
123  }
124  }
125 }
void onAccuracyChanged(Sensor sensor, int accuracy)
Definition: ImuNode.java:76
void onStart(ConnectedNode connectedNode)
Definition: ImuNode.java:64


TangoRosStreamer
Author(s):
autogenerated on Mon Jun 10 2019 15:37:54