
Nous avons jeté un coup d’œil rapide à la caméra de profondeur 3D et 4K RVB Orbbec Femto Mega à la fin de l’année dernière avec un aperçu du matériel et un essai rapide avec le programme OrbbecViewer dans Ubuntu 22.04. J’ai maintenant eu le temps de tester l’OrbbecViewer plus en détail, de consulter le SDK Orbbec sous Linux et divers exemples, et enfin de tester le Femto Mega avec une application de suivi corporel utilisant Unity sous Windows 11.
Un test plus approfondi du programme et des paramètres d’OrbbecViewer
Comme indiqué dans la première partie de l’test, le programme OrbbecViewer fournit des vues couleur, profondeur et IR pour la caméra. Entrons dans les détails pour chacun.

Le mode Couleur serait le même que celui de votre caméra couleur USB standard. Le Femto Mega prend en charge une résolution de 1280 × 720 à 30 ips à 3840 × 2160 à 25 ips en utilisant MJPG, H.264, H.265 ou RVB (converti à partir de MJPG). Nous pouvons retourner/miroriser l’image, et il existe certains paramètres habituels pour les appareils photo tels que la balance, le contraste, la saturation, etc.

Le mode Profondeur – que j’appellerais le mode « Fun » – représente les données de profondeur avec des couleurs allant du rouge (loin) au bleu foncé (proche), bien que cela puisse être inversé dans le mode palette de couleurs « Jet Inv ». La résolution peut être réglée de 320 × 288 à 30 FPS à 1024 × 1024 à 15 fps en utilisant le format Y16. D’autres paramètres incluent la sélection de la carte des couleurs, les options de prétraitement facultatives et le réglage de la plage visuelle de 0 à 12 000 mm, la valeur par défaut étant de 100 mm à 5 000 mm.

Vous pouvez voir comment la couleur change dans une pièce et quand un objet (le vôtre) se déplace élégamment à l’intérieur de la pièce dans le screencast ci-dessus.

La vue infrarouge (IR) prend également en charge 320 × 288 à 30 FPS à 1 024 × 1 024 à 15 ips en utilisant le format Y16. Le mode IR peut être réglé sur positif ou passif, et la carte de couleurs par défaut est réglée sur gris, mais vous pouvez également la basculer sur « Jet » ou « Jet Inv » pour avoir un effet similaire au mode profondeur. La plage visuelle peut également être réglée de 0 à 12 000 mm.
La section IMU ne fonctionnait pas dans OrbbecViewer 1.8.3, mais une fois que j’ai mis à jour le firmware vers la version 1.2.8 et l’application vers la version 1.9.3 (voir ci-dessous), les données de l’accéléromètre et du gyroscope s’afficheraient correctement.

Ces données pourraient être utiles lorsque la caméra est montée sur un robot ou pour détecter des vibrations lorsqu’elle est montée sur une machine.

Le nuage de points fait partie des paramètres avancés et affichera les données de couleur et de profondeur avec les coordonnées X, Y et Z. Il existe des commandes 2D et 3D, une plage de retour sur investissement (région d’intérêt) et la possibilité d’enregistrer et de lire des données 2D.

