Получение данных локатора и столкновений одновременно

Я новичок в работе со Sphero и Android, и я разбираюсь с примерами из Sphero SDK. Я успешно объединил примеры проектов ButtonDrive и Collisions, так что я думаю. может заставить Сферо катиться в направлении и остановиться, когда он наталкивается на что-то. Но код для настройки асинхронного прослушивания данных озадачивает меня, и я не могу добавить код, необходимый для использования функций локатора, таких как getLocatorData. Может ли кто-нибудь предоставить мне код, который мне нужно реализовать, чтобы я мог вызывать оба метода collisionData.hasImpactXAxis() и locatorData.getPositionX()

1 ответ

Решение

См. Образец локатора на https://github.com/orbotix/Sphero-Android-SDK для получения более подробной информации, но обычная практика заключается в...

private CollisionDetectedAsyncData collisionData;
private LocatorData lastLocation; 

// setup general AsyncDataListener 
private final DeviceMessenger.AsyncDataListener mDataListener = new DeviceMessenger.AsyncDataListener() {
    @Override
    public void onDataReceived(DeviceAsyncData data) {

        if(data instanceof DeviceSensorsAsyncData){ 
            //get the frames in the response
            List<DeviceSensorsData> data_list = ((DeviceSensorsAsyncData)data).getAsyncData();
            if(data_list != null){

                // Iterate over each frame, however we set data streaming as only one frame
                for(DeviceSensorsData datum : data_list){
                    LocatorData locatorData = datum.getLocatorData();
                    if( locatorData != null ) {
                        lastLocation = locatorData;  
                    }
                }
            }
        }

        if (data instanceof CollisionDetectedAsyncData) {
            collisionData = (CollisionDetectedAsyncData) data;
        }

        // handle new data from collisions or locations
    }
};

private configureStreamingAndCollisions(){
    // hook up Locator
    final long mask = SetDataStreamingCommand.DATA_STREAMING_MASK_LOCATOR_ALL;
    final int divisor = 4; //100Hz
    final int packet_frames = 1;
    final int response_count = 0;
    SetDataStreamingCommand.sendCommand((Robot)mRobot, divisor, packet_frames, mask, response_count);
    DeviceMessenger.getInstance().addAsyncDataListener((Robot)mRobot, mDataListener);

    // hook up Collision Listener
    DeviceMessenger.getInstance().addAsyncDataListener((Robot)mRobot,mCollisionListener);
    ConfigureCollisionDetectionCommand.sendCommand(mRobot, ConfigureCollisionDetectionCommand.DEFAULT_DETECTION_METHOD,
                            45, 45, 100, 100, 100);
}

Обратите внимание, что вам понадобятся переменные класса для отслеживания lastLocation или lastCollision...

Другие вопросы по тегам