版权声明:本文为博主原创文章,未经博主允许不得转载。
标签(空格分隔): rosjava android手机 IMU
前提是成功安装好ROS和android studio,并且能够成功运行android_core中实例。
本文采用的是在别人建好的app中新建一个ros android app,简单快速度的一种方法。
1、下载相关的app
注意要和你安装的ROS版本对应,我采用的是indigo版本。
https://github.com/rosjava/android_apps/tree/indigo
2、导入android_apps
在android studio 中导入下载好的android_apps,在弹出的是否更新build.gradle窗口选择【cancle】,选择其中一个moudle进行编译运行,成功后就可以新建自己需要的app
3、新建app
在android_core中新建moudle,最小api设置为10,选择empty Activity 的moudle。
(1) 将MainActivity继承RosActivity,点击RosActivity后使用【alt+enter】添加RosActivity的依赖库,接着导入包import org.ros.android.RosActivity;
(2) 重写init方法和一个结构体。先编写 rosjava发布者ImuPublisher,新建一个ImuPublisher.class类,具体代码如下:
public class ImuPublisher implements NodeMain {
private ImuThread imuThread;
private SensorListener sensorListener;
private SensorManager sensorManager;
private Publisher<Imu> publisher;
public ImuPublisher(SensorManager msensorManager) {
this.sensorManager = msensorManager;
}
@Override
public GraphName getDefaultNodeName() {
return GraphName.of("android_sensors_driver/imuPublisher");
}
public interface NodeMain extends NodeListener {
GraphName getDefaultNodeName();
}
@Override
public void onStart(ConnectedNode connectedNode) {
try
{
//主题为"android/imu" 消息类型为 "sensor_msgs/Imu" ,是标准类型的消息
this.publisher = connectedNode.newPublisher("android/imu","sensor_msgs/Imu");
int i = this.sensorManager.getSensorList(1).size();
boolean hasAccel = false;
if (i > 0)
hasAccel = true;
int j = this.sensorManager.getSensorList(4).size();
boolean hasGyro = false;
if (j > 0)
hasGyro = true;
int k = this.sensorManager.getSensorList(11).size();
boolean hasQuat = false;
if (k > 0)
hasQuat = true;
this.sensorListener = new SensorListener(publisher, hasAccel, hasGyro, hasQuat);
this.imuThread = new ImuThread(this.sensorManager, sensorListener);
this.imuThread.start();
}catch (Exception e){
if(connectedNode !=