Le passage au style xyzrgb affichera les objets dans la plage de retour sur investissement D2C.
Test du Femto Mega avec le SDK Orbbec dans Ubuntu 22.04
L’OrbbecViewer est agréable à évaluer et à jouer avec la caméra Femto Mega, mais si vous souhaitez intégrer la caméra dans votre application, vous devrez utiliser le SDK Orbbec.
La documentation est distribuée sous forme de fichiers MD, ce qui peut convenir aux utilisateurs Windows, mais ne constitue pas la solution la plus judicieuse pour les utilisateurs Linux. J’ai dû passer près d’une heure pour trouver un programme qui restitue correctement la documentation avec des illustrations et Typora fait l’affaire (dans une certaine mesure) :
Cette partie de la documentation est plutôt correcte, mais je considérerais que la documentation globale est au mieux médiocre. Il y en a beaucoup, mais ce n’est pas toujours correct, et parfois clairement incomplet ou déroutant.
J’utiliserai le mini PC Khadas Mind avec Ubuntu 22.04 pour découvrir le SDK Orbbec. La documentation mentionne également :
Remarque : plates-formes Arm prises en charge : Jetson nano (arm64), AGX Orin (arm64), Orin NX (arm64), Orin Nano (arm64), A311D (arm64), Raspberry Pi 4 (arm64), Raspberry Pi 3 (arm32), rk3399. (arm64), d’autres systèmes Arm peuvent avoir besoin d’une compilation croisée.
J’avais donc prévu de le tester avec le Raspberry Pi 5, mais j’ai perdu beaucoup de temps sur une partie spécifique pour cette test Femto Mega (échantillon de suivi corporel) et en raison de contraintes de temps, j’ai dû sauter cette partie.
Avant d’installer le SDK Orbbec, nous devrons installer des dépendances (certaines non répertoriées dans la documentation) :
sudo apt installer libudev-dev libusb-dev libopencv-dev cmake
|
sudo apt installer libudev-dev libusb-dev libopencv-dev cmake |
Après avoir téléchargé le SDK Orbbec C/C++ 1.8.3, j’ai décompressé et exécuté un script pour installer les règles udev afin que les utilisateurs normaux puissent accéder à la caméra :
décompressez OrbbecSDK_C++_v1.8.3_20231124_6c51dc1_linux_x64_release.zip cd OrbbecSDK_v1.8.3/Script chmod +x install.sh sudo ./install.sh fichier de règles USB installer à /etc/udev/rules.d/99-obsensor-libusb.rules exit
|
décompresser OrbbecSDK_C_C++_v1.8.3_20231124_6c51dc1_linux_x64_release.zip cd OrbbecSDK_v1.8.3/Script chmod +x install.sh sudo ./install.sh Installation du fichier de règles USB dans /etc/udev/rules.d/99-obsensor-libusb.rules sortie |
La taille du tampon USBFS doit être définie sur 128 Mo pour traiter les images haute résolution de la caméra. Mais par défaut, il est fixé à 16 Mo :
chat /sys/module/usbcore/parameters/usbfs_memory_mb 16
|
chat /sys/module/usbcore/parameters/usbfs_memory_mb 16 |
Cela peut être modifié temporairement à 128 Mo (jusqu’au prochain redémarrage) ;
sudo sh -c ‘echo 128 > /sys/module/usbcore/parameters/usbfs_memory_mb’
|
sudo sh -c ‘echo 128 > /sys/module/usbcore/parameters/usbfs_memory_mb’ |
ou de manière permanente en ajoutant des paramètres à grub, par exemple (la doc a la procédure complète à suivre) :
GRUB_CMDLINE_LINUX_DEFAULT= »éclaboussure silencieuse usbcore.usbfs_memory_mb=128″
|
GRUB_CMDLINE_LINUX_DEFAULT= »éclaboussure silencieuse usbcore.usbfs_memory_mb=128″ |
Nous pouvons maintenant préparer la construction pour les exemples :
cd ../Exemple/ mkdir build cd build cmake ..
|
cd ../Exemple/ mkdir construire construction de CD cmfaire .. |
Sortir:
— L’identification du compilateur CXX est GNU 11.4.0 — L’identification du compilateur C est GNU 11.4.0 — Détection des informations ABI du compilateur CXX — Détection des informations ABI du compilateur CXX – terminé — Vérifier que le compilateur CXX fonctionne : /usr/bin /c++ – ignoré — Détection des fonctionnalités de compilation CXX — Détection des fonctionnalités de compilation CXX – terminé — Détection des informations ABI du compilateur C — Détection des informations ABI du compilateur C – terminé — Vérifier que le compilateur C fonctionne : /usr/bin/cc – ignoré — Détection des fonctionnalités de compilation C — Détection des fonctionnalités de compilation C – terminée — OpenCV trouvé : /usr (version trouvée « 4.5.4 ») — Configuration terminée — Génération terminée — Les fichiers de build ont été écrits dans : /home/ jaufranc/edev/OrbbecSDK_v1.8.3/Exemple/build
|
— L’identification du compilateur CXX est GNU 11.4.0 — L’identification du compilateur C est GNU 11.4.0 — Détection des informations ABI du compilateur CXX — Détection des informations ABI du compilateur CXX – terminé — Vérifiez que le compilateur CXX fonctionne : /usr/bin/c++ – ignoré — Détection des fonctionnalités de compilation CXX — Détection des fonctionnalités de compilation CXX – terminé — Détection des informations ABI du compilateur C — Détection des informations ABI du compilateur C – terminé — Vérifier que le compilateur C fonctionne : /usr/bin/cc – ignoré — Détection des fonctionnalités de compilation C — Détection des fonctionnalités de compilation C – terminé — OpenCV trouvé : /usr (version trouvée « 4.5.4 ») — Configuration terminée — Génération terminée — Les fichiers de build ont été écrits dans : /home/jaufranc/edev/OrbbecSDK_v1.8.3/Example/build |
Si vous rencontrez des erreurs ici, vous devrez peut-être installer des dépendances supplémentaires.
Construisons les exemples :
La compilation sur mon système n’a pris que 5 secondes, et nous disposons de toute une série d’exemples :
ls bin/ color_viewer double_infrared_viewer ImuReader Lecture ColorViewer DoubleInfraredViewer infrarouge_viewer point_cloud CommonUsages firmware_upgrade InfraredViewer PointCloud DepthPrecisionViewer FirmwareUpgrade MultiDevice Recorder deep_viewer hello_orbbec MultiDeviceSync SaveToDisk DepthViewer HelloOrbbec MultiStream sensor_control profondeur_work_mode hot_plugin net_device SensorControl DepthWorkMode HotPlugin NetDevice SyncAlignViewer
|
ls bin/ color_viewer double_infrared_viewer Lecture ImuReader ColorViewer DoubleInfraredViewer infrarouge_viewer point_cloud CommonUsages firmware_upgradeInfraredViewer PointCloud DepthPrecisionViewer FirmwareUpgrade Enregistreur multi-périphériques deep_viewer hello_orbbec MultiDeviceSync SaveToDisk DepthViewer HelloOrbbec MultiStream sensor_control deep_work_mode hot_plugin net_device SensorControl DepthWorkMode HotPlugin NetDevice SyncAlignViewer |
La description de chacun est disponible dans le fichier Lisez-moi et la documentation contient plus de détails expliquant chaque fonction :
- HelloOrbbec – Démonstration de la connexion à l’appareil pour obtenir la version du SDK et les informations sur l’appareil
- DepthViewer – Démontrer l’utilisation du SDK pour obtenir des données de profondeur et dessiner l’affichage, obtenir la résolution et la définir, afficher l’image de profondeur
- ColorViewer – Démonstration de l’utilisation du SDK pour obtenir des données de couleur et dessiner l’affichage, obtenir la résolution et la définir, afficher une image en couleur |
- InfraredViewer – Démontrer l’utilisation du SDK pour obtenir des données infrarouges et dessiner un affichage, obtenir la résolution et la définir, afficher une image infrarouge
- DoubleInfraredViewer – Démonstration d’obtention de données IR gauche et droite de caméras binoculaires
- SensorControl – Démontrer le fonctionnement de l’appareil et les commandes de contrôle des capteurs.
- DepthWorkMode – Démontrer l’obtention du mode de travail en profondeur actuel, obtenir la liste des modes de travail en profondeur pris en charge, changer de mode de travail en profondeur.
- Hotplugin – Démontrez la surveillance du branchement à chaud de l’appareil, connectez automatiquement l’appareil pour ouvrir le streaming en profondeur lorsque l’appareil est en ligne et déconnectez automatiquement l’appareil lorsqu’il détecte que l’appareil est hors ligne.
- PointCloud – Démontrez la génération d’un nuage de points de profondeur ou d’un nuage de points RGBD et enregistrez-le sous forme de fichier au format pli
- NetDevice – Démontre l’acquisition de données de profondeur et de couleur via le mode réseau
- FirmwareUpgrade – Démonstration de la mise à niveau du micrologiciel du périphérique
- CommonUsages – Démontrer le réglage et l’acquisition de paramètres de contrôle couramment utilisés
- IMUReader – Obtenez les données IMU et l’affichage des sorties
- SyncAlignViewer – Démontrer les opérations sur l’alignement du flux de données des capteurs
La plupart des exemples sont disponibles dans les langages C et C++, mais certains n’ont été écrits que dans l’un ou l’autre de ces langages.
Analysons l’exemple le plus basique :
jaufranc@Khadas-Mind-Raspberryme:~/edev/OrbbecSDK_v1.8.3/Example/build/bin$ ./hello_orbbec Version du SDK : 1.8.3 Version de l’étape du SDK : principale
[01/20 14:42:22.214994][info][31868][Context.cpp:67] Contexte créé avec config : config par défaut !
[01/20 14:42:22.215000][info][31868][Context.cpp:72] Contexte rép_travail=/home/jaufranc/edev/OrbbecSDK_v1.8.3/Example/build/bin
[01/20 14:42:22.295390][info][31868][LinuxPal.cpp:110] Créez PollingDeviceWatcher !
[01/20 14:42:22.295405][info][31868][DeviceManager.cpp:15] Appareil(s) actuellement trouvé(s) : (1)
[01/20 14:42:22.295410][info][31868][DeviceManager.cpp:24] – Nom : Femto Mega, PID : 0x0669, SN/ID : , Connexion : USB3.2
[01/20 14:42:22.295486][error][31868][ObV4lDevice.cpp:594] ObV4lAppareil construit.
[01/20 14:42:22.313301][info][31868][FemtoMegaUvcDevice.cpp:50] Appareil FemtoMega UVC créé ! PID : 0x0669, SN : CL2AA31000P
[01/20 14:42:22.313309][info][31868][DeviceManager.cpp:154] Appareil créé avec succès ! Nom : Femto Mega, PID : 0x0669, SN/ID : Nom de l’appareil : Femto Mega Pid de l’appareil : 1641 vid : 11205 uid : 2-3-6 Version du micrologiciel : 1.1.5 Numéro de série : CL2AA31000P Type de connexion : USB3.2 Types de capteurs : Capteur IR Capteur de couleur Capteur de profondeur Capteur d’accélération Capteur gyroscopique Appuyez sur ESC_KEY pour quitter !
|
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 22 23 |
jaufranc@Khadas-Mind-Raspberryme:~/edev/OrbbecSDK_v1.8.3/Example/build/bin$ ./hello_orbbec Version du SDK : 1.8.3 Version de l’étape SDK : principale [01/20 14:42:22.214994][info][31868][Context.cpp:67] Contexte créé avec config : config par défaut ! [01/20 14:42:22.215000][info][31868][Context.cpp:72] Contexte rép_travail=/home/jaufranc/edev/OrbbecSDK_v1.8.3/Example/build/bin [01/20 14:42:22.295390][info][31868][LinuxPal.cpp:110] Créez PollingDeviceWatcher ! [01/20 14:42:22.295405][info][31868][DeviceManager.cpp:15] Appareil(s) actuellement trouvé(s) : (1) [01/20 14:42:22.295410][info][31868][DeviceManager.cpp:24] – Nom : Femto Mega, PID : 0x0669, SN/ID : , Connexion : USB3.2 [01/20 14:42:22.295486][error][31868][ObV4lDevice.cpp:594] ObV4lAppareil construit. [01/20 14:42:22.313301][info][31868][FemtoMegaUvcDevice.cpp:50] Appareil FemtoMega UVC créé ! PID : 0x0669, SN : CL2AA31000P [01/20 14:42:22.313309][info][31868][DeviceManager.cpp:154] Appareil créé avec succès ! Nom : Femto Mega, PID : 0x0669, SN/ID : Nom de l’appareil : Femto Mega PID de l’appareil : 1641 vid : 11205 uid : 2-3-6 Version du micrologiciel : 1.1.5 Numéro de série : CL2AA31000P Type de connexion : USB3.2 Types de capteurs : Capteur infrarouge Capteur de couleur Capteur de profondeur Capteur d’accélération Capteur gyroscopique Appuyez sur ESC_KEY pour quitter ! |
Cela affiche le nom de l’appareil, la version du micrologiciel, le numéro de série, le type de connexion et les capteurs.
Pour référence, voici le code source C du programme « hello orbbec » dans Exemple/c/Sample-HelloOrbbec :
#include
|
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
#include #include #include #include « utils.hpp » #include #définir ESC_KEY 27 void check_error(ob_error *erreur) { si (erreur) { printf(« ob_error a été déclenché : \n\tcall : %s(%s)\n », ob_error_function(erreur), ob_error_args(erreur)); printf(« \tmessage : %s\n », ob_error_message(erreur)); printf(« \type de terreur : %d\n », ob_error_exception_type(error)); ob_delete_error(erreur); quitter(EXIT_FAILURE); } } int main(int argc, char **argv) { // affiche le numéro de version du SDK printf(« Version du SDK : %d.%d.%d\n », ob_get_major_version(), ob_get_minor_version(), ob_get_patch_version()); // imprimer la version de l’étape SDK printf(« Version de l’étape SDK : %s\n », ob_get_stage_version()); // Crée un contexte. ob_error *erreur = NULL ; ob_context *ctx = ob_create_context(&erreur); check_error(erreur); // Interroge la liste des appareils connectés ob_device_list *dev_list = ob_query_device_list(ctx, &error); check_error(erreur); // Récupère le nombre d’appareils connectés int dev_count = ob_device_list_device_count(dev_list, &error); check_error(erreur); si (dev_count == 0) { printf(« Périphérique introuvable !\n »); renvoie -1 ; } // Crée un périphérique, 0 signifie l’index du premier périphérique ob_device *dev = ob_device_list_get_device(dev_list, 0, &error); check_error(erreur); // Récupère les informations sur l’appareil ob_device_info *dev_info = ob_device_get_device_info(dev, &erreur); check_error(erreur); // Récupère le nom de l’appareil const char *name = ob_device_info_name(dev_info, &error); check_error(erreur); printf(« Nom du périphérique : %s\n », nom); // Récupère le pid, la vid, l’uid de l’appareil int pid = ob_device_info_pid(dev_info, &erreur); check_error(erreur); int vid = ob_device_info_vid(dev_info, &erreur); check_error(erreur); const char *uid = ob_device_info_uid(dev_info, &error); check_error(erreur); printf(« pid de l’appareil : %d vid : %d uid : %s\n », pid, vid, uid); // Obtenez le numéro de version du firmware de l’appareil en const char *fw_ver = ob_device_info_firmware_version(dev_info, &error); check_error(erreur); printf(« Version du micrologiciel : %s\n », fw_ver); // Récupère le numéro de série de l’appareil const char *sn = ob_device_info_serial_number(dev_info, &error); check_error(erreur); printf(« Numéro de série : %s\n », sn); // Récupère le type de connexion de l’appareil const char *connectType = ob_device_info_connection_type(dev_info, &error); check_error(erreur); printf(« Type de connexion : %s\n », type de connexion); printf(« Types de capteurs : \n »); // Obtenez une liste des capteurs pris en charge ob_sensor_list *sensor_list = ob_device_get_sensor_list(dev, &error); check_error(erreur); // Récupère le nombre de capteurs int sensor_count = ob_sensor_list_get_sensor_count(sensor_list, &error); check_error(erreur); pour (int i = 0; i < sensor_count; i++) { // Récupère le type de capteur ob_sensor_type sensor_type = ob_sensor_list_get_sensor_type(sensor_list, i, &error); check_error(erreur); commutateur (type_capteur) { cas OB_SENSOR_COLOR : printf(« \tCapteur de couleur\n »); casser; cas OB_SENSOR_DEPTH : printf(« \tCapteur de profondeur\n »); casser; cas OB_SENSOR_IR : printf(« \tCapteur IR\n »); casser; cas OB_SENSOR_IR_LEFT : printf(« \tCapteur IR gauche\n »); casser; cas OB_SENSOR_IR_RIGHT : printf(« \tCapteur IR droit\n »); casser; cas OB_SENSOR_ACCEL : printf(« \tCapteur d’accélération\n »); casser; cas OB_SENSOR_GYRO : printf(« \tCapteur gyroscopique\n »); casser; défaut: casser; } } printf(« Appuyez sur ESC_KEY pour quitter ! \n »); tandis que (vrai) { // Récupère la valeur de la touche enfoncée, si c’est la touche esc, quitte le programme clé int = getch(); si (clé == ESC_KEY) casser; } // détruit la liste des capteurs ob_delete_sensor_list(sensor_list, &erreur); check_error(erreur); // détruit les informations sur l’appareil ob_delete_device_info(dev_info, &erreur); check_error(erreur); // détruit l’appareil ob_delete_device(dev, &erreur); // détruit le contexte ob_delete_context(ctx, &erreur); check_error(erreur); renvoie 0 ; } |
Et le code source C++ peut être trouvé dans Sample/cpp/Sample-HelloOrbbec :
#include
|
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
#include #include « utils.hpp » #include « libobsensor/ObSensor.hpp » #include « libobsensor/hpp/Erreur.hpp » #définir ESC 27 int main (int argc, char **argv) essayez { // Imprime le numéro de version du SDK, le numéro de version du SDK est divisé en numéro de version majeure, numéro de version mineure et numéro de révision std::cout << "Version du SDK : " << ob::Version::getMajor() << "." << ob::Version::getMinor() << "." << ob :: Version :: getPatch () << std :: endl; // Imprimer la version de l’étape SDK std::cout << "Version de l'étape SDK : " << ob::Version::getStageVersion() << std::endl; // Crée un contexte. ob :: Contexte ctx ; // Interroge la liste des appareils connectés auto devList = ctx.queryDeviceList(); // Récupère le nombre d’appareils connectés if(devList->deviceCount() == 0) { std::cerr << "Périphérique introuvable !" << std :: endl; renvoie -1 ; } // Crée un périphérique, 0 signifie l’index du premier périphérique auto dev = devList->getDevice(0); // Récupère les informations sur l’appareil auto devInfo = dev->getDeviceInfo(); // Récupère le nom de l’appareil std::cout << "Nom du périphérique : " << devInfo->name() << std::endl; // Récupère le pid, la vid, l’uid de l’appareil std::cout << "pid de l'appareil : " << devInfo->pid() << " vid : " << devInfo->vid() << " uid : " << devInfo->uid() << std ::endl; // En obtenant le numéro de version du firmware de l’appareil auto fwVer = devInfo->firmwareVersion(); std::cout << "Version du micrologiciel : " << fwVer << std::endl; // En récupérant le numéro de série de l’appareil auto sn = devInfo->serialNumber(); std::cout << "Numéro de série : " << sn << std::endl; // En récupérant le type de connexion de l’appareil auto connectType = devInfo->connectionType(); std::cout << "ConnectionType: " << connectType << std::endl; // Récupère la liste des capteurs pris en charge std::cout << "Types de capteurs : " << std::endl; auto sensorList = dev->getSensorList(); for(uint32_t i = 0; i < sensorList->count(); i++) { capteur automatique = sensorList->getSensor(i); commutateur (capteur-> type ()) { cas OB_SENSOR_COLOR : std::cout << "\tCapteur de couleur" << std::endl; casser; cas OB_SENSOR_DEPTH : std::cout << "\tCapteur de profondeur" << std::endl; casser; cas OB_SENSOR_IR : std::cout << "\tIR capteur" << std::endl; casser; cas OB_SENSOR_IR_LEFT : std::cout << "\tIR Capteur gauche" << std::endl; casser; cas OB_SENSOR_IR_RIGHT : std::cout << "\tIR Capteur droit" << std::endl; casser; cas OB_SENSOR_GYRO : std::cout << "\tCapteur gyroscopique" << std::endl; casser; cas OB_SENSOR_ACCEL : std::cout << "\tCapteur d'accélération" << std::endl; casser; défaut: casser; std::cout << "Appuyez sur ESC pour quitter ! " << std::endl; tandis que (vrai) { // Récupère la valeur de la touche enfoncée, si c’est la touche esc, quitte le programme clé int = getch(); si (clé == ESC) casser; } renvoie 0 ; } catch(ob::Erreur &e) { std::cerr << "fonction:" << e.getName() << "\nargs:" << e.getArgs() << "\nmessage:" << e.getMessage() << "\ntype :" << e.getExceptionType() << std::endl; quitter(EXIT_FAILURE); } |
Je voulais ensuite tester l’application NetDevice puisque je n’ai pas essayé le port Ethernet avec OrbbecViewer. L’adresse IP doit encore être définie dans OrbbecViewer puisque DHCP ne fonctionnait pas dans la version 1.8.3, je dois donc utiliser une adresse IP fixe. Notez qu’OrbecViewer résout ce problème.
Nous pouvons exécuter l’application et saisir l’adresse IP que nous avons définie dans OrbbecViewer :
jaufranc@Khadas-Mind-Raspberryme:~/edev/OrbbecSDK_v1.8.3/Example/build/bin$ ./NetDevice
[01/20 15:02:27.825366][info][31997][Context.cpp:67] Contexte créé avec config : config par défaut !
[01/20 15:02:27.825374][info][31997][Context.cpp:72] Contexte rép_travail=/home/jaufranc/edev/OrbbecSDK_v1.8.3/Example/build/bin
[01/20 15:02:27.898646][info][31997][LinuxPal.cpp:110] Créez PollingDeviceWatcher !
[01/20 15:02:27.898712][info][31997][DeviceManager.cpp:15] Appareil(s) actuellement trouvé(s) : (1)
[01/20 15:02:27.898725][info][31997][DeviceManager.cpp:24] – Nom : Femto Mega, PID : 0x0669, SN/ID : , Connexion : USB3.2 Saisissez l’adresse IP de votre appareil (par défaut : 192.168.1.10) : 192.168.31.222.
[01/20 15:12:10.281079][info][31997][FemtoMegaNetDevice.cpp:130] Appareil FemtoMega Net créé ! PID : 0x0669, SN : CL2AA31000P
[01/20 15:12:10.281132][info][31997][DeviceManager.cpp:102] créez le succès de Net Device ! adresse = 192.168.31.222, port = 8090
[01/20 15:12:10.281210][info][31997][Pipeline.cpp:44] Pipeline créé avec l’appareil : {nom : Femto Mega, sn : CL2AA31000P}, @0x564447B31B80
[01/20 15:12:10.281785][info][31997][FemtoMegaNetDevice.cpp:325] Le capteur de profondeur a été créé !
[01/20 15:12:10.282249][info][31997][FemtoMegaNetDevice.cpp:352] Le capteur de couleur a été créé !
[01/20 15:12:10.286253][info][31997][Pipeline.cpp:238] Essayez de démarrer des streams !
[01/20 15:12:10.286357][info][31997][VideoSensor.cpp:590] démarrez le flux OB_SENSOR_DEPTH avec le profil : {type : OB_STREAM_DEPTH, format : OB_FORMAT_Y16, largeur : 640, hauteur : 576, fps : 30}
[01/20 15:12:11.346211][info][31997][VideoSensor.cpp:590] démarrez le flux OB_SENSOR_COLOR avec le profil : {type : OB_STREAM_COLOR, format : OB_FORMAT_H264, largeur : 1280, hauteur : 720, fps : 30}
[01/20 15:12:12.938254][info][31997][Pipeline.cpp:251] Démarrage des diffusions terminé !
[01/20 15:12:12.938334][info][31997][Pipeline.cpp:234] Démarrage du pipeline terminé ! Cadre couleur : index=0, horodatage=24458703Cadre couleur : index=30, horodatage=24459685Cadre couleur : index=60, horodatage=24460667Cadre couleur : index=60, horodatage=24460667Cadre couleur : index=90, horodatage=24461649Cadre couleur : index= 90, horodatage=24461649Cadre couleur : index=120, horodatage=24462631Cadre couleur : index=180, horodatage=24464596Cadre couleur : index=210, horodatage=24465578Cadre couleur : index=240, horodatage=24466560Cadre couleur : index=270, horodatage=24467543Couleur Cadre : index=300, horodatage=24468525Cadre couleur : index=330, horodatage=24469507Cadre couleur : index=360, horodatage=24470489Cadre couleur : index=390, horodatage=24471471Cadre couleur : index=420, horodatage=24472454Cadre couleur : index=420 , timestamp=24472454Color Frame : index=450, timestamp=24473436Color Frame : index=480, timestamp=24474418Color Frame : index=510, timestamp=24475400Color Frame : index=540, timestamp=24476383Color Frame : index=570, timestamp=24477365Color Frame : index=600, horodatage=24478347^C
|
1 2 3 4 5 6 7 8 9 dix 11 12 13 14 15 16 17 18 |
jaufranc@Khadas-Mind-Raspberryme:~/edev/OrbbecSDK_v1.8.3/Example/build/bin$ ./NetDevice [01/20 15:02:27.825366][info][31997][Context.cpp:67] Contexte créé avec config : config par défaut ! [01/20 15:02:27.825374][info][31997][Context.cpp:72] Contexte rép_travail=/home/jaufranc/edev/OrbbecSDK_v1.8.3/Example/build/bin [01/20 15:02:27.898646][info][31997][LinuxPal.cpp:110] Créez PollingDeviceWatcher ! [01/20 15:02:27.898712][info][31997][DeviceManager.cpp:15] Appareil(s) actuellement trouvé(s) : (1) [01/20 15:02:27.898725][info][31997][DeviceManager.cpp:24] – Nom : Femto Mega, PID : 0x0669, SN/ID : , Connexion : USB3.2 Saisissez l’adresse IP de votre appareil (par défaut : 192.168.1.10) : 192.168.31.222 [01/20 15:12:10.281079][info][31997][FemtoMegaNetDevice.cpp:130] Appareil FemtoMega Net créé ! PID : 0x0669, SN : CL2AA31000P [01/20 15:12:10.281132][info][31997][DeviceManager.cpp:102] créez le succès de Net Device ! adresse = 192.168.31.222, port = 8090 [01/20 15:12:10.281210][info][31997][Pipeline.cpp:44] Pipeline créé avec l’appareil : {nom : Femto Mega, sn : CL2AA31000P}, @0x564447B31B80 [01/20 15:12:10.281785][info][31997][FemtoMegaNetDevice.cpp:325] Le capteur de profondeur a été créé ! [01/20 15:12:10.282249][info][31997][FemtoMegaNetDevice.cpp:352] Le capteur de couleur a été créé ! [01/20 15:12:10.286253][info][31997][Pipeline.cpp:238] Essayez de démarrer des streams ! [01/20 15:12:10.286357][info][31997][VideoSensor.cpp:590] démarrez le flux OB_SENSOR_DEPTH avec le profil : {type : OB_STREAM_DEPTH, format : OB_FORMAT_Y16, largeur : 640, hauteur : 576, fps : 30} [01/20 15:12:11.346211][info][31997][VideoSensor.cpp:590] démarrez le flux OB_SENSOR_COLOR avec le profil : {type : OB_STREAM_COLOR, format : OB_FORMAT_H264, largeur : 1280, hauteur : 720, fps : 30} [01/20 15:12:12.938254][info][31997][Pipeline.cpp:251] Démarrage des diffusions terminé ! [01/20 15:12:12.938334][info][31997][Pipeline.cpp:234] Démarrage du pipeline terminé ! Cadre couleur : index=0, horodatage=24458703Cadre couleur : index=30, horodatage=24459685Cadre couleur : index=60, horodatage=24460667Cadre couleur : index=60, horodatage=24460667Cadre couleur : index=90, horodatage=24461649Cadre couleur : index= 90, horodatage=24461649Cadre couleur : index=120, horodatage=24462631Cadre couleur : index=180, horodatage=24464596Cadre couleur : index=210, horodatage=24465578Cadre couleur : index=240, horodatage=24466560Cadre couleur : index=270, horodatage=24467543Couleur Cadre : index=300, horodatage=24468525Cadre couleur : index=330, horodatage=24469507Cadre couleur : index=360, horodatage=24470489Cadre couleur : index=390, horodatage=24471471Cadre couleur : index=420, horodatage=24472454Cadre couleur : index=420 , timestamp=24472454Color Frame : index=450, timestamp=24473436Color Frame : index=480, timestamp=24474418Color Frame : index=510, timestamp=24475400Color Frame : index=540, timestamp=24476383Color Frame : index=570, timestamp=24477365Color Frame : index=600, horodatage=24478347^C |
Cela ouvrira une nouvelle fenêtre appelée « MultiDeviceViewer » avec une représentation des données de profondeur.

