Test de la caméra de profondeur Femto Mega 3D – OrbbecViewer et Orbbec SDK dans Ubuntu 22.04, suivi du corps dans Windows 11

Examen de la caméra de profondeur Femto Mega 3D - OrbbecViewer et Orbbec SDK dans Ubuntu 22.04, suivi du corps dans Windows 11

Examen Orbbec Femto Mega

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.

Couleur d'OrbbecViewer

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.

Options du mode profondeur d'OrbbecViewer

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.

YouTube video

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.

Mode IR infrarouge OrbbecViewer

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.

Données Orbbec Femto Mega IMU

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.

Femto méga nuage de points XYZ
Style de nuage de points : xyz

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.

Femto Mega Pointcloud XYZRVB
Style de nuage de points : xyzrgb

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

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é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

Cela peut être modifié temporairement à 128 Mo (jusqu’au prochain redémarrage) ;

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″

Nous pouvons maintenant préparer la construction pour les exemples :

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é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 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 :

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 :

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 :

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 :

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.

Démo Femto Mega Ethernet NetDevice

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-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…

./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.

Mise à niveau du micrologiciel d'OrbbecViewer

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.

Mise à niveau du micrologiciel Orbbec Femto Mega version 1.2.8

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…

Version de l'éditeur manquante d'Unity Hub

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.

Projet ouvert Unity de suivi du corps Femto Mega

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.

Visual Studio Créer une solution

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

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.

Unité K4A_RESULT_FAILED

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

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.

Succès du suivi du corps Orbbec Femto Mega Unity

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.

Orbbec Femto Mega Suivi du corps

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.

YouTube video

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 :

YouTube video

  • 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,