Table des matières

OCULUS

Lancer la démo de l'oculus sur l'ordinateur Bellatrix

Configurer l'affichage et lancer oculusd (démarre la localisation par la caméra infra-rouge) :

 cd ~/bureau/wiki
 ./xr1
 

Lancer OculusWorldDemo :

  cd ~/Oculus/ovr_sdk_linux_0.4.3/Samples/OculusWorldDemo
  make run
  

oculus linux

Les anciens SDK ne sont plus disponibles sur le site de Oculus. Les nouveaux SDK sont exclusivement sur Windows. Pour trouver les dernières versions de SDK compatibles avec Linux :

  https://wiki.archlinux.org/index.php/Oculus_Rift

oculus et cmake

L'ordre le linkage des bibliothèques est important à cause des interdépendances.

Par exemple avec l'ordre suivant :

  target_link_libraries(displayOculus ${catkin_LIBRARIES})
  target_link_libraries(displayOculus ${OpenCV_LIBRARIES})
  target_link_libraries(displayOculus ${OPENGL_LIBRARY})
  target_link_libraries(displayOculus ${GLFW_LIBRARIES})
  target_link_libraries(displayOculus ${GLEW_LIBRARY})
  target_link_libraries(displayOculus rt)
  target_link_libraries(displayOculus Xrandr)
  target_link_libraries(displayOculus Xxf86vm)
  target_link_libraries(displayOculus pthread)
  target_link_libraries(displayOculus ${OVR_LIBRARIES})
  

on a l'erreur suivante :

  /usr/bin/ld: /home/jcombier/Oculus/ovr_sdk_linux_0.4.3/LibOVR/Lib/Linux/Debug/x86_64/libovr.a(OVR_SharedMemory.o): référence au symbole non défini «shm_unlink@@GLIBC_2.2.5»
  /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/librt.so: error adding symbols: DSO missing from command line
  collect2: error: ld returned 1 exit statusf
  

Avec cet ordre il n'y a plus d'erreur :

  target_link_libraries(displayOculus ${catkin_LIBRARIES})
  target_link_libraries(displayOculus ${OpenCV_LIBRARIES})
  target_link_libraries(displayOculus ${OVR_LIBRARIES})
  target_link_libraries(displayOculus Xxf86vm)
  target_link_libraries(displayOculus pthread)
  target_link_libraries(displayOculus Xrandr)
  target_link_libraries(displayOculus ${OPENGL_LIBRARY})
  target_link_libraries(displayOculus ${GLFW_LIBRARIES})
  target_link_libraries(displayOculus ${GLEW_LIBRARY})
  target_link_libraries(displayOculus rt)
  

On a trouvé une solution en modifiant directement la ligne de compilation g++ qui avait été généré par la commande catkin_make. Trois documents sont ajoutés : CMakeLists.txt (version qui fonctionne), CMakeLists.txt.save (version initiale qui ne fonctionne pas), tentative compilation (fichier qui retrace notre démarche)

Résolution erreur : X Error of failed request: GLXBadFBConfig

Après des mises à jour de paquets (sans doute des paquets de NVIDIA) sur l'ordinateur bellatrix, le SDK de l'Oculus ne fonctionnait plus. L'erreur suivante était affichée :

X Error of failed request:  GLXBadFBConfig
  Major opcode of failed request:  155 (GLX)
  Minor opcode of failed request:  21 (X_GLXGetFBConfigs)
  Serial number of failed request:  135
  Current serial number in output stream:  135

Elle survenait lors de l’exécution de la fonction bool SDKWindow::getVisualFromDrawable(GLXDrawable drawable, XVisualInfo* vinfoOut) dans LibOVR/Src/Displays/OVR_Linux_SDKWindow.cpp.

Une modification de cette fonction permet de résoudre le problème :

bool SDKWindow::getVisualFromDrawable(GLXDrawable drawable, XVisualInfo* vinfoOut)
{
    _XDisplay* display = glXGetCurrentDisplay();

    //**********  Ajout
    int screen;
    int value;
    glXQueryContext(display, glXGetCurrentContext(), GLX_FBCONFIG_ID, &value);
    glXQueryContext(display, glXGetCurrentContext(), GLX_SCREEN, &screen);
    const int attribs[] = {GLX_FBCONFIG_ID, value, None};

    int numElems;
    GLXFBConfig* config = glXChooseFBConfig(display, screen, attribs, &numElems);
    {
        XVisualInfo* chosen = glXGetVisualFromFBConfig(display, *config);
        *vinfoOut = *chosen;
        XFree(config);
        XFree(chosen);
        return true;
    }
    return false;
    
    //*********** Retrait
//    unsigned int value;
//    glXQueryDrawable(display, drawable, GLX_FBCONFIG_ID, &value);
//    XVisualInfo* chosen = glXGetVisualFromFBConfig(display, reinterpret_cast<GLXFBConfig>(value));
//    *vinfoOut = *chosen;
//    return true;
}

Modification d'après https://forums.oculus.com/fr/discussion/16664/solved-glxbaddrawable-under-linux et https://github.com/jherico/OculusSDK/pull/51/files