Mise à jour du firmware
Comme nous avons un firmware plus ancien (version du firmware : 1.1.5), j’ai décidé de le mettre à niveau vers une version plus récente 1.2.8 publiée sur GitHub il y a quelques jours à peine.
wget https://github.com/orbbec/OrbbecFirmware/releases/download/Femto-Mega-Firmware/FemtoMega_20240103153450_v1.2.8_2b5db3b-489cbcd.tbz2 tar xvf FemtoMega_20240103153450_v1.2.8_2b5db3b-4 89cbcd.tbz2
|
wget https://github.com/orbbec/OrbbecFirmware/releases/download/Femto-Mega-Firmware/FemtoMega_20240103153450_v1.2.8_2b5db3b-489cbcd.tbz2 tar xvf FemtoMega_20240103153450_v1.2.8_2b5db3b-489cbcd.tbz2 |
Nous obtenons un répertoire avec un tas de fichiers, mais l’exemple du SDK ne semble pas être conçu pour cela car il attend un fichier bin au lieu d’un répertoire…
./FirmwareUpgrade Veuillez saisir le chemin du micrologiciel. commande : $ ./FirmwareUpgrade[.exe] firmwareFile.bin
|
./Mise à jour du firmware Veuillez saisir le chemin du micrologiciel. commande: $ ./Mise à niveau du micrologiciel[.exe] firmwareFile.bin |
Pour jouer la sécurité, j’ai décidé de faire la mise à jour avec la dernière version d’OrbbecViewer (1.9.3) et de suivre les instructions fournies sur GitHub. Nous avons besoin d’un câble micro USB vers USB-A pour effectuer la mise à jour. Il n’est pas fourni avec le kit, j’utilise donc le câble fourni avec mes écouteurs pour le recharger. J’ai donc connecté le câble micro USB au Khadas Mind, inséré une aiguille dans le trou d’épingle « Registration Pin » et connecté le câble USB-C pour l’alimentation, avant de retirer l’aiguille. Mais rien ne s’est passé.
Après plusieurs essais, j’ai décidé de chercher un autre câble micro USB, et cette fois l’OrbbecViewer « a trouvé un appareil en mode mise à niveau ». Cela a probablement échoué la première fois parce que le câble micro USB de mes écouteurs manque probablement de fils de données… Cela a perdu un peu plus de 30 minutes là-dessus.

