質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

センサーからの取得情報制限について

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 665

mkt84

score 4

以下のプログラムでは各センサからの取得情報が多すぎて、データの送受信にかなりの時間を要します。
どのようにすれば、0.1秒ごとに取得できるか、また、何個かのデータのうちの一つだけを取得するようにできるか、どなたかご教授お願いします。

package com.example.sensor_test;

import 略

public class MainActivity extends Activity implements SensorEventListener, Runnable{

private boolean mRegisteredSensor;
private SensorManager mSensorManager;

private GoogleApiClient mGoogleApiClient;
private String mNode;
int count =0;

// 加速度センサーの値
private float[] accelerometerValues = new float[3];
private float[] magneticValues = new float[3];
private Date date;
private String time = getDateString();
public static TextView text;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

text = (TextView)findViewById(R.id.text);

mRegisteredSensor = false;
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
ArrayList<List<Sensor>> sensors = new ArrayList<List<Sensor>>();
sensors.add( mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER));
sensors.add( mSensorManager.getSensorList(Sensor.TYPE_GYROSCOPE));

for(List<Sensor> sensor : sensors){
if(sensor.size()>0){
mRegisteredSensor = mSensorManager.registerListener(this,
sensor.get(0),
SensorManager.SENSOR_DELAY_FASTEST);
}
}
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
Log.d(TAG, "onConnected");

//                        NodeApi.GetConnectedNodesResult nodes = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
@Override
public void onResult(NodeApi.GetConnectedNodesResult nodes) {
//Nodeは1個に限定
if (nodes.getNodes().size() > 0) {
mNode = nodes.getNodes().get(0).getId();
}
}
});
}

@Override
public void onConnectionSuspended(int i) {
Log.d(TAG, "onConnectionSuspended");

}
})
.addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
Log.d(TAG, "onConnectionFailed : " + connectionResult.toString());
}
})
.build();
}

@Override
protected void onResume() {
super.onResume();

// 1.5
{
ArrayList<List<Sensor>> sensors = new ArrayList<List<Sensor>>();
sensors.add( mSensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER));
sensors.add( mSensorManager.getSensorList(Sensor.TYPE_GYROSCOPE));

mGoogleApiClient.connect();

for(List<Sensor> sensor : sensors){
if(sensor.size()>0){
mRegisteredSensor = mSensorManager.registerListener(this,
sensor.get(0),
SensorManager.SENSOR_DELAY_NORMAL);
}
}
}

}

@Override
protected void onPause() {
if (mRegisteredSensor) {
mSensorManager.unregisterListener(this);
mRegisteredSensor = false;
}

super.onPause();
mGoogleApiClient.disconnect();
}

@Override
public void onSensorChanged(SensorEvent event) { // 1.5

if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerValues = event.values.clone();
} else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
magneticValues = event.values.clone();
}
//転送セット
String SEND_DATA = accelerometerValues[0] + "," + accelerometerValues[1] + "," + accelerometerValues[2] + "," + magneticValues[0] + "," + magneticValues[1] + "," + magneticValues[2];
if (mNode != null) {
Wearable.MessageApi.sendMessage(mGoogleApiClient, mNode, SEND_DATA, null).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
@Override
public void onResult(MessageApi.SendMessageResult result) {
if (!result.getStatus().isSuccess()) {
Log.d(TAG, "ERROR : failed to send Message" + result.getStatus());
}
}
});
}

//writeCSVFile(accelerometerValues[0], accelerometerValues[1], accelerometerValues[2], magneticValues[0], magneticValues[1], magneticValues[2]);

text.setText(
"x " + accelerometerValues[0] + ", \n" +
"y " + accelerometerValues[1] + ", \n" +
"z " + accelerometerValues[2] + ", \n" +
"gx " + magneticValues[0] + ", \n" +
"gy " + magneticValues[1] + ", \n" +
"gz " + magneticValues[2]
);

}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) { // 1.5
}

@Override
public void run() {
// TODO Auto-generated method stub

}

/* 内部ストレージへのファイル書き込み用関数 */
public void writeCSVFile(float x,float y,float z,float gx,float gy,float gz){
String fileName = "test_" + time + ".csv";
String str = String.format("X = %f, Y = %f, Z = %f,GX = %f, GY = %f, GZ = %f ", accelerometerValues[0] , accelerometerValues[1] , accelerometerValues[2], magneticValues[0],magneticValues[1] , magneticValues[2]);
String path = Environment.getExternalStorageDirectory().getPath();
String file_path = path + "/" + fileName;
System.out.println("path = " + file_path);

File file = new File(file_path);
file.getParentFile().mkdir();

FileOutputStream fos;
try{
fos = new FileOutputStream(file, true);
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
BufferedWriter bw = new BufferedWriter(osw);
bw.write(str);
bw.flush();
bw.close();
}catch (Exception e){
e.printStackTrace();
}
}

/* ただの日付取得関数 */
public static String getDateString(){
final DateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
final Date date = new Date(System.currentTimeMillis());
return df.format(date);
}

}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる