Я только что получил свой планшет, где раньше был телефон. Как многие из вас, вероятно, знают, SDK телефона позволял захватывать суперкадры с помощью обратного вызова камеры Android. При правильном анализе суперкадры содержали все соответствующие данные датчиков.
В Архимеде я попробовал следующее. Я сделал действие, которое реализует CameraPreviewListener:
public class MainActivity extends Activity implements CameraPreviewListener
{
// Inside of this class we manage another object that implements PreviewCallback
...
}
Это позволяет захватывать изображение с камеры, как и на любом другом устройстве Android. (Обратите внимание, что на телефоне Peanut это обеспечивало суперкадры; на планшете это просто предоставлял необработанный буфер RGB.) Точно так же простая реализация обратных вызовов из службы Tango работает просто отлично.
public class MainActivity extends Activity
{
private Tango mTango;
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
...
setTangoListeners();
}
private void setTangoListeners()
{
mTango.connectListener(framePairs, new OnTangoUpdateListener() {
@Override
public void onPoseAvailable(final TangoPoseData pose)
{
System.out.println("Pose data received.");
}
@Override
public void onXyzIjAvailable(final TangoXyzIjData xyzIj)
{
System.out.println("Cloud data received.");
}
@Override
public void onTangoEvent(final TangoEvent event)
{
...
}
}
}
Однако, когда я пытаюсь объединить их вместе, вот так,
public class MainActivity extends Activity implements CameraPreviewListener
{
// Inside of this class we manage another object that implements PreviewCallback
private Tango mTango;
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
...
setTangoListeners();
}
private void setTangoListeners()
{
mTango.connectListener(framePairs, new OnTangoUpdateListener() {
@Override
public void onPoseAvailable(final TangoPoseData pose)
{
System.out.println("Pose data received.");
}
@Override
public void onXyzIjAvailable(final TangoXyzIjData xyzIj)
{
System.out.println("Cloud data received.");
}
@Override
public void onTangoEvent(final TangoEvent event)
{
...
}
}
}
Происходит что-то странное. Обратный вызов камеры срабатывает просто отлично, и я также получаю обратные вызовы onPoseAvailable. Однако я больше не получаю никаких обратных вызовов onXyzIjAvailable.
Итак, мои вопросы:
Правильно ли я предполагаю, что сервису Tango требуется доступ к обратному вызову камеры для создания данных PointCloud?
Если да, то можно ли как-то обойти это, чтобы я мог получить буфер RGB и Pointcloud примерно в одно и то же время? (Да, я знаю, что калибровка не тривиальна.)
Если нет решения для 2, планируются ли какие-либо будущие обновления SDK, которые позволят это сделать?
Я еще не изучил C SDK. Может быть, есть способ сделать это там, и если да, то есть ли у кого-нибудь опыт?
В идеале мне нужен доступ к необработанному буферу RGB, изображению интенсивности и изображению «рыбий глаз»; Мне все равно как, лишь бы работало.