Mais j’ai ensuite sélectionné « un fichier de firmware », ce qui signifie en réalité « un répertoire de firmware » et j’ai pu terminer la mise à jour avec succès en deux minutes.

Après la mise à jour, j’ai pu confirmer que la caméra fonctionnait toujours normalement et j’ai noté quelques améliorations telles que le fonctionnement de DHCP et l’IMU était désormais correctement prise en charge.
Exemple de suivi corporel de Femto Mega avec Unity (Windows 11)
Au début, je m’attendais à pouvoir exécuter des échantillons de haut niveau tels que la segmentation corporelle avec le SDK Orbbec, mais tous les échantillons sont plutôt des échantillons de bas niveau montrant comment obtenir des données de la caméra Femto Mega, mais sans faire quelque chose d’utile avec. .
La Femto Mega, et quelques autres caméras Orbbec, sont compatibles avec Microsoft Azure Kinect et Microsoft propose plusieurs exemples dont une démo Body Tracking qui fonctionne avec Unity et peut activer des applications telles que le comptage de personnes, la détection de chutes, etc… Mais on nous dit que le suivant:
En raison des exemples fournis à partir de diverses sources, ils ne peuvent être construits que pour Windows ou Linux. Pour que l’obstacle à l’ajout de nouveaux échantillons reste faible, nous exigeons uniquement que l’échantillon fonctionne au même endroit.
L’exemple de suivi du corps semble fonctionner uniquement sous Windows car il impliquait l’exécution d’un script bat et aucun autre script n’est présent. Je vais donc redémarrer le Khadas Mind sous Windows 11… et essayer.
La première étape des instructions se lit comme suit :
Ouvrez le projet sample_unity_bodytracking dans Unity. Ouvrez la solution Visual Studio associée à ce projet. S’il n’existe pas encore de solution Visual Studio, vous pouvez en créer une en ouvrant l’éditeur Unity, en sélectionnant l’un des fichiers csharp du projet et en l’ouvrant pour le modifier. Vous devrez peut-être également définir les préférences->Outils externes sur Visual Studio
J’ai donc installé la dernière version de Visual Studio (2022 CE) et Unity Editor (2022). Mais lorsque j’ai essayé d’ajouter le projet de démonstration Body Tracking à Unity Hub, un avertissement « Version de l’éditeur manquante » est apparu me demandant d’installer Unity Editor 2019.1.2f1 à la place…

Eh bien, alors je l’ai fait et cela a également installé Visual Studio 2017 automatiquement. J’ai donc supprimé Unity 2022 et Visual Studio 2022 CE que j’avais installés pour éviter d’éventuels conflits.

Je pourrais ouvrir le projet dans Unity. L’étape suivante consistait à rechercher un fichier CSharp et à cliquer dessus pour ouvrir Visual Studio. Il n’y avait pas de « solution » dans VS, et il m’a fallu un peu de temps pour découvrir ce que cela signifiait. J’ai donc dû aller dans le menu supérieur pour créer un nouveau projet, sélectionner « Visual Studio Solutions » et lui donner un nom.

Une fois cela fait, je pourrais ajouter l’échantillon de suivi corporel à la solution. À ce stade, je suis censé accéder à Outils-> NuGet Package Manager-> Package Manager Console. Mais il n’y a rien qui s’appelle NuGet Package Manager. C’est parce qu’il doit être installé via « Outils->Obtenir les outils et fonctionnalités ». Tout bon. Je pourrais alors démarrer la console et taper :
Package de mise à jour -réinstaller
|
Package de mise à jour -réinstaller |
La première fois, cela a échoué parce que je n’avais pas créé de solution. Puis quelque chose a encore échoué (je ne suis pas sûr dans Unity ou Visual Studio, c’était il y a 10 jours…) à cause des limitations de longueur de chemin dans Windows… J’avais extrait le dépôt GitHub dans Documents/Orbbec, j’ai donc extrait l’exemple de projet dans un répertoire dans C:\ pour raccourcir la longueur du chemin et cette partie fonctionne maintenant…
La partie suivante des instructions est un peu folle. Vous devez copier un tas de fichiers (environ 30) à partir de différents répertoires. Mais heureusement, un script « MoveLibraryFile.bat » est censé vous aider. Le redistribuable Visual C++ doit également être installé et certains autres fichiers doivent être copiés manuellement.
Le fichier « \sample_unity_bodytracking\Assets\Scripts\SkeletalTrackingProvider.cs » prend en charge plusieurs modes de suivi pour le rendu sur la machine hôte et il est défini sur TrackerProcessingMode.GPU, ce qui signifie DirectML dans Windows, et je n’ai pas modifié cela au départ. La dernière étape consiste à ouvrir le projet Unity, à sélectionner Kinect4AzureSampleScene sous Scènes et à cliquer sur le bouton de lecture en haut. En théorie, je peux désormais danser devant la caméra et le système suivra mes mouvements.

Mais il a échoué avec l’erreur « capture d’exception pour le résultat du thread d’arrière-plan = K4A_RESULTS_FAILED » et rien ne s’est produit. Le message d’erreur est pratiquement inutile et n’a pas réussi à trouver de solution, j’ai donc demandé sur les forums Orbbec et on m’a dit d’utiliser le moteur de rendu CPU à la place :
ProcessingMode = TrackerProcessingMode.Cpu
|
ProcessingMode = TrackerProcessingMode.Cpu |
Je l’ai fait, mais toujours pas de chance. J’ai donc imprimé le fichier des fichiers de la documentation et les ai vérifiés un par un. Tous étaient là. J’ai finalement contacté la société de relations publiques qui avait organisé l’échantillon et j’ai été mis en contact avec les ingénieurs d’Orbbec. Après quelques allers-retours, j’ai reçu le dossier du projet d’un des ingénieurs qui pouvait le faire fonctionner.

Au début, j’étais confus à cause de l’erreur Timeout indiquée ci-dessus. Après avoir cliqué sur Play, j’ai agité ma main devant la caméra et rien ne s’est passé, j’ai donc supposé que cela ne fonctionnait pas. Mais il s’avère que le message de délai d’attente peut être ignoré en toute sécurité, le programme prend un certain temps pour démarrer (5 secondes sur Khadas Mind Premium) et vous devez être à une distance adéquate de la caméra pour que cela fonctionne correctement.

Le rendu CPU est un peu lent (il y a donc un décalage), mais Orbbec a confirmé que le rendu GPU ne fonctionne pas pour le moment. Vous pouvez voir certains de mes mouvements de Kung Fu et un salut Wai dans la vidéo ci-dessous.

Le problème avec mon projet était que j’avais cliqué sur le mauvais lien dans la documentation d’Orbbec et cela m’a conduit aux échantillons officiels Azure Kinet de Microsoft au lieu du fork d’Orbbec. Le plus amusant, c’est que j’avais installé l’exemple Microsoft sous Windows en lisant la documentation du bon dépôt sous Linux… Quoi qu’il en soit, ça marche maintenant. J’aurais juste aimé que la documentation globale soit plus claire et que les messages d’erreur dans Unity soient plus pertinents… L’échantillon de suivi corporel peut servir de point de départ pour développer des solutions de détection de chute ou des jeux basés sur la caméra de profondeur Femto Mega 3D.
J’aimerais remercier Orbbec d’avoir envoyé la caméra de profondeur Femto Mega 3D pour test. La caméra peut être achetée sur Amazon au prix de 909 $, mais il est actuellement moins cher de l’acheter sur le site Web d’Orbbec au prix de 694,99 $.
Retrouvez l’histoire de Raspberry Pi dans cette vidéo :

-
Orbbec Caméra de profondeur Gemini 2 XL
-
Moniteur de test pour caméra de vidéosurveillance et IP, profondeur extérieure 44 mm, hauteur extérieure 158 mm, largeur extérieure 240 mm, type de moniteur CCTV, gamme de produits CCTV et caméras IP,
