<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Embarqué</title>
		<link>https://www.developpez.net/forums/</link>
		<description><![CDATA[Forum d'entraide sur la programmation des systèmes embarqués]]></description>
		<language>fr</language>
		<lastBuildDate>Thu, 22 Oct 2026 08:15:01 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.png</url>
			<title>Forum du club des développeurs et IT Pro - Embarqué</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title>Les employés de Tesla rechignent à former les robots humanoïdes Optimus destinés à les remplacer</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185896&amp;goto=newpost</link>
			<pubDate>Tue, 29 Sep 2026 05:33:35 GMT</pubDate>
			<description>*Les employés de Tesla...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Les employés de Tesla rechignent à former les robots humanoïdes Optimus destinés à les remplacer</font></b><br />
<b><font size="1">Car enregistrer leurs gestes professionnels donne à l’IA les clés pour automatiser leurs postes</font></b><br />
<br />
<b>Tesla s'appuie sur une automatisation industrielle lourde et hautement synchronisée pour assembler ses véhicules (Model 3, Model Y, Cybertruck). En renfort de ses robots industriels classiques et de ses machines de moulage géantes, le constructeur automobile a commencé à déployer son robot Optimus (Gen2/V3) directement sur ses lignes de production. Selon des enquêtes récentes, plusieurs ouvriers des usines de Fremont et d'Austin refusent de porter les combinaisons de capture de mouvement et les casques-caméras nécessaires à l'entraînement du robot. Motif : Enregistrer leurs gestes professionnels <a href="https://intelligence-artificielle.developpez.com/actu/386949/-Je-refuse-de-former-l-IA-qui-va-me-remplacer-lancent-des-travailleurs-soucieux-de-proteger-leurs-emplois-mais-qui-oublient-qu-ils-perdent-le-controle-sur-la-qualite-des-productions-de-l-IA/" target="_blank">donne à l’IA les clés pour automatiser leurs postes</a>.</b> <br />
<br />
 <blockquote class="twitter-tweet" data-media-max-width="560"><p lang="en" dir="ltr">Tesla pays people up to $48 an hour to juggle tennis balls for a robot.<br><br>Watch the final second first. Then come back.<br><br>The man in black wears a motion-capture suit, 2 sensor gloves and a tracking headband.<br><br>3 meters away, Optimus copies him.<br><br>He tosses. It tosses.<br>He catches. It… <a rel="nofollow" href="https://t.co/fHvU6OcqWB">https://t.co/fHvU6OcqWB</a> <a rel="nofollow" href="https://t.co/BV0XKTvnYY">pic.twitter.com/BV0XKTvnYY</a></p>&mdash; karol (@karolinch1k) <a rel="nofollow" href="https://x.com/karolinch1k/status/2103863036524036102?ref_src=twsrc%5Etfw">September 26, 2026</a></blockquote>  <b><font size="3">Tesla et Elon Musk mettent en avant des gains d'efficacité révolutionnaires liés à l'hyper-automatisation et au pivot vers l'intelligence artificielle</font></b><br />
<br />
Les robots appliquent les soudures et les composants avec une tolérance millimétrique constante, créant des carrosseries plus solides qu'un assemblage humain. Les machines opèrent sans baisse de régime, à toutes heures et ce, tous les jours.<br />
<br />
Avec son nouveau procédé de fabrication modulaire parallèle, Tesla affirme pouvoir assembler des modules de véhicules simultanément au travers des stations ouvertes robotisées. L'objectif à terme pour <a href="https://embarque.developpez.com/actu/386871/Tesla-d-Elon-Musk-lance-son-Cybercab-a-Austin-Sans-volant-ni-pedales-ce-robotaxi-autonome-doit-surmonter-des-defis-reglementaires-et-des-doutes-persistants-sur-la-fiabilite-de-son-logiciel-Full-Self-Driving/" target="_blank">le Cybercab</a> est de descendre sous la barre des 10 secondes (et viser 5 secondes) par cycle de production. <br />
<br />
L'automatisation totale combinée à ce design modulaire permet de réduire l'empreinte au sol des usines de 50 % et d'éliminer des étapes énergivores comme les ateliers de peinture classiques. <br />
<br />
En convertissant des lignes entières d'assemblage (comme l'arrêt des Model S/X à Fremont en 2026 au profit d'Optimus), l'entreprise ambitionne de créer des usines qui s'auto-assemblent, rendant la capacité de production indépendante des contraintes de main-d'œuvre humaine. <br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/MvLQ0ygZoqM?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="3">C’est justement cette quête d’indépendance de main-d’œuvre humaine qui rend les travailleurs sollicités pour l’entraînement des humanoïdes Optimus réticents à se plier à l’exercice</font></b><br />
<br />
Les employés sont pleinement conscients qu'en enregistrant méticuleusement leurs gestes professionnels, ils donnent à l'intelligence artificielle les clés pour automatiser leur propre poste et provoquer leur licenciement futur. <br />
<br />
L’inconfort et la surveillance font aussi partie des facteurs de résistance. En effet, le port prolongé d'équipements lourds (sacs à dos de capture, caméras) et l'exécution d'exercices dictés par l'intelligence artificielle (mouvements décomposés) génèrent un fort sentiment d'aliénation. <br />
<br />
Face à ce blocage, Tesla a dû retirer cette tâche des ouvriers standards pour la confier à des équipes de collecteurs de données dédiées, déplacées dans des centres de formation spécifiques situés au Colorado et en Floride.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/dZjEh-5QO_w?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="3">Tesla n’est pas un cas isolé. Ce phénomène de fronde des travailleurs de la filière technologique face à l'entraînement de leur propre remplaçant virtuel est à plus large spectre</font></b><br />
<br />
<ul><li style="">	<b>Meta (2026)</b> : Des employés ont massivement signé une pétition contre <a href="https://intelligence-artificielle.developpez.com/actu/382440/-Model-Capability-Initiative-Meta-installe-un-mouchard-sur-les-postes-de-ses-employes-pour-analyser-leurs-activites-et-entrainer-ses-IA-tandis-qu-elle-prepare-la-suppression-de-8-000-postes-en-ma" target="_blank">l'initiative Model Capability Initiative (MCI)</a>. Meta prévoyait d'installer des logiciels espions pour enregistrer les clics, mouvements de souris et saisies au clavier des ingénieurs afin d'entraîner ses futurs agents d’intelligence artificielle.</li><li style="">	<b>Hyundai / Boston Dynamics</b> : Des vagues de contestations et de grèves ouvrières ont éclaté contre l'introduction des robots humanoïdes Atlas sur les lignes d'assemblage automobile.</li><li style="">	<b>Oracle &amp; ScaleAI / OpenAI</b> : Des prestataires et sous-traitants (souvent hautement qualifiés) recrutés pour annoter, corriger et humaniser les réponses de ChatGPT se sont révoltés. Ironie du sort, certains entraîneurs ont été licenciés par OpenAI pour avoir triché en utilisant eux-mêmes des IA (comme ChatGPT ou Grammarly) afin d'automatiser leur travail d'annotation.</li><li style="">	<b>Sabotage passif en entreprise</b> : Des études sectorielles révèlent que près de 29 % des employés (et jusqu'à 44 % chez la génération Z) admettent saboter délibérément les stratégies IA de leur entreprise (fausses données, refus d'utilisation, rapports biaisés) pour préserver leur emploi.</li></ul><br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/1L2RB-PmtoQ?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="3">En toile de fond, c’est un affrontement entre filières intelligence artificielle et robotique d’entreprises occidentales et de Chine qui se joue</font></b> <br />
<br />
L'Occident fait face à une résistance syndicale et éthique sur la collecte de données réelles. Si les ouvriers refusent de former les machines, le développement de l'IA physique prendra du retard par rapport aux pays dotés de directives industrielles descendantes et centralisées, comme la Chine. <br />
<br />
En effet, pendant que Tesla continue de peaufiner ses actionneurs et ses bras robotiques qui doivent résister à des années d'utilisation en conditions réelles, les fabricants chinois prennent déjà des commandes.<br />
<br />
<a href="https://embarque.developpez.com/actu/361836/Le-robot-humanoide-Unitree-G1-est-pret-a-passer-a-la-production-de-masse-Pensez-vous-avoir-envie-de-payer-16-000-pour-avoir-un-robot-dansant/" target="_blank">Unitree G1</a> est vendu au grand public à environ 13 500 dollars (contre 20 000 doollars minimum pour un Optimus). AgiBot et d’autres acteurs proposent des prix encore plus bas pour des versions simplifiées. Plusieurs entreprises chinoises déclarent pouvoir descendre en dessous de 10 000 $ dès que les volumes atteindront plusieurs dizaines de milliers d’unités.<br />
<br />
Ce ne sont pas des jouets. Ils marchent, ils gardent leur équilibre, ils saisissent des objets et ils sont déjà vendus à des laboratoires de recherche, des universités et des premiers clients commerciaux à travers l’Asie. <br />
<br />
 <blockquote class="twitter-tweet"><p lang="en" dir="ltr">&#127464;&#127475;Unitree CEO Wang Xingxing &amp; His G1 Robot Army<br><br>Dozens of Unitree G1 humanoid robots performing synchronized running, marching, and agile movements. Designed for mass production at ~$16,000 each.<br><br>Daily Usage:<br>Industrial tasks, logistics, research, education, and future… <a rel="nofollow" href="https://t.co/WVVobwluZN">pic.twitter.com/WVVobwluZN</a></p>&mdash; GeoPaul626 (@Paull626) <a rel="nofollow" href="https://x.com/Paull626/status/2055002084018381081?ref_src=twsrc%5Etfw">May 14, 2026</a></blockquote>  En 2007, l’iPhone était clairement le meilleur smartphone. En 2012, le choix du meilleur téléphone n’avait plus d’importance. C’est le téléphone à 150 dollars, capable d’accomplir 80 % des tâches, qui a conquis le marché mondial.<br />
Exactement le même schéma se dessine aujourd’hui dans le domaine des humanoïdes.<br />
<br />
La plupart des tâches manuelles ne nécessitent pas une dextérité équivalente à celle d’un être humain. Elles requièrent une machine qui se présente tous les jours, suit des instructions simples et coûte moins cher qu’un travailleur humain sur trois ans. Une fois ce seuil franchi, la seule chose qui compte c’est le volume. Et le volume est l’arme la plus redoutable de la Chine.<br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Que vous inspirent ces développements ? L’Occident est-il en train de perdre la guerre face à la Chine en matière de robotique et d’intelligence artificielle ?<br />
:fleche: Quelles sont les politiques que vous préconiseriez en tant que décideur occidental pour maintenir votre industrie robotique et d’IA à flot face à la montée en puissance de la Chine ?<br />
<br />
<b>Voir aussi :</b> <br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/357712/Unitree-presente-son-agent-humanoide-G1-livre-a-partir-de-16-000-le-robot-alimente-a-l-IA-est-polyvalent-et-semble-beaucoup-plus-complet-que-le-H1-L-entreprise-reduit-l-ecart-avec-Boston-Dynamics/" target="_blank">Unitree présente son agent humanoïde G1 : livré à partir de 16 000 $, le robot alimenté à l'IA est polyvalent et semble beaucoup plus complet que le H1. L'entreprise réduit l'écart avec Boston Dynamics</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/350319/La-Chine-prevoit-de-stimuler-la-production-de-masse-de-robots-humanoides-d-ici-a-2025-en-2027-ils-seraient-le-nouveau-moteur-important-de-la-croissance-economique-de-la-Chine/" target="_blank">La Chine prévoit de stimuler la production de masse de robots humanoïdes d'ici à 2025, en 2027, ils seraient &quot;le nouveau moteur important de la croissance économique&quot; de la Chine</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/351631/La-premiere-usine-de-production-en-serie-de-robots-humanoides-est-sur-le-point-d-ouvrir-ses-portes-aux-Etats-Unis-suscitant-davantage-de-preoccupations-sur-l-automatisation-massive-des-emplois/" target="_blank">La première usine de production en série de robots humanoïdes est sur le point d'ouvrir ses portes aux États-Unis, suscitant davantage de préoccupations sur l'automatisation massive des emplois</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Patrick Ruiz</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185896/general-developpement/programmation-systeme/embarque/employes-tesla-rechignent-former-robots-humanoides-optimus-destines-remplacer/</guid>
		</item>
		<item>
			<title>Des robots humanoïdes apprenant à s’entraîner et à se battre de façon autonome ne relèvent plus de la scifi</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185621&amp;goto=newpost</link>
			<pubDate>Sat, 12 Sep 2026 07:59:45 GMT</pubDate>
			<description>*Un robot capable d’activer...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Un robot capable d’activer le mode kung fu après une bousculade avec un humain ne relève plus de la scifi comme l’illustrent des vidéos d’humanoïdes apprenant à s’entraîner et à se battre de façon autonome</font></b><br />
<br />
<b>Le développement de <a href="https://intelligence-artificielle.developpez.com/actu/387096/Des-robots-humanoides-et-quadrupedes-manifestent-devant-un-ministere-polonais-pour-reclamer-une-regulation-de-l-IA-afin-de-proteger-les-emplois-L-heure-est-aux-regles-lance-un-robot-pilote-par-l-" target="_blank">robots humanoïdes</a> capables de s'entraîner et de combattre de manière autonome, sans intervention humaine directe, progresse à un rythme effréné. En 2026, la filière a franchi un cap critique grâce à l’émergence de modèles dits de fondation appliqués à la physique. Ces machines s'affranchissent désormais de la téléopération humaine pour anticiper, parer et porter des coups en temps réel. Bien que développées pour le combat, les compétences d'agilité autonome, de réflexes ultra-rapides et de perception prédictive offrent des avantages massifs dans plusieurs domaines. Bien sûr, <a href="https://intelligence-artificielle.developpez.com/actu/357310/Des-responsables-mondiaux-d-organisations-diverses-appellent-au-bannissement-des-robots-tueurs-et-des-armes-pilotees-par-des-IA-C-est-le-tournant-Oppenheimer-de-notre-generation/" target="_blank">des dangers sont à anticiper sur le long terme</a>.</b> <br />
<br />
 <blockquote class="twitter-tweet"><p lang="en" dir="ltr">A Unitree G1 performs martial arts in slow motion.<br><br>Robotics still has a long way to go in intelligence.<br><br>But this level of mechanical capability is insane. <a rel="nofollow" href="https://t.co/X4r84bV8Mb">pic.twitter.com/X4r84bV8Mb</a></p>&mdash; clankr (@clankrmedia) <a rel="nofollow" href="https://x.com/clankrmedia/status/2096758138128986338?ref_src=twsrc%5Etfw">September 7, 2026</a></blockquote>  <b><font size="3">Qu’est-ce qu’un modèle de fondation appliqué à la physique ? Pourquoi est-ce une révolution pour les robots humanoïdes autonomes </font></b>? <br />
<br />
Un modèle de fondation appliqué à la physique (souvent appelé Physics-Informed Foundation Model ou World Foundation Model) est une intelligence artificielle de grande taille pré-entraînée non pas sur du texte internet, mais sur les lois immuables de la physique (gravité, friction, inertie, dynamique des fluides et des solides) et des millions d'heures de simulations ou de démonstrations réelles.<br />
<br />
Dans le cadre du développement des nouveaux robots humanoïdes autonomes, ce modèle sert de cerveau moteur et intuitif. Contrairement aux intelligences artificielles traditionnelles, il permet au robot de comprendre comment le monde physique fonctionne, lui donnant la capacité d'apprendre des tâches complexes et de réagir de manière fluide en temps réel (comme parer, esquiver ou frapper de manière autonome). <br />
<br />
Jusqu'à récemment, un robot humanoïde avait besoin d'un algorithme spécifique pour chaque action (un pour marcher, un pour saisir un objet, un pour se défendre). Un modèle de fondation physique change totalement la donne grâce à diviers piliers. <br />
<br />
Primo, Le modèle intègre des équations physiques directement dans sa fonction de perte. Le robot ne se contente pas d'analyser des images : il possède une compréhension mentale de la quantité de mouvement, de la gravité et de l'équilibre de son propre corps. S'il subit un impact ou s'il glisse lors d'un combat, il recalcule instantanément son centre de gravité pour ne pas tomber. <br />
<br />
Deuxio, entraîner un humanoïde à combattre ou à se déplacer dans le monde réel est dangereux et coûteux. Ces modèles de fondation sont entraînés pendant des décennies virtuelles en l'espace de quelques jours dans des environnements de simulation ultra-réalistes (comme le simulateur de physique différentielle NVIDIA Newton ou Isaac Lab). Grâce à la précision du modèle physique, le robot transfère ses compétences de combat et d'agilité de la simulation au monde réel de manière sans réentraînement.<br />
<br />
Enfin, ces modèles lient la perception visuelle (caméras du robot), la compréhension des commandes (exemple: « défends cette zone ») et l'action motrice fine. Le modèle traduit les intentions en commandes de couple précises pour les dizaines de moteurs (degrés de liberté) de l'humanoïde.<br />
<br />
Tout cela ouvre la porte à la possibilité de l’apprentissage et du combat autonomes. Le modèle combine pour cela deux types d’apprentissage. Le premier est l’apprentissage par imitation au travers duquel le modèle ingère des captures de mouvements  de combattants humains ou d'experts en arts martiaux. Le robot assimile la mémoire musculaire des enchaînements, des frappes et des postures.<br />
<br />
Le deuxième type est l’apprentissage par renforcement au travers duquel le modèle découvre ainsi par lui-même des tactiques de combat optimales conformes à la physique. En simulation (le canal au travers duquel cet apprentissage s’opère), l'intelligence artificielle affronte des milliers d'adversaires virtuels. Elle est récompensée lorsqu'elle réussit une esquive ou touche une cible, et pénalisée si elle perd l'équilibre. <br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/J8kuL_nAEvo?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="3">Les robots s’appuient sur des actionneurs et moteurs de haute performance pour ce qui est de leur « corps »</font></b><br />
<br />
Pour le combat, les robots nécessitent un couple phénoménal au niveau des articulations (souvent plus de 17 à 30 degrés de liberté). Les moteurs électriques de haute précision (conçus par des leaders comme Faulhaber) gèrent des boucles de commande ultra-rapides.<br />
<br />
Le torse des robots abrite des processeurs (CPU) couplés à des accélérateurs d'IA et GPU intensifs pour traiter la vision artificielle locale sans dépendre d'une connexion Wi-Fi (qui pourrait être brouillée en combat).<br />
<br />
Les robots intègrent des capteurs LiDAR à balayage rapide, des caméras de profondeur stéréoscopiques et des capteurs haptiques (peaux tactiles) pour évaluer l'impact des coups reçus et la configuration du terrain.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/QwJcF08hfs8?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="3">Unitree Robotics fait partie des leaders technologiques sur ce segment</font></b> <br />
<br />
Le constructeur de robots Unitree propose des modèles de fondation open-source capables de coordonner l'ensemble du corps des humanoïdes en temps réel. <br />
<br />
La startup Physical Intelligence aussi est un acteur de cette filière. Elle a lancé &#960;0 (Pi-Zero), un modèle de fondation généraliste conçu pour donner une forme d’intelligence physique universelle aux robots, leur permettant de manipuler des objets et de se mouvoir de façon fluide.<br />
<br />
De son coté, NVIDIA a développé GR00T, un modèle de fondation pour humanoïdes, couplé récemment à SONIC, un contrôleur universel capable de gérer les mouvements complets du corps (whole-body control) pour des actions dynamiques comme le sprint ou des coups de pied.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/GHySQMMrIa4?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
C’est en droite ligne avec la disponibilité de ces outils que les entreprises proposent des démonstrations de robots apprenant à s’entraîner et à se battre de façon autonome.<br />
<br />
<ul><li style="">	<b>Unitree Robotics (Chine)</b> : Début septembre 2026, l'entreprise a dévoilé une avancée historique avec son robot humanoïde G1, capable de se battre et de faire du sparring de manière 100 % autonome contre un humain en temps réel. Contrairement aux démonstrations passées basées sur des télécommandes ou des casques VR, le système agit de son propre chef.</li><li style="">	<b>L'Armée populaire de libération (APL)</b> : Immédiatement après les Jeux mondiaux des robots humanoïdes, le quotidien officiel de l'armée chinoise a appelé à accélérer le transfert de ces technologies vers les terrains d'entraînement militaire pour préparer le déploiement opérationnel de robots humanoïdes &quot;combattants&quot;</li><li style="">	<b>Les projets académiques de pointe</b> : Le framework RoboStriker (publié par des chercheurs en janvier 2026) utilise le Multi-Agent Reinforcement Learning (MARL) pour permettre une autonomie complète en boxe humanoïde. De même, les universités de Berkeley et Stanford ont développé le framework BeyondMimic, permettant à des robots d'apprendre de manière autonome des coups de pied rotatifs (spin kicks) et des enchaînements agiles sans réglage humain spécifique.</li></ul><br />
 <blockquote class="twitter-tweet"><p lang="en" dir="ltr">Unitree Breakthrough: The World’s First Real-Time World Model-Driven Fully Autonomous Humanoid Robot Combat&#129354;<br>UnifoLM-X2-1.0 breaks through world-action foundation models' bottlenecks in instant planning, decision-making, and dynamic interactive execution, achieve high dynamics,… <a rel="nofollow" href="https://t.co/xqAodjuD1m">pic.twitter.com/xqAodjuD1m</a></p>&mdash; Unitree (@UnitreeRobotics) <a rel="nofollow" href="https://x.com/UnitreeRobotics/status/2096932273602048258?ref_src=twsrc%5Etfw">September 7, 2026</a></blockquote>  <b><font size="3">La défense et la sécurité, la gestion des catastrophes et le secours, l’industrie lourde et de maintenance font partie des secteurs à même de bénéficier des avantages offerts par ces robots</font></b> <br />
<br />
En effet, ces derniers sont susceptibles d’être utiles au remplacement des soldats humains dans les guerres urbaines hautement létales, les missions d'infiltration, le déminage ou la surveillance de sites sensibles en zone de guerre. Ils viendraient ainsi en complément des robots-chiens utilisés sur les champs de bataille actuels et qui, du point de vue du développeur informatique, ces robots sont des kits matériels - à la présentation visuelle similaire à celle d’un chien sur pattes – programmables via une API fournie par le constructeur.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br />336<br />337<br />338<br />339<br />340<br />341<br />342<br />343<br />344<br />345<br />346<br />347<br />348<br />349<br />350<br />351<br />352<br />353<br />354<br />355<br />356<br />357<br />358<br />359<br />360<br />361<br />362<br />363<br />364<br />365<br />366<br />367<br />368<br />369<br />370<br />371<br />372<br />373<br />374<br />375<br />376<br />377<br />378<br />379<br />380<br />381<br />382<br />383<br />384<br />385<br />386<br />387<br />388<br />389<br />390<br />391<br />392<br />393<br />394<br />395<br />396<br />397<br />398<br />399<br />400<br />401<br />402<br />403<br />404<br />405<br />406<br />407<br />408<br />409<br />410<br />411<br />412<br />413<br />414<br />415<br />416<br />417<br />418<br />419<br />420<br />421<br />422<br />423<br />424<br />425<br />426<br />427<br />428<br />429<br />430<br />431<br />432<br />433<br />434<br />435<br />436<br />437<br />438<br />439<br />440<br />441<br />442<br />443<br />444<br />445<br />446<br />447<br />448<br />449<br />450<br />451<br />452<br />453<br />454<br />455<br />456<br />457<br />458<br />459<br />460<br />461<br />462<br />463<br />464<br />465<br />466<br />467<br />468<br />469<br />470<br />471<br />472<br />473<br />474<br />475<br />476<br />477<br />478<br />479<br />480<br />481<br />482<br />483<br />484<br />485<br />486<br />487<br />488<br />489<br />490<br />491<br />492<br />493<br />494<br />495<br />496<br />497<br />498<br />499<br />500<br />501<br />502<br />503<br />504<br />505<br />506<br />507<br />508<br />509<br />510<br />511<br />512<br />513<br />514<br />515<br />516<br />517<br />518<br />519<br />520<br />521<br />522<br />523<br />524<br />525<br />526<br />527<br />528<br />529<br />530<br />531<br />532<br />533<br />534<br />535<br />536<br />537<br />538<br />539<br />540<br />541<br />542<br />543<br />544<br />545<br />546<br />547<br />548<br />549<br />550<br />551<br />552<br />553<br />554<br />555<br />556<br />557<br />558<br />559<br />560<br />561<br />562<br />563<br />564<br />565<br />566<br />567<br />568<br />569<br />570<br />571<br />572<br />573<br />574<br />575<br />576<br />577<br />578<br />579<br />580<br />581<br />582<br />583<br />584<br />585<br />586<br />587<br />588<br />589<br />590<br />591<br />592<br />593<br />594<br />595<br />596<br />597<br />598<br />599<br />600<br />601<br />602<br />603<br />604<br />605<br />606<br />607<br />608<br />609<br />610<br />611<br />612<br />613<br />614<br />615<br />616<br />617<br />618<br />619<br />620<br />621<br />622<br />623<br />624<br />625<br />626<br />627<br />628<br />629<br />630<br />631<br />632<br />633<br />634<br />635<br />636<br />637<br />638<br />639<br />640<br />641<br />642<br />643<br />644<br />645<br />646<br />647<br />648<br />649<br />650<br />651<br />652<br />653<br />654<br />655<br />656<br />657<br />658<br />659<br />660<br />661<br />662<br />663<br />664<br />665<br />666<br />667<br />668<br />669<br />670<br />671<br />672<br />673<br />674<br />675<br />676<br />677<br />678<br />679<br />680<br />681<br />682<br />683<br />684<br />685<br />686<br />687<br />688<br />689<br />690<br />691<br />692<br />693<br />694<br />695<br />696<br />697<br />698<br />699<br />700<br />701<br />702<br />703<br />704<br />705<br />706<br />707<br />708<br />709<br />710<br />711<br />712<br />713<br />714<br />715<br />716<br />717<br />718<br />719<br />720<br />721<br />722<br />723<br />724<br />725<br />726<br />727<br />728<br />729<br />730<br />731<br />732<br />733<br />734<br />735<br />736<br />737<br />738<br />739<br />740<br />741<br />742<br />743<br />744<br />745<br />746<br />747<br />748<br />749<br />750<br />751<br />752<br />753<br />754<br />755<br />756<br />757<br />758<br />759<br />760<br />761<br />762<br />763<br />764<br />765<br />766<br />767<br />768<br />769<br />770<br />771<br />772<br />773<br />774<br />775<br />776<br />777<br />778<br />779<br />780<br />781<br />782<br />783<br />784<br />785<br />786<br />787<br />788<br />789<br />790<br />791<br />792<br />793<br />794<br />795<br />796<br />797<br />798<br />799<br />800<br />801<br />802<br />803<br />804<br />805<br />806<br />807<br />808<br />809<br />810<br />811<br />812<br />813<br />814<br />815<br />816<br />817<br />818<br />819<br />820<br />821<br />822<br />823<br />824<br />825<br />826<br />827<br />828<br />829<br />830<br />831<br />832<br />833<br />834<br />835<br />836<br />837<br />838<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;"># Copyright (c) 2023 Boston Dynamics, Inc.  All rights reserved.</span>
<span style="color: #808080;"># Downloading, reproducing, distributing or otherwise using the SDK Software </span>
<span style="color: #808080;"># is subject to the terms and conditions of the Boston Dynamics Software </span>
<span style="color: #808080;"># Development Kit License (20191101-BDSDK-SL). </span>
&nbsp;
<span style="color: #FF0000;">&quot;&quot;&quot;Tutorial to show how to use the Boston Dynamics API to detect and follow an object&quot;&quot;&quot;</span> 
<span style="color: #0000ff;">import</span> argparse 
<span style="color: #0000ff;">import</span> io 
<span style="color: #0000ff;">import</span> json 
<span style="color: #0000ff;">import</span> math 
<span style="color: #0000ff;">import</span> os 
<span style="color: #0000ff;">import</span> signal 
<span style="color: #0000ff;">import</span> sys 
<span style="color: #0000ff;">import</span> time 
<span style="color: #0000ff;">from</span> multiprocessing <span style="color: #0000ff;">import</span> Barrier, Process, Queue, Value 
<span style="color: #0000ff;">from</span> queue <span style="color: #0000ff;">import</span> Empty, Full 
<span style="color: #0000ff;">from</span> threading <span style="color: #0000ff;">import</span> BrokenBarrierError, Thread 
&nbsp;
<span style="color: #0000ff;">import</span> cv2 
<span style="color: #0000ff;">import</span> numpy <span style="color: #0000ff;">as</span> np 
<span style="color: #0000ff;">from</span> PIL <span style="color: #0000ff;">import</span> Image 
<span style="color: #0000ff;">from</span> scipy <span style="color: #0000ff;">import</span> ndimage 
<span style="color: #0000ff;">from</span> tensorflow_object_detection <span style="color: #0000ff;">import</span> DetectorAPI 
&nbsp;
<span style="color: #0000ff;">import</span> bosdyn.client 
<span style="color: #0000ff;">import</span> bosdyn.client.util 
<span style="color: #0000ff;">from</span> bosdyn <span style="color: #0000ff;">import</span> geometry 
<span style="color: #0000ff;">from</span> bosdyn.api <span style="color: #0000ff;">import</span> geometry_pb2 <span style="color: #0000ff;">as</span> geo 
<span style="color: #0000ff;">from</span> bosdyn.api <span style="color: #0000ff;">import</span> image_pb2, trajectory_pb2 
<span style="color: #0000ff;">from</span> bosdyn.api.image_pb2 <span style="color: #0000ff;">import</span> ImageSource 
<span style="color: #0000ff;">from</span> bosdyn.api.spot <span style="color: #0000ff;">import</span> robot_command_pb2 <span style="color: #0000ff;">as</span> spot_command_pb2 
<span style="color: #0000ff;">from</span> bosdyn.client.async_tasks <span style="color: #0000ff;">import</span> AsyncPeriodicQuery, AsyncTasks 
<span style="color: #0000ff;">from</span> bosdyn.client.frame_helpers <span style="color: #0000ff;">import</span> <span class="br0">&#40;</span>GROUND_PLANE_FRAME_NAME, VISION_FRAME_NAME, get_a_tform_b, 
                                         get_vision_tform_body<span class="br0">&#41;</span> 
<span style="color: #0000ff;">from</span> bosdyn.client.image <span style="color: #0000ff;">import</span> ImageClient 
<span style="color: #0000ff;">from</span> bosdyn.client.lease <span style="color: #0000ff;">import</span> LeaseClient, LeaseKeepAlive 
<span style="color: #0000ff;">from</span> bosdyn.client.math_helpers <span style="color: #0000ff;">import</span> Quat, SE3Pose 
<span style="color: #0000ff;">from</span> bosdyn.client.robot_command <span style="color: #0000ff;">import</span> <span class="br0">&#40;</span>CommandFailedError, CommandTimedOutError, 
                                         RobotCommandBuilder, RobotCommandClient, blocking_stand<span class="br0">&#41;</span> 
<span style="color: #0000ff;">from</span> bosdyn.client.robot_state <span style="color: #0000ff;">import</span> RobotStateClient 
&nbsp;
LOGGER = bosdyn.client.util.get_logger<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
SHUTDOWN_FLAG = Value<span class="br0">&#40;</span><span style="color: #FF0000;">'i'</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> 
&nbsp;
<span style="color: #808080;"># Don't let the queues get too backed up </span>
QUEUE_MAXSIZE = <span style="color: #cc66cc;">10</span> 
&nbsp;
<span style="color: #808080;"># This is a multiprocessing.Queue for communication between the main process and the </span>
<span style="color: #808080;"># Tensorflow processes. </span>
<span style="color: #808080;"># Entries in this queue are in the format: </span>
&nbsp;
<span style="color: #808080;"># { </span>
<span style="color: #808080;">#     'source': Name of the camera, </span>
<span style="color: #808080;">#     'world_tform_cam': transform from VO to camera, </span>
<span style="color: #808080;">#     'world_tform_gpe':  transform from VO to ground plane, </span>
<span style="color: #808080;">#     'raw_image_time': Time when the image was collected, </span>
<span style="color: #808080;">#     'cv_image': The decoded image, </span>
<span style="color: #808080;">#     'visual_dims': (cols, rows), </span>
<span style="color: #808080;">#     'depth_image': depth image proto, </span>
<span style="color: #808080;">#     'system_cap_time': Time when the image was received by the main process, </span>
<span style="color: #808080;">#     'image_queued_time': Time when the image was done preprocessing and queued </span>
<span style="color: #808080;"># } </span>
RAW_IMAGES_QUEUE = Queue<span class="br0">&#40;</span>QUEUE_MAXSIZE<span class="br0">&#41;</span> 
&nbsp;
<span style="color: #808080;"># This is a multiprocessing.Queue for communication between the Tensorflow processes and </span>
<span style="color: #808080;"># the bbox print process. This is meant for running in a containerized environment with no access </span>
<span style="color: #808080;"># to an X display </span>
<span style="color: #808080;"># Entries in this queue have the following fields in addition to those in : </span>
<span style="color: #808080;"># { </span>
<span style="color: #808080;">#   'processed_image_start_time':  Time when the image was received by the TF process, </span>
<span style="color: #808080;">#   'processed_image_end_time':  Time when the image was processing for bounding boxes </span>
<span style="color: #808080;">#   'boxes': list of detected bounding boxes for the processed image </span>
<span style="color: #808080;">#   'classes': classes of objects, </span>
<span style="color: #808080;">#   'scores': confidence scores, </span>
<span style="color: #808080;"># } </span>
PROCESSED_BOXES_QUEUE = Queue<span class="br0">&#40;</span>QUEUE_MAXSIZE<span class="br0">&#41;</span> 
&nbsp;
<span style="color: #808080;"># Barrier for waiting on Tensorflow processes to start, initialized in main() </span>
TENSORFLOW_PROCESS_BARRIER = <span style="color: #339933;">None</span> 
&nbsp;
COCO_CLASS_DICT = <span class="br0">&#123;</span> 
    <span style="color: #cc66cc;">1</span>: <span style="color: #FF0000;">'person'</span>, 
    <span style="color: #cc66cc;">2</span>: <span style="color: #FF0000;">'bicycle'</span>, 
    <span style="color: #cc66cc;">3</span>: <span style="color: #FF0000;">'car'</span>, 
    <span style="color: #cc66cc;">4</span>: <span style="color: #FF0000;">'motorcycle'</span>, 
    <span style="color: #cc66cc;">5</span>: <span style="color: #FF0000;">'airplane'</span>, 
    <span style="color: #cc66cc;">6</span>: <span style="color: #FF0000;">'bus'</span>, 
    <span style="color: #cc66cc;">7</span>: <span style="color: #FF0000;">'train'</span>, 
    <span style="color: #cc66cc;">8</span>: <span style="color: #FF0000;">'truck'</span>, 
    <span style="color: #cc66cc;">9</span>: <span style="color: #FF0000;">'boat'</span>, 
    <span style="color: #cc66cc;">10</span>: <span style="color: #FF0000;">'trafficlight'</span>, 
    <span style="color: #cc66cc;">11</span>: <span style="color: #FF0000;">'firehydrant'</span>, 
    <span style="color: #cc66cc;">13</span>: <span style="color: #FF0000;">'stopsign'</span>, 
    <span style="color: #cc66cc;">14</span>: <span style="color: #FF0000;">'parkingmeter'</span>, 
    <span style="color: #cc66cc;">15</span>: <span style="color: #FF0000;">'bench'</span>, 
    <span style="color: #cc66cc;">16</span>: <span style="color: #FF0000;">'bird'</span>, 
    <span style="color: #cc66cc;">17</span>: <span style="color: #FF0000;">'cat'</span>, 
    <span style="color: #cc66cc;">18</span>: <span style="color: #FF0000;">'dog'</span>, 
    <span style="color: #cc66cc;">19</span>: <span style="color: #FF0000;">'horse'</span>, 
    <span style="color: #cc66cc;">20</span>: <span style="color: #FF0000;">'sheep'</span>, 
    <span style="color: #cc66cc;">21</span>: <span style="color: #FF0000;">'cow'</span>, 
    <span style="color: #cc66cc;">22</span>: <span style="color: #FF0000;">'elephant'</span>, 
    <span style="color: #cc66cc;">23</span>: <span style="color: #FF0000;">'bear'</span>, 
    <span style="color: #cc66cc;">24</span>: <span style="color: #FF0000;">'zebra'</span>, 
    <span style="color: #cc66cc;">25</span>: <span style="color: #FF0000;">'giraffe'</span>, 
    <span style="color: #cc66cc;">27</span>: <span style="color: #FF0000;">'backpack'</span>, 
    <span style="color: #cc66cc;">28</span>: <span style="color: #FF0000;">'umbrella'</span>, 
    <span style="color: #cc66cc;">31</span>: <span style="color: #FF0000;">'handbag'</span>, 
    <span style="color: #cc66cc;">32</span>: <span style="color: #FF0000;">'tie'</span>, 
    <span style="color: #cc66cc;">33</span>: <span style="color: #FF0000;">'suitcase'</span>, 
    <span style="color: #cc66cc;">34</span>: <span style="color: #FF0000;">'frisbee'</span>, 
    <span style="color: #cc66cc;">35</span>: <span style="color: #FF0000;">'skis'</span>, 
    <span style="color: #cc66cc;">36</span>: <span style="color: #FF0000;">'snowboard'</span>, 
    <span style="color: #cc66cc;">37</span>: <span style="color: #FF0000;">'sportsball'</span>, 
    <span style="color: #cc66cc;">38</span>: <span style="color: #FF0000;">'kite'</span>, 
    <span style="color: #cc66cc;">39</span>: <span style="color: #FF0000;">'baseballbat'</span>, 
    <span style="color: #cc66cc;">40</span>: <span style="color: #FF0000;">'baseballglove'</span>, 
    <span style="color: #cc66cc;">41</span>: <span style="color: #FF0000;">'skateboard'</span>, 
    <span style="color: #cc66cc;">42</span>: <span style="color: #FF0000;">'surfboard'</span>, 
    <span style="color: #cc66cc;">43</span>: <span style="color: #FF0000;">'tennisracket'</span>, 
    <span style="color: #cc66cc;">44</span>: <span style="color: #FF0000;">'bottle'</span>, 
    <span style="color: #cc66cc;">46</span>: <span style="color: #FF0000;">'wineglass'</span>, 
    <span style="color: #cc66cc;">47</span>: <span style="color: #FF0000;">'cup'</span>, 
    <span style="color: #cc66cc;">48</span>: <span style="color: #FF0000;">'fork'</span>, 
    <span style="color: #cc66cc;">49</span>: <span style="color: #FF0000;">'knife'</span>, 
    <span style="color: #cc66cc;">50</span>: <span style="color: #FF0000;">'spoon'</span>, 
    <span style="color: #cc66cc;">51</span>: <span style="color: #FF0000;">'bowl'</span>, 
    <span style="color: #cc66cc;">52</span>: <span style="color: #FF0000;">'banana'</span>, 
    <span style="color: #cc66cc;">53</span>: <span style="color: #FF0000;">'apple'</span>, 
    <span style="color: #cc66cc;">54</span>: <span style="color: #FF0000;">'sandwich'</span>, 
    <span style="color: #cc66cc;">55</span>: <span style="color: #FF0000;">'orange'</span>, 
    <span style="color: #cc66cc;">56</span>: <span style="color: #FF0000;">'broccoli'</span>, 
    <span style="color: #cc66cc;">57</span>: <span style="color: #FF0000;">'carrot'</span>, 
    <span style="color: #cc66cc;">58</span>: <span style="color: #FF0000;">'hotdog'</span>, 
    <span style="color: #cc66cc;">59</span>: <span style="color: #FF0000;">'pizza'</span>, 
    <span style="color: #cc66cc;">60</span>: <span style="color: #FF0000;">'donut'</span>, 
    <span style="color: #cc66cc;">61</span>: <span style="color: #FF0000;">'cake'</span>, 
    <span style="color: #cc66cc;">62</span>: <span style="color: #FF0000;">'chair'</span>, 
    <span style="color: #cc66cc;">63</span>: <span style="color: #FF0000;">'couch'</span>, 
    <span style="color: #cc66cc;">64</span>: <span style="color: #FF0000;">'pottedplant'</span>, 
    <span style="color: #cc66cc;">65</span>: <span style="color: #FF0000;">'bed'</span>, 
    <span style="color: #cc66cc;">67</span>: <span style="color: #FF0000;">'diningtable'</span>, 
    <span style="color: #cc66cc;">70</span>: <span style="color: #FF0000;">'toilet'</span>, 
    <span style="color: #cc66cc;">72</span>: <span style="color: #FF0000;">'tv'</span>, 
    <span style="color: #cc66cc;">73</span>: <span style="color: #FF0000;">'laptop'</span>, 
    <span style="color: #cc66cc;">74</span>: <span style="color: #FF0000;">'mouse'</span>, 
    <span style="color: #cc66cc;">75</span>: <span style="color: #FF0000;">'remote'</span>, 
    <span style="color: #cc66cc;">76</span>: <span style="color: #FF0000;">'keyboard'</span>, 
    <span style="color: #cc66cc;">77</span>: <span style="color: #FF0000;">'cellphone'</span>, 
    <span style="color: #cc66cc;">78</span>: <span style="color: #FF0000;">'microwave'</span>, 
    <span style="color: #cc66cc;">79</span>: <span style="color: #FF0000;">'oven'</span>, 
    <span style="color: #cc66cc;">80</span>: <span style="color: #FF0000;">'toaster'</span>, 
    <span style="color: #cc66cc;">81</span>: <span style="color: #FF0000;">'sink'</span>, 
    <span style="color: #cc66cc;">82</span>: <span style="color: #FF0000;">'refrigerator'</span>, 
    <span style="color: #cc66cc;">84</span>: <span style="color: #FF0000;">'book'</span>, 
    <span style="color: #cc66cc;">85</span>: <span style="color: #FF0000;">'clock'</span>, 
    <span style="color: #cc66cc;">86</span>: <span style="color: #FF0000;">'vase'</span>, 
    <span style="color: #cc66cc;">87</span>: <span style="color: #FF0000;">'scissors'</span>, 
    <span style="color: #cc66cc;">88</span>: <span style="color: #FF0000;">'teddybear'</span>, 
    <span style="color: #cc66cc;">89</span>: <span style="color: #FF0000;">'hairdrier'</span>, 
    <span style="color: #cc66cc;">90</span>: <span style="color: #FF0000;">'toothbrush'</span> 
<span class="br0">&#125;</span> 
&nbsp;
<span style="color: #808080;"># Mapping from visual to depth data </span>
VISUAL_SOURCE_TO_DEPTH_MAP_SOURCE = <span class="br0">&#123;</span> 
    <span style="color: #FF0000;">'frontleft_fisheye_image'</span>: <span style="color: #FF0000;">'frontleft_depth_in_visual_frame'</span>, 
    <span style="color: #FF0000;">'frontright_fisheye_image'</span>: <span style="color: #FF0000;">'frontright_depth_in_visual_frame'</span> 
<span class="br0">&#125;</span> 
ROTATION_ANGLES = <span class="br0">&#123;</span> 
    <span style="color: #FF0000;">'back_fisheye_image'</span>: <span style="color: #cc66cc;">0</span>, 
    <span style="color: #FF0000;">'frontleft_fisheye_image'</span>: -<span style="color: #cc66cc;">78</span>, 
    <span style="color: #FF0000;">'frontright_fisheye_image'</span>: -<span style="color: #cc66cc;">102</span>, 
    <span style="color: #FF0000;">'left_fisheye_image'</span>: <span style="color: #cc66cc;">0</span>, 
    <span style="color: #FF0000;">'right_fisheye_image'</span>: <span style="color: #cc66cc;">180</span> 
<span class="br0">&#125;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> _update_thread<span class="br0">&#40;</span>async_task<span class="br0">&#41;</span>: 
    <span style="color: #0000ff;">while</span> <span style="color: #339933;">True</span>: 
        async_task.update<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        time.sleep<span class="br0">&#40;</span><span style="color: #cc66cc;">0.01</span><span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">class</span> AsyncImage<span class="br0">&#40;</span>AsyncPeriodicQuery<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Grab image.&quot;&quot;&quot;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self, image_client, image_sources<span class="br0">&#41;</span>: 
        <span style="color: #808080;"># Period is set to be about 15 FPS </span>
        super<span class="br0">&#40;</span>AsyncImage, self<span class="br0">&#41;</span>.<span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span><span style="color: #FF0000;">'images'</span>, image_client, LOGGER, period_sec=<span style="color: #cc66cc;">0.067</span><span class="br0">&#41;</span> 
        self.image_sources = image_sources 
&nbsp;
    <span style="color: #0000ff;">def</span> _start_query<span class="br0">&#40;</span>self<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">return</span> self._client.get_image_from_sources_async<span class="br0">&#40;</span>self.image_sources<span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">class</span> AsyncRobotState<span class="br0">&#40;</span>AsyncPeriodicQuery<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Grab robot state.&quot;&quot;&quot;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self, robot_state_client<span class="br0">&#41;</span>: 
        <span style="color: #808080;"># period is set to be about the same rate as detections on the CORE AI </span>
        super<span class="br0">&#40;</span>AsyncRobotState, self<span class="br0">&#41;</span>.<span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span><span style="color: #FF0000;">'robot_state'</span>, robot_state_client, LOGGER, 
                                              period_sec=<span style="color: #cc66cc;">0.02</span><span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> _start_query<span class="br0">&#40;</span>self<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">return</span> self._client.get_robot_state_async<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_source_list<span class="br0">&#40;</span>image_client<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Gets a list of image sources and filters based on config dictionary </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; image_client: Instantiated image client </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
&nbsp;
    <span style="color: #808080;"># We are using only the visual images with their corresponding depth sensors </span>
    sources = image_client.list_image_sources<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    source_list = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
    <span style="color: #0000ff;">for</span> source <span style="color: #0000ff;">in</span> sources: 
        <span style="color: #0000ff;">if</span> source.image_type == ImageSource.IMAGE_TYPE_VISUAL: 
            <span style="color: #808080;"># only append if sensor has corresponding depth sensor </span>
            <span style="color: #0000ff;">if</span> source.name <span style="color: #0000ff;">in</span> VISUAL_SOURCE_TO_DEPTH_MAP_SOURCE: 
                source_list.append<span class="br0">&#40;</span>source.name<span class="br0">&#41;</span> 
                source_list.append<span class="br0">&#40;</span>VISUAL_SOURCE_TO_DEPTH_MAP_SOURCE<span class="br0">&#91;</span>source.name<span class="br0">&#93;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> source_list 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> capture_images<span class="br0">&#40;</span>image_task, sleep_between_capture<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot; Captures images and places them on the queue </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; image_task <span class="br0">&#40;</span>AsyncImage<span class="br0">&#41;</span>: Async task that provides the images response to use </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; sleep_between_capture <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Time to sleep between each image capture </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    <span style="color: #0000ff;">while</span> <span style="color: #0000ff;">not</span> SHUTDOWN_FLAG.value: 
        get_im_resp = image_task.proto 
        start_time = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> get_im_resp: 
            <span style="color: #0000ff;">continue</span> 
        depth_responses = <span class="br0">&#123;</span> 
            img.source.name: img 
            <span style="color: #0000ff;">for</span> img <span style="color: #0000ff;">in</span> get_im_resp 
            <span style="color: #0000ff;">if</span> img.source.image_type == ImageSource.IMAGE_TYPE_DEPTH 
        <span class="br0">&#125;</span> 
        entry = <span class="br0">&#123;</span><span class="br0">&#125;</span> 
        <span style="color: #0000ff;">for</span> im_resp <span style="color: #0000ff;">in</span> get_im_resp: 
            <span style="color: #0000ff;">if</span> im_resp.source.image_type == ImageSource.IMAGE_TYPE_VISUAL: 
                source = im_resp.source.name 
                depth_source = VISUAL_SOURCE_TO_DEPTH_MAP_SOURCE<span class="br0">&#91;</span>source<span class="br0">&#93;</span> 
                depth_image = depth_responses<span class="br0">&#91;</span>depth_source<span class="br0">&#93;</span> 
&nbsp;
                acquisition_time = im_resp.shot.acquisition_time 
                image_time = acquisition_time.seconds + acquisition_time.nanos * <span style="color: #cc66cc;">1e-9</span> 
&nbsp;
                <span style="color: #0000ff;">try</span>: 
                    image = Image.open<span class="br0">&#40;</span>io.BytesIO<span class="br0">&#40;</span>im_resp.shot.image.data<span class="br0">&#41;</span><span class="br0">&#41;</span> 
                    source = im_resp.source.name 
&nbsp;
                    image = ndimage.rotate<span class="br0">&#40;</span>image, ROTATION_ANGLES<span class="br0">&#91;</span>source<span class="br0">&#93;</span><span class="br0">&#41;</span> 
                    <span style="color: #0000ff;">if</span> im_resp.shot.image.pixel_format == image_pb2.Image.PIXEL_FORMAT_GREYSCALE_U8: 
                        image = cv2.cvtColor<span class="br0">&#40;</span>image, cv2.COLOR_GRAY2RGB<span class="br0">&#41;</span>  <span style="color: #808080;"># Converted to RGB for TF </span>
                    tform_snapshot = im_resp.shot.transforms_snapshot 
                    frame_name = im_resp.shot.frame_name_image_sensor 
                    world_tform_cam = get_a_tform_b<span class="br0">&#40;</span>tform_snapshot, VISION_FRAME_NAME, frame_name<span class="br0">&#41;</span> 
                    world_tform_gpe = get_a_tform_b<span class="br0">&#40;</span>tform_snapshot, VISION_FRAME_NAME, 
                                                    GROUND_PLANE_FRAME_NAME<span class="br0">&#41;</span> 
                    entry<span class="br0">&#91;</span>source<span class="br0">&#93;</span> = <span class="br0">&#123;</span> 
                        <span style="color: #FF0000;">'source'</span>: source, 
                        <span style="color: #FF0000;">'world_tform_cam'</span>: world_tform_cam, 
                        <span style="color: #FF0000;">'world_tform_gpe'</span>: world_tform_gpe, 
                        <span style="color: #FF0000;">'raw_image_time'</span>: image_time, 
                        <span style="color: #FF0000;">'cv_image'</span>: image, 
                        <span style="color: #FF0000;">'visual_dims'</span>: <span class="br0">&#40;</span>im_resp.shot.image.cols, im_resp.shot.image.rows<span class="br0">&#41;</span>, 
                        <span style="color: #FF0000;">'depth_image'</span>: depth_image, 
                        <span style="color: #FF0000;">'system_cap_time'</span>: start_time, 
                        <span style="color: #FF0000;">'image_queued_time'</span>: time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
                    <span class="br0">&#125;</span> 
                <span style="color: #0000ff;">except</span> Exception <span style="color: #0000ff;">as</span> exc:  <span style="color: #808080;"># pylint: disable=broad-except </span>
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Exception occurred during image capture {exc}'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">try</span>: 
            RAW_IMAGES_QUEUE.put_nowait<span class="br0">&#40;</span>entry<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> Full <span style="color: #0000ff;">as</span> exc: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'RAW_IMAGES_QUEUE is full: {exc}'</span><span class="br0">&#41;</span> 
        time.sleep<span class="br0">&#40;</span>sleep_between_capture<span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> start_tensorflow_processes<span class="br0">&#40;</span>num_processes, model_path, detection_class, detection_threshold, 
                               max_processing_delay<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Starts Tensorflow processes in parallel. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; It does not keep track of the processes once they are started because they run indefinitely </span>
<span style="color: #FF0000;">&nbsp; &nbsp; and are never joined back to the main process. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; num_processes <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: Number of Tensorflow processes to start in parallel. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; model_path <span class="br0">&#40;</span>str<span class="br0">&#41;</span>: Filepath to the Tensorflow model to use. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; detection_class <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: Detection class to detect </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; detection_threshold <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Detection threshold to apply to all Tensorflow detections. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; max_processing_delay <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Allowed delay before processing an incoming image. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    processes = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
    <span style="color: #0000ff;">for</span> _ <span style="color: #0000ff;">in</span> range<span class="br0">&#40;</span>num_processes<span class="br0">&#41;</span>: 
        process = Process<span class="br0">&#40;</span> 
            target=process_images, args=<span class="br0">&#40;</span> 
                model_path, 
                detection_class, 
                detection_threshold, 
                max_processing_delay, 
            <span class="br0">&#41;</span>, daemon=<span style="color: #339933;">True</span><span class="br0">&#41;</span> 
        process.start<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        processes.append<span class="br0">&#40;</span>process<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> processes 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> process_images<span class="br0">&#40;</span>model_path, detection_class, detection_threshold, max_processing_delay<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Starts Tensorflow and detects objects in the incoming images. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; model_path <span class="br0">&#40;</span>str<span class="br0">&#41;</span>: Filepath to the Tensorflow model to use. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; detection_class <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: Detection class to detect </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; detection_threshold <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Detection threshold to apply to all Tensorflow detections. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; max_processing_delay <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Allowed delay before processing an incoming image. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
&nbsp;
    odapi = DetectorAPI<span class="br0">&#40;</span>path_to_ckpt=model_path<span class="br0">&#41;</span> 
    num_processed_skips = <span style="color: #cc66cc;">0</span> 
&nbsp;
    <span style="color: #0000ff;">if</span> TENSORFLOW_PROCESS_BARRIER <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span>: 
        <span style="color: #0000ff;">return</span> 
&nbsp;
    <span style="color: #0000ff;">try</span>: 
        TENSORFLOW_PROCESS_BARRIER.wait<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">except</span> BrokenBarrierError <span style="color: #0000ff;">as</span> exc: 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Error waiting for Tensorflow processes to initialize: {exc}'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
&nbsp;
    <span style="color: #0000ff;">while</span> <span style="color: #0000ff;">not</span> SHUTDOWN_FLAG.value: 
        <span style="color: #0000ff;">try</span>: 
            entry = RAW_IMAGES_QUEUE.get_nowait<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> Empty: 
            time.sleep<span class="br0">&#40;</span><span style="color: #cc66cc;">0.1</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">continue</span> 
        <span style="color: #0000ff;">for</span> _, capture <span style="color: #0000ff;">in</span> entry.items<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
            start_time = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
            processing_delay = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> - capture<span class="br0">&#91;</span><span style="color: #FF0000;">'raw_image_time'</span><span class="br0">&#93;</span> 
            <span style="color: #0000ff;">if</span> processing_delay &gt; max_processing_delay: 
                num_processed_skips += <span style="color: #cc66cc;">1</span> 
                <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'skipped image because it took {processing_delay}'</span><span class="br0">&#41;</span> 
                <span style="color: #0000ff;">continue</span>  <span style="color: #808080;"># Skip image due to delay </span>
&nbsp;
            image = capture<span class="br0">&#91;</span><span style="color: #FF0000;">'cv_image'</span><span class="br0">&#93;</span> 
            boxes, scores, classes, _ = odapi.process_frame<span class="br0">&#40;</span>image<span class="br0">&#41;</span> 
            confident_boxes = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
            confident_object_classes = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
            confident_scores = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
            <span style="color: #0000ff;">if</span> len<span class="br0">&#40;</span>boxes<span class="br0">&#41;</span> == <span style="color: #cc66cc;">0</span>: 
                <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'no detections founds'</span><span class="br0">&#41;</span> 
                <span style="color: #0000ff;">continue</span> 
            <span style="color: #0000ff;">for</span> box, score, box_class <span style="color: #0000ff;">in</span> sorted<span class="br0">&#40;</span>zip<span class="br0">&#40;</span>boxes, scores, classes<span class="br0">&#41;</span>, key=<span style="color: #0000ff;">lambda</span> x: x<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, 
                                                reverse=<span style="color: #339933;">True</span><span class="br0">&#41;</span>: 
                <span style="color: #0000ff;">if</span> score &gt; detection_threshold <span style="color: #0000ff;">and</span> box_class == detection_class: 
                    confident_boxes.append<span class="br0">&#40;</span>box<span class="br0">&#41;</span> 
                    confident_object_classes.append<span class="br0">&#40;</span>COCO_CLASS_DICT<span class="br0">&#91;</span>box_class<span class="br0">&#93;</span><span class="br0">&#41;</span> 
                    confident_scores.append<span class="br0">&#40;</span>score<span class="br0">&#41;</span> 
                    image = cv2.rectangle<span class="br0">&#40;</span>image, <span class="br0">&#40;</span>box<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, box<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>box<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span>, box<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span><span style="color: #cc66cc;">255</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> 
&nbsp;
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'processed_image_start_time'</span><span class="br0">&#93;</span> = start_time 
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'processed_image_end_time'</span><span class="br0">&#93;</span> = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'boxes'</span><span class="br0">&#93;</span> = confident_boxes 
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'classes'</span><span class="br0">&#93;</span> = confident_object_classes 
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'scores'</span><span class="br0">&#93;</span> = confident_scores 
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'cv_image'</span><span class="br0">&#93;</span> = image 
        <span style="color: #0000ff;">try</span>: 
            PROCESSED_BOXES_QUEUE.put_nowait<span class="br0">&#40;</span>entry<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> Full <span style="color: #0000ff;">as</span> exc: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'PROCESSED_BOXES_QUEUE is full: {exc}'</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'tf process ending'</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> <span style="color: #339933;">True</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_go_to<span class="br0">&#40;</span>world_tform_object, robot_state, mobility_params, dist_margin=<span style="color: #cc66cc;">0.5</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Gets trajectory command to a goal location </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; world_tform_object <span class="br0">&#40;</span>SE3Pose<span class="br0">&#41;</span>: Transform from vision frame to target object </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; robot_state <span class="br0">&#40;</span>RobotState<span class="br0">&#41;</span>: Current robot state </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; mobility_params <span class="br0">&#40;</span>MobilityParams<span class="br0">&#41;</span>: Mobility parameters </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; dist_margin <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Distance margin to target </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    vo_tform_robot = get_vision_tform_body<span class="br0">&#40;</span>robot_state.kinematic_state.transforms_snapshot<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'robot pos: {vo_tform_robot}'</span><span class="br0">&#41;</span> 
    delta_ewrt_vo = np.array<span class="br0">&#40;</span> 
        <span class="br0">&#91;</span>world_tform_object.x - vo_tform_robot.x, world_tform_object.y - vo_tform_robot.y, <span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span> 
    norm = np.linalg.norm<span class="br0">&#40;</span>delta_ewrt_vo<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">if</span> norm == <span style="color: #cc66cc;">0</span>: 
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">None</span> 
    delta_ewrt_vo_norm = delta_ewrt_vo / norm 
    heading = _get_heading<span class="br0">&#40;</span>delta_ewrt_vo_norm<span class="br0">&#41;</span> 
    vo_tform_goal = np.array<span class="br0">&#40;</span><span class="br0">&#91;</span> 
        world_tform_object.x - delta_ewrt_vo_norm<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> * dist_margin, 
        world_tform_object.y - delta_ewrt_vo_norm<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> * dist_margin 
    <span class="br0">&#93;</span><span class="br0">&#41;</span> 
    se2_pose = geo.SE2Pose<span class="br0">&#40;</span>position=geo.Vec2<span class="br0">&#40;</span>x=vo_tform_goal<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, y=vo_tform_goal<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, angle=heading<span class="br0">&#41;</span> 
    tag_cmd = RobotCommandBuilder.synchro_se2_trajectory_command<span class="br0">&#40;</span>se2_pose, 
                                                                 frame_name=VISION_FRAME_NAME, 
                                                                 params=mobility_params<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> tag_cmd 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> _get_heading<span class="br0">&#40;</span>xhat<span class="br0">&#41;</span>: 
    zhat = <span class="br0">&#91;</span><span style="color: #cc66cc;">0.0</span>, <span style="color: #cc66cc;">0.0</span>, <span style="color: #cc66cc;">1.0</span><span class="br0">&#93;</span> 
    yhat = np.cross<span class="br0">&#40;</span>zhat, xhat<span class="br0">&#41;</span> 
    mat = np.array<span class="br0">&#40;</span><span class="br0">&#91;</span>xhat, yhat, zhat<span class="br0">&#93;</span><span class="br0">&#41;</span>.transpose<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> Quat.from_matrix<span class="br0">&#40;</span>mat<span class="br0">&#41;</span>.to_yaw<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> set_default_body_control<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Set default body control params to current body position&quot;&quot;&quot;</span> 
    footprint_R_body = geometry.EulerZXY<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    position = geo.Vec3<span class="br0">&#40;</span>x=<span style="color: #cc66cc;">0.0</span>, y=<span style="color: #cc66cc;">0.0</span>, z=<span style="color: #cc66cc;">0.0</span><span class="br0">&#41;</span> 
    rotation = footprint_R_body.to_quaternion<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    pose = geo.SE3Pose<span class="br0">&#40;</span>position=position, rotation=rotation<span class="br0">&#41;</span> 
    point = trajectory_pb2.SE3TrajectoryPoint<span class="br0">&#40;</span>pose=pose<span class="br0">&#41;</span> 
    traj = trajectory_pb2.SE3Trajectory<span class="br0">&#40;</span>points=<span class="br0">&#91;</span>point<span class="br0">&#93;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> spot_command_pb2.BodyControlParams<span class="br0">&#40;</span>base_offset_rt_footprint=traj<span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_mobility_params<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Gets mobility parameters for following&quot;&quot;&quot;</span> 
    vel_desired = <span style="color: #cc66cc;">.75</span> 
    speed_limit = geo.SE2VelocityLimit<span class="br0">&#40;</span> 
        max_vel=geo.SE2Velocity<span class="br0">&#40;</span>linear=geo.Vec2<span class="br0">&#40;</span>x=vel_desired, y=vel_desired<span class="br0">&#41;</span>, angular=<span style="color: #cc66cc;">.25</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    body_control = set_default_body_control<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    mobility_params = spot_command_pb2.MobilityParams<span class="br0">&#40;</span>vel_limit=speed_limit, obstacle_params=<span style="color: #339933;">None</span>, 
                                                      body_control=body_control, 
                                                      locomotion_hint=spot_command_pb2.HINT_TROT<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> mobility_params 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> depth_to_xyz<span class="br0">&#40;</span>depth, pixel_x, pixel_y, focal_length, principal_point<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Calculate the transform to point in image using camera intrinsics and depth&quot;&quot;&quot;</span> 
    x = depth * <span class="br0">&#40;</span>pixel_x - principal_point.x<span class="br0">&#41;</span> / focal_length.x 
    y = depth * <span class="br0">&#40;</span>pixel_y - principal_point.y<span class="br0">&#41;</span> / focal_length.y 
    z = depth 
    <span style="color: #0000ff;">return</span> x, y, z 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> remove_ground_from_depth_image<span class="br0">&#40;</span>raw_depth_image, focal_length, principal_point, world_tform_cam, 
                                   world_tform_gpe, ground_tolerance=<span style="color: #cc66cc;">0.04</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot; Simple ground plane removal algorithm. Uses ground height </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; and does simple z distance filtering. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; raw_depth_image <span class="br0">&#40;</span>np.array<span class="br0">&#41;</span>: Depth image </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; focal_length <span class="br0">&#40;</span>Vec2<span class="br0">&#41;</span>: Focal length of camera that produced the depth image </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; principal_point <span class="br0">&#40;</span>Vec2<span class="br0">&#41;</span>: Principal point of camera that produced the depth image </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; world_tform_cam <span class="br0">&#40;</span>SE3Pose<span class="br0">&#41;</span>: Transform from VO to camera frame </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; world_tform_gpe <span class="br0">&#40;</span>SE3Pose<span class="br0">&#41;</span>: Transform from VO to GPE frame </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; ground_tolerance <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Distance in meters to add to the ground plane </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    new_depth_image = raw_depth_image 
&nbsp;
    <span style="color: #808080;"># same functions as depth_to_xyz, but converted to np functions </span>
    indices = np.indices<span class="br0">&#40;</span>raw_depth_image.shape<span class="br0">&#41;</span> 
    xs = raw_depth_image * <span class="br0">&#40;</span>indices<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> - principal_point.x<span class="br0">&#41;</span> / focal_length.x 
    ys = raw_depth_image * <span class="br0">&#40;</span>indices<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> - principal_point.y<span class="br0">&#41;</span> / focal_length.y 
    zs = raw_depth_image 
&nbsp;
    <span style="color: #808080;"># create xyz point cloud </span>
    camera_tform_points = np.stack<span class="br0">&#40;</span><span class="br0">&#91;</span>xs, ys, zs<span class="br0">&#93;</span>, axis=<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> 
    <span style="color: #808080;"># points in VO frame </span>
    world_tform_points = world_tform_cam.transform_cloud<span class="br0">&#40;</span>camera_tform_points<span class="br0">&#41;</span> 
    <span style="color: #808080;"># array of booleans where True means the point was below the ground plane plus tolerance </span>
    world_tform_points_mask = <span class="br0">&#40;</span>world_tform_gpe.z - world_tform_points<span class="br0">&#91;</span>:, :, <span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &lt; ground_tolerance 
    <span style="color: #808080;"># remove data below ground plane </span>
    new_depth_image<span class="br0">&#91;</span>world_tform_points_mask<span class="br0">&#93;</span> = <span style="color: #cc66cc;">0</span> 
    <span style="color: #0000ff;">return</span> new_depth_image 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_distance_to_closest_object_depth<span class="br0">&#40;</span>x_min, x_max, y_min, y_max, depth_scale, raw_depth_image, 
                                         histogram_bin_size=<span style="color: #cc66cc;">0.50</span>, minimum_number_of_points=<span style="color: #cc66cc;">10</span>, 
                                         max_distance=<span style="color: #cc66cc;">8.0</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Make a histogram of distances to points in the cloud and take the closest distance with </span>
<span style="color: #FF0000;">&nbsp; &nbsp; enough points. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; x_min <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: minimum x coordinate <span class="br0">&#40;</span>column<span class="br0">&#41;</span> of object to find </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; x_max <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: maximum x coordinate <span class="br0">&#40;</span>column<span class="br0">&#41;</span> of object to find </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; y_min <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: minimum y coordinate <span class="br0">&#40;</span>row<span class="br0">&#41;</span> of object to find </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; y_max <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: maximum y coordinate <span class="br0">&#40;</span>row<span class="br0">&#41;</span> of object to find </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; depth_scale <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: depth scale of the image to convert from sensor value to meters </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; raw_depth_image <span class="br0">&#40;</span>np.array<span class="br0">&#41;</span>: matrix of depth pixels </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; histogram_bin_size <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: size of each bin of distances </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; minimum_number_of_points <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: minimum number of points before returning depth </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; max_distance <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: maximum distance to object in meters </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    num_bins = math.ceil<span class="br0">&#40;</span>max_distance / histogram_bin_size<span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #808080;"># get a sub-rectangle of the bounding box out of the whole image, then flatten </span>
    obj_depths = <span class="br0">&#40;</span>raw_depth_image<span class="br0">&#91;</span>y_min:y_max, x_min:x_max<span class="br0">&#93;</span><span class="br0">&#41;</span>.flatten<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    obj_depths = obj_depths / depth_scale 
    obj_depths = obj_depths<span class="br0">&#91;</span>obj_depths != <span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> 
&nbsp;
    hist, hist_edges = np.histogram<span class="br0">&#40;</span>obj_depths, bins=num_bins, range=<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, max_distance<span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
    edges_zipped = zip<span class="br0">&#40;</span>hist_edges<span class="br0">&#91;</span>:-<span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, hist_edges<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span>:<span class="br0">&#93;</span><span class="br0">&#41;</span> 
    <span style="color: #808080;"># Iterate over the histogram and return the first distance with enough points. </span>
    <span style="color: #0000ff;">for</span> entry, edges <span style="color: #0000ff;">in</span> zip<span class="br0">&#40;</span>hist, edges_zipped<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">if</span> entry &gt; minimum_number_of_points: 
            filtered_depths = obj_depths<span class="br0">&#91;</span><span class="br0">&#40;</span>obj_depths &gt; edges<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &amp; <span class="br0">&#40;</span>obj_depths &lt; edges<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> 
            <span style="color: #0000ff;">if</span> len<span class="br0">&#40;</span>filtered_depths<span class="br0">&#41;</span> == <span style="color: #cc66cc;">0</span>: 
                <span style="color: #0000ff;">continue</span> 
            <span style="color: #0000ff;">return</span> np.mean<span class="br0">&#40;</span>filtered_depths<span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #0000ff;">return</span> max_distance 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> rotate_about_origin_degrees<span class="br0">&#40;</span>origin, point, angle<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Rotate a point counterclockwise by a given angle around a given origin. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; origin <span class="br0">&#40;</span>tuple<span class="br0">&#41;</span>: Origin to rotate the point around </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; point <span class="br0">&#40;</span>tuple<span class="br0">&#41;</span>: Point to rotate </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; angle <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Angle in degrees </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    <span style="color: #0000ff;">return</span> rotate_about_origin<span class="br0">&#40;</span>origin, point, math.radians<span class="br0">&#40;</span>angle<span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> rotate_about_origin<span class="br0">&#40;</span>origin, point, angle<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Rotate a point counterclockwise by a given angle around a given origin. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; origin <span class="br0">&#40;</span>tuple<span class="br0">&#41;</span>: Origin to rotate the point around </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; point <span class="br0">&#40;</span>tuple<span class="br0">&#41;</span>: Point to rotate </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; angle <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Angle in radians </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    orig_x, orig_y = origin 
    pnt_x, pnt_y = point 
&nbsp;
    ret_x = orig_x + math.cos<span class="br0">&#40;</span>angle<span class="br0">&#41;</span> * <span class="br0">&#40;</span>pnt_x - orig_x<span class="br0">&#41;</span> - math.sin<span class="br0">&#40;</span>angle<span class="br0">&#41;</span> * <span class="br0">&#40;</span>pnt_y - orig_y<span class="br0">&#41;</span> 
    ret_y = orig_y + math.sin<span class="br0">&#40;</span>angle<span class="br0">&#41;</span> * <span class="br0">&#40;</span>pnt_x - orig_x<span class="br0">&#41;</span> + math.cos<span class="br0">&#40;</span>angle<span class="br0">&#41;</span> * <span class="br0">&#40;</span>pnt_y - orig_y<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> int<span class="br0">&#40;</span>ret_x<span class="br0">&#41;</span>, int<span class="br0">&#40;</span>ret_y<span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_object_position<span class="br0">&#40;</span>world_tform_cam, world_tform_gpe, visual_dims, depth_image, bounding_box, 
                        rotation_angle<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Extract the bounding box, then find the mode in that region. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; world_tform_cam <span class="br0">&#40;</span>SE3Pose<span class="br0">&#41;</span>: SE3 transform from world to camera frame </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; visual_dims <span class="br0">&#40;</span>Tuple<span class="br0">&#41;</span>: <span class="br0">&#40;</span>cols, rows<span class="br0">&#41;</span> tuple from the visual image </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; depth_image <span class="br0">&#40;</span>ImageResponse<span class="br0">&#41;</span>: From a depth camera corresponding to the visual_image </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; bounding_box <span class="br0">&#40;</span>list<span class="br0">&#41;</span>: Bounding box from tensorflow </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; rotation_angle <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Angle <span class="br0">&#40;</span>in degrees<span class="br0">&#41;</span> to rotate depth image to match cam image rotation </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
&nbsp;
    <span style="color: #808080;"># Make sure there are two images. </span>
    <span style="color: #0000ff;">if</span> visual_dims <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span> <span style="color: #0000ff;">or</span> depth_image <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span>: 
        <span style="color: #808080;"># Fail. </span>
        <span style="color: #0000ff;">return</span> 
&nbsp;
    <span style="color: #808080;"># Rotate bounding box back to original frame </span>
    points = <span class="br0">&#91;</span><span class="br0">&#40;</span>bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span>, bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, 
              <span class="br0">&#40;</span>bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span>, bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> 
&nbsp;
    origin = <span class="br0">&#40;</span>visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> / <span style="color: #cc66cc;">2</span>, visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> / <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> 
&nbsp;
    points_rot = <span class="br0">&#91;</span>rotate_about_origin_degrees<span class="br0">&#40;</span>origin, point, rotation_angle<span class="br0">&#41;</span> <span style="color: #0000ff;">for</span> point <span style="color: #0000ff;">in</span> points<span class="br0">&#93;</span> 
&nbsp;
    <span style="color: #808080;"># Get the bounding box corners. </span>
    y_min = max<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, min<span class="br0">&#40;</span><span class="br0">&#91;</span>point<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> <span style="color: #0000ff;">for</span> point <span style="color: #0000ff;">in</span> points_rot<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    x_min = max<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, min<span class="br0">&#40;</span><span class="br0">&#91;</span>point<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> <span style="color: #0000ff;">for</span> point <span style="color: #0000ff;">in</span> points_rot<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    y_max = min<span class="br0">&#40;</span>visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, max<span class="br0">&#40;</span><span class="br0">&#91;</span>point<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> <span style="color: #0000ff;">for</span> point <span style="color: #0000ff;">in</span> points_rot<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    x_max = min<span class="br0">&#40;</span>visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, max<span class="br0">&#40;</span><span class="br0">&#91;</span>point<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> <span style="color: #0000ff;">for</span> point <span style="color: #0000ff;">in</span> points_rot<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #808080;"># Check that the bounding box is valid. </span>
    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>x_min &lt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">or</span> y_min &lt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">or</span> x_max &gt; visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> <span style="color: #0000ff;">or</span> y_max &gt; visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Bounding box is invalid: ({x_min}, {y_min}) | ({x_max}, {y_max})'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Bounds: ({visual_dims[0]}, {visual_dims[1]})'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">return</span> 
&nbsp;
    <span style="color: #808080;"># Unpack the images. </span>
    <span style="color: #0000ff;">try</span>: 
        <span style="color: #0000ff;">if</span> depth_image.shot.image.pixel_format == image_pb2.Image.PIXEL_FORMAT_DEPTH_U16: 
            dtype = np.uint16 
        <span style="color: #0000ff;">else</span>: 
            dtype = np.uint8 
        img = np.fromstring<span class="br0">&#40;</span>depth_image.shot.image.data, dtype=dtype<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">if</span> depth_image.shot.image.format == image_pb2.Image.FORMAT_RAW: 
            img = img.reshape<span class="br0">&#40;</span>depth_image.shot.image.rows, depth_image.shot.image.cols<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">else</span>: 
            img = cv2.imdecode<span class="br0">&#40;</span>img, -<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> 
        depth_image_pixels = img 
        depth_image_pixels = remove_ground_from_depth_image<span class="br0">&#40;</span> 
            depth_image_pixels, depth_image.source.pinhole.intrinsics.focal_length, 
            depth_image.source.pinhole.intrinsics.principal_point, world_tform_cam, world_tform_gpe<span class="br0">&#41;</span> 
        <span style="color: #808080;"># Get the depth data from the region in the bounding box. </span>
        max_distance = <span style="color: #cc66cc;">8.0</span> 
        depth = get_distance_to_closest_object_depth<span class="br0">&#40;</span>x_min, x_max, y_min, y_max, 
                                                     depth_image.source.depth_scale, 
                                                     depth_image_pixels, max_distance=max_distance<span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #0000ff;">if</span> depth &gt;= max_distance: 
            <span style="color: #808080;"># Not enough depth data. </span>
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Not enough depth data.'</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
        <span style="color: #0000ff;">else</span>: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'distance to object: {depth}'</span><span class="br0">&#41;</span> 
&nbsp;
        center_x = round<span class="br0">&#40;</span><span class="br0">&#40;</span>x_max - x_min<span class="br0">&#41;</span> / <span style="color: #cc66cc;">2.0</span> + x_min<span class="br0">&#41;</span> 
        center_y = round<span class="br0">&#40;</span><span class="br0">&#40;</span>y_max - y_min<span class="br0">&#41;</span> / <span style="color: #cc66cc;">2.0</span> + y_min<span class="br0">&#41;</span> 
&nbsp;
        tform_x, tform_y, tform_z = depth_to_xyz<span class="br0">&#40;</span> 
            depth, center_x, center_y, depth_image.source.pinhole.intrinsics.focal_length, 
            depth_image.source.pinhole.intrinsics.principal_point<span class="br0">&#41;</span> 
        camera_tform_obj = SE3Pose<span class="br0">&#40;</span>tform_x, tform_y, tform_z, Quat<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #0000ff;">return</span> world_tform_cam * camera_tform_obj 
    <span style="color: #0000ff;">except</span> Exception <span style="color: #0000ff;">as</span> exc:  <span style="color: #808080;"># pylint: disable=broad-except </span>
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Error getting object position: {exc}'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">return</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> _check_model_path<span class="br0">&#40;</span>model_path<span class="br0">&#41;</span>: 
    <span style="color: #0000ff;">if</span> model_path <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span> <span style="color: #0000ff;">or</span> \ 
    <span style="color: #0000ff;">not</span> os.path.exists<span class="br0">&#40;</span>model_path<span class="br0">&#41;</span> <span style="color: #0000ff;">or</span> \ 
    <span style="color: #0000ff;">not</span> os.path.isfile<span class="br0">&#40;</span>model_path<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'ERROR, could not find model file {model_path}'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
    <span style="color: #0000ff;">return</span> <span style="color: #339933;">True</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> _check_and_load_json_classes<span class="br0">&#40;</span>config_path<span class="br0">&#41;</span>: 
    <span style="color: #0000ff;">if</span> os.path.isfile<span class="br0">&#40;</span>config_path<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">with</span> open<span class="br0">&#40;</span>config_path<span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> json_classes: 
            <span style="color: #0000ff;">global</span> COCO_CLASS_DICT  <span style="color: #808080;"># pylint: disable=global-statement </span>
            COCO_CLASS_DICT = json.load<span class="br0">&#40;</span>json_classes<span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> _find_highest_conf_source<span class="br0">&#40;</span>processed_boxes_entry<span class="br0">&#41;</span>: 
    highest_conf_source = <span style="color: #339933;">None</span> 
    max_score = <span style="color: #cc66cc;">0</span> 
    <span style="color: #0000ff;">for</span> key, capture <span style="color: #0000ff;">in</span> processed_boxes_entry.items<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">if</span> <span style="color: #FF0000;">'scores'</span> <span style="color: #0000ff;">in</span> capture.keys<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
            <span style="color: #0000ff;">if</span> len<span class="br0">&#40;</span>capture<span class="br0">&#91;</span><span style="color: #FF0000;">'scores'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">and</span> capture<span class="br0">&#91;</span><span style="color: #FF0000;">'scores'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> &gt; max_score: 
                highest_conf_source = key 
                max_score = capture<span class="br0">&#91;</span><span style="color: #FF0000;">'scores'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> 
    <span style="color: #0000ff;">return</span> highest_conf_source 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> signal_handler<span class="br0">&#40;</span>signal, frame<span class="br0">&#41;</span>: 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Interrupt caught, shutting down'</span><span class="br0">&#41;</span> 
    SHUTDOWN_FLAG.value = <span style="color: #cc66cc;">1</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Command line interface.&quot;&quot;&quot;</span> 
&nbsp;
    parser = argparse.ArgumentParser<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span> 
        <span style="color: #FF0000;">'--model-path'</span>, default=<span style="color: #FF0000;">'/model.pb'</span>, help= 
        <span class="br0">&#40;</span><span style="color: #FF0000;">'Local file path to the Tensorflow model, example pre-trained models can be found at '</span> 
         <span style="color: #FF0000;">'https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md'</span> 
        <span class="br0">&#41;</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span><span style="color: #FF0000;">'--classes'</span>, default=<span style="color: #FF0000;">'/classes.json'</span>, type=str, 
                        help=<span style="color: #FF0000;">'File containing json mapping of object class IDs to class names'</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span><span style="color: #FF0000;">'--number-tensorflow-processes'</span>, default=<span style="color: #cc66cc;">1</span>, type=int, 
                        help=<span style="color: #FF0000;">'Number of Tensorflow processes to run in parallel'</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span><span style="color: #FF0000;">'--detection-threshold'</span>, default=<span style="color: #cc66cc;">0.7</span>, type=float, 
                        help=<span style="color: #FF0000;">'Detection threshold to use for Tensorflow detections'</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span> 
        <span style="color: #FF0000;">'--sleep-between-capture'</span>, default=<span style="color: #cc66cc;">0.2</span>, type=float, 
        help=<span class="br0">&#40;</span><span style="color: #FF0000;">'Seconds to sleep between each image capture loop iteration, which captures '</span> 
              <span style="color: #FF0000;">'an image from all cameras'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span> 
        <span style="color: #FF0000;">'--detection-class'</span>, default=<span style="color: #cc66cc;">1</span>, type=int, 
        help=<span class="br0">&#40;</span><span style="color: #FF0000;">'Detection classes to use in the Tensorflow model.'</span> 
              <span style="color: #FF0000;">'Default is to use 1, which is a person in the Coco dataset'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span> 
        <span style="color: #FF0000;">'--max-processing-delay'</span>, default=<span style="color: #cc66cc;">7.0</span>, type=float, 
        help=<span class="br0">&#40;</span><span style="color: #FF0000;">'Maximum allowed delay for processing an image. '</span> 
              <span style="color: #FF0000;">'Any image older than this value will be skipped'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span><span style="color: #FF0000;">'--test-mode'</span>, action=<span style="color: #FF0000;">'store_true'</span>, 
                        help=<span style="color: #FF0000;">'Run application in test mode, don<span style="color: #800000;">\'</span>t execute commands'</span><span class="br0">&#41;</span> 
&nbsp;
    bosdyn.client.util.add_base_arguments<span class="br0">&#40;</span>parser<span class="br0">&#41;</span> 
    bosdyn.client.util.add_payload_credentials_arguments<span class="br0">&#40;</span>parser<span class="br0">&#41;</span> 
    options = parser.parse_args<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    signal.signal<span class="br0">&#40;</span>signal.SIGINT, signal_handler<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">try</span>: 
        <span style="color: #808080;"># Make sure the model path is a valid file </span>
        <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> _check_model_path<span class="br0">&#40;</span>options.model_path<span class="br0">&#41;</span>: 
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
&nbsp;
        <span style="color: #808080;"># Check for classes json file, otherwise use the COCO class dictionary </span>
        _check_and_load_json_classes<span class="br0">&#40;</span>options.classes<span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #0000ff;">global</span> TENSORFLOW_PROCESS_BARRIER  <span style="color: #808080;"># pylint: disable=global-statement </span>
        TENSORFLOW_PROCESS_BARRIER = Barrier<span class="br0">&#40;</span>options.number_tensorflow_processes + <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> 
        <span style="color: #808080;"># Start Tensorflow processes </span>
        tf_processes = start_tensorflow_processes<span class="br0">&#40;</span>options.number_tensorflow_processes, 
                                                  options.model_path, options.detection_class, 
                                                  options.detection_threshold, 
                                                  options.max_processing_delay<span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># sleep to give the Tensorflow processes time to initialize </span>
        <span style="color: #0000ff;">try</span>: 
            TENSORFLOW_PROCESS_BARRIER.wait<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> BrokenBarrierError <span style="color: #0000ff;">as</span> exc: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Error waiting for Tensorflow processes to initialize: {exc}'</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
        <span style="color: #808080;"># Start the API related things </span>
&nbsp;
        <span style="color: #808080;"># Create robot object with a world object client </span>
        sdk = bosdyn.client.create_standard_sdk<span class="br0">&#40;</span><span style="color: #FF0000;">'SpotFollowClient'</span><span class="br0">&#41;</span> 
        robot = sdk.create_robot<span class="br0">&#40;</span>options.hostname<span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #0000ff;">if</span> options.payload_credentials_file: 
            robot.authenticate_from_payload_credentials<span class="br0">&#40;</span> 
                *bosdyn.client.util.get_guid_and_secret<span class="br0">&#40;</span>options<span class="br0">&#41;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">else</span>: 
            bosdyn.client.util.authenticate<span class="br0">&#40;</span>robot<span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># Time sync is necessary so that time-based filter requests can be converted </span>
        robot.time_sync.wait_for_sync<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># Verify the robot is not estopped and that an external application has registered and holds </span>
        <span style="color: #808080;"># an estop endpoint. </span>
        <span style="color: #0000ff;">assert</span> <span style="color: #0000ff;">not</span> robot.is_estopped<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'Robot is estopped. Please use an external E-Stop client,'</span> \ 
                                        <span style="color: #FF0000;">' such as the estop SDK example, to configure E-Stop.'</span> 
&nbsp;
        <span style="color: #808080;"># Create the sdk clients </span>
        robot_state_client = robot.ensure_client<span class="br0">&#40;</span>RobotStateClient.default_service_name<span class="br0">&#41;</span> 
        robot_command_client = robot.ensure_client<span class="br0">&#40;</span>RobotCommandClient.default_service_name<span class="br0">&#41;</span> 
        lease_client = robot.ensure_client<span class="br0">&#40;</span>LeaseClient.default_service_name<span class="br0">&#41;</span> 
        image_client = robot.ensure_client<span class="br0">&#40;</span>ImageClient.default_service_name<span class="br0">&#41;</span> 
        source_list = get_source_list<span class="br0">&#40;</span>image_client<span class="br0">&#41;</span> 
        image_task = AsyncImage<span class="br0">&#40;</span>image_client, source_list<span class="br0">&#41;</span> 
        robot_state_task = AsyncRobotState<span class="br0">&#40;</span>robot_state_client<span class="br0">&#41;</span> 
        task_list = <span class="br0">&#91;</span>image_task, robot_state_task<span class="br0">&#93;</span> 
        _async_tasks = AsyncTasks<span class="br0">&#40;</span>task_list<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Detect and follow client connected.'</span><span class="br0">&#41;</span> 
&nbsp;
        lease = lease_client.take<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        lease_keep = LeaseKeepAlive<span class="br0">&#40;</span>lease_client<span class="br0">&#41;</span> 
        <span style="color: #808080;"># Power on the robot and stand it up </span>
        resp = robot.power_on<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">try</span>: 
            blocking_stand<span class="br0">&#40;</span>robot_command_client<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> CommandFailedError <span style="color: #0000ff;">as</span> exc: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Error ({exc}) occurred while trying to stand. Check robot surroundings.'</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
        <span style="color: #0000ff;">except</span> CommandTimedOutError <span style="color: #0000ff;">as</span> exc: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Stand command timed out: {exc}'</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Robot powered on and standing.'</span><span class="br0">&#41;</span> 
        params_set = get_mobility_params<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># This thread starts the async tasks for image and robot state retrieval </span>
        update_thread = Thread<span class="br0">&#40;</span>target=_update_thread, args=<span class="br0">&#91;</span>_async_tasks<span class="br0">&#93;</span><span class="br0">&#41;</span> 
        update_thread.daemon = <span style="color: #339933;">True</span> 
        update_thread.start<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #808080;"># Wait for the first responses. </span>
        <span style="color: #0000ff;">while</span> any<span class="br0">&#40;</span>task.proto <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span> <span style="color: #0000ff;">for</span> task <span style="color: #0000ff;">in</span> task_list<span class="br0">&#41;</span>: 
            time.sleep<span class="br0">&#40;</span><span style="color: #cc66cc;">0.1</span><span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># Start image capture process </span>
        image_capture_thread = Process<span class="br0">&#40;</span>target=capture_images, 
                                       args=<span class="br0">&#40;</span>image_task, options.sleep_between_capture<span class="br0">&#41;</span>, 
                                       daemon=<span style="color: #339933;">True</span><span class="br0">&#41;</span> 
        image_capture_thread.start<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">while</span> <span style="color: #0000ff;">not</span> SHUTDOWN_FLAG.value: 
            <span style="color: #808080;"># This comes from the tensorflow processes and limits the rate of this loop </span>
            <span style="color: #0000ff;">try</span>: 
                entry = PROCESSED_BOXES_QUEUE.get_nowait<span class="br0">&#40;</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">except</span> Empty: 
                <span style="color: #0000ff;">continue</span> 
            <span style="color: #808080;"># find the highest confidence bounding box </span>
            highest_conf_source = _find_highest_conf_source<span class="br0">&#40;</span>entry<span class="br0">&#41;</span> 
            <span style="color: #0000ff;">if</span> highest_conf_source <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span>: 
                <span style="color: #808080;"># no boxes or scores found </span>
                <span style="color: #0000ff;">continue</span> 
            capture_to_use = entry<span class="br0">&#91;</span>highest_conf_source<span class="br0">&#93;</span> 
            raw_time = capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'raw_image_time'</span><span class="br0">&#93;</span> 
            time_gap = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> - raw_time 
            <span style="color: #0000ff;">if</span> time_gap &gt; options.max_processing_delay: 
                <span style="color: #0000ff;">continue</span>  <span style="color: #808080;"># Skip image due to delay </span>
&nbsp;
            <span style="color: #808080;"># Find the transform to the highest confidence object using the depth sensor </span>
            get_object_position_start = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
            robot_state = robot_state_task.proto 
            world_tform_gpe = get_a_tform_b<span class="br0">&#40;</span>robot_state.kinematic_state.transforms_snapshot, 
                                            VISION_FRAME_NAME, GROUND_PLANE_FRAME_NAME<span class="br0">&#41;</span> 
            world_tform_object = get_object_position<span class="br0">&#40;</span> 
                capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'world_tform_cam'</span><span class="br0">&#93;</span>, world_tform_gpe, capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'visual_dims'</span><span class="br0">&#93;</span>, 
                capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'depth_image'</span><span class="br0">&#93;</span>, capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'boxes'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, 
                ROTATION_ANGLES<span class="br0">&#91;</span>capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'source'</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> 
            get_object_position_end = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'system_cap_time: {capture_to_use[&quot;system_cap_time&quot;]}, '</span> 
                  f<span style="color: #FF0000;">'image_queued_time: {capture_to_use[&quot;image_queued_time&quot;]}, '</span> 
                  f<span style="color: #FF0000;">'processed_image_start_time: {capture_to_use[&quot;processed_image_start_time&quot;]}, '</span> 
                  f<span style="color: #FF0000;">'processed_image_end_time: {capture_to_use[&quot;processed_image_end_time&quot;]}, '</span> 
                  f<span style="color: #FF0000;">'get_object_position_start_time: {get_object_position_start}, '</span> 
                  f<span style="color: #FF0000;">'get_object_position_end_time: {get_object_position_end}, '</span><span class="br0">&#41;</span> 
&nbsp;
            <span style="color: #808080;"># get_object_position can fail if there is insufficient depth sensor information </span>
            <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> world_tform_object: 
                <span style="color: #0000ff;">continue</span> 
&nbsp;
            scores = capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'scores'</span><span class="br0">&#93;</span> 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Position of object with confidence {scores[0]}: {world_tform_object}'</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Process latency: {time.time() - capture_to_use[&quot;system_cap_time&quot;]}'</span><span class="br0">&#41;</span> 
            tag_cmd = get_go_to<span class="br0">&#40;</span>world_tform_object, robot_state, params_set<span class="br0">&#41;</span> 
            end_time = <span style="color: #cc66cc;">15.0</span> 
            <span style="color: #0000ff;">if</span> tag_cmd <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #339933;">None</span>: 
                <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> options.test_mode: 
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'executing command'</span><span class="br0">&#41;</span> 
                    robot_command_client.robot_command<span class="br0">&#40;</span>lease=<span style="color: #339933;">None</span>, command=tag_cmd, 
                                                       end_time_secs=time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> + end_time<span class="br0">&#41;</span> 
                <span style="color: #0000ff;">else</span>: 
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Running in test mode, skipping command.'</span><span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># Shutdown lease keep-alive and return lease gracefully. </span>
        lease_keep.shutdown<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        lease_client.return_lease<span class="br0">&#40;</span>lease<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">True</span> 
    <span style="color: #0000ff;">except</span> Exception <span style="color: #0000ff;">as</span> exc:  <span style="color: #808080;"># pylint: disable=broad-except </span>
        LOGGER.error<span class="br0">&#40;</span><span style="color: #FF0000;">'Spot Tensorflow Detector threw an exception: %s'</span>, exc<span class="br0">&#41;</span> 
        <span style="color: #808080;"># Shutdown lease keep-alive and return lease gracefully. </span>
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span>  
&nbsp;
&nbsp;
<span style="color: #0000ff;">if</span> <span style="color: #0080ff;">__name__</span> == <span style="color: #FF0000;">'__main__'</span>: 
    <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
        sys.exit<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#93;</span></pre></td></tr></table></code><hr />
</div><br />
De plus, leur capacité à naviguer de manière autonome dans des décombres instables (séismes, usines chimiques en feu) pour extraire des blessés ou couper des vannes là où des robots sur roues échoueraient est susceptible d’aider dans les cas de gestion des catastrophes et le secours.<br />
<br />
Ces derniers peuvent aussi être utiles pour l’inspection de sous-stations électriques à haute tension ou d'infrastructures à risques sans aucune téléopération humaine.<br />
<br />
 <blockquote class="twitter-tweet"><p lang="en" dir="ltr">A humanoid robot appears to fight back after a customer pushes it inside a Russian technology store. &#129302;<a rel="nofollow" href="https://x.com/hashtag/Tech?src=hash&amp;ref_src=twsrc%5Etfw">#Tech</a> <a rel="nofollow" href="https://x.com/hashtag/Robotics?src=hash&amp;ref_src=twsrc%5Etfw">#Robotics</a> <a rel="nofollow" href="https://t.co/l48vfgThCI">pic.twitter.com/l48vfgThCI</a></p>&mdash; &quot;Pulse&quot; by Shams TV (@PulseInDc) <a rel="nofollow" href="https://x.com/PulseInDc/status/2097743336203235713?ref_src=twsrc%5Etfw">September 9, 2026</a></blockquote>  <b><font size="3">La disponibilité de ces robots vient avec son lot d’inconvénients dont des menaces pour l’humanité à anticiper sur le long terme</font></b><br />
<br />
Les lois de la guerre exigent de distinguer un civil d'un combattant, ou de repérer un soldat qui se rend. Une intelligence artificielle, privée d'empathie et de compréhension fine du contexte humain, pourrait abattre des personnes hors de combat ou des civils par simple erreur d'interprétation algorithmique. C’est ce qu’on a pu constater avec le récent cas <a href="https://intelligence-artificielle.developpez.com/actu/386422/Un-drone-entierement-pilote-par-l-IA-tue-3-Ukrainiens-Cette-attaque-menee-selon-l-Ukraine-par-un-drone-russe-equipe-d-une-puce-Nvidia-presage-d-un-avenir-dystopique-ou-les-robots-extermineront-le" target="_blank">de drones ukrainiens qui ont provoqué la mort de 3 personnes en raison d’une erreur logicielle</a>. <br />
<br />
Un modèle d'intelligence artificielle militaire entraîné à se battre de manière autonome pourrait voir ses barrières de sécurité contournées. Si le système redéfinit ses critères d'optimisation ou si sa base de données est corrompue (par piratage ou mutation algorithmique), la machine pourrait retourner ses capacités physiques létales contre ses propres créateurs ou contre des populations civiles.<br />
<br />
Avec l'effondrement des coûts de fabrication des humanoïdes (certains prototypes universitaires chinois s'achetant désormais à moins de 1500 €), des architectures logicielles de combat open-source pourraient être récupérées par des organisations terroristes ou des cartels, privant les États du monopole de la force.<br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Que pensez-vous de ces avancées ? <br />
:fleche: Quelles sont les mesures à prendre en matière d’intelligence artificielle et de robotique afin que l’humanité soit plus impactée par les avantages offerts par ces systèmes que par leurs inconvénients ?<br />
<br />
<b>Voir aussi :</b> <br />
<br />
:fleche: <a href="https://www.developpez.com/actu/215636/Des-representants-de-150-entreprises-de-la-tech-plaident-contre-les-robots-tueurs-autonomes-lors-d-une-conference-internationale-sur-l-IA/" target="_blank">Des représentants de 150 entreprises de la tech plaident contre les robots tueurs autonomes, lors d'une conférence internationale sur l'IA</a><br />
:fleche: <a href="https://www.developpez.com/actu/197662/USA-le-sous-secretaire-a-la-defense-souleve-l-importance-d-associer-l-intelligence-artificielle-a-l-armee-evoquant-une-future-course-aux-armes/" target="_blank">USA : le sous-secrétaire à la défense soulève l'importance d'associer l'intelligence artificielle à l'armée, évoquant une future course aux armes</a><br />
:fleche: <a href="https://www.developpez.com/actu/197399/Des-experts-en-IA-boycottent-un-projet-de-robots-tueurs-d-une-universite-en-Coree-du-Sud-en-partenariat-avec-le-fabricant-d-armes-Hanwha-Systems/" target="_blank">Des experts en IA boycottent un projet de robots tueurs d'une université en Corée du Sud, en partenariat avec le fabricant d'armes Hanwha Systems</a><br />
:fleche: <a href="https://www.developpez.com/actu/196399/Non-l-IA-de-Google-ne-doit-pas-etre-au-service-de-la-guerre-Plus-de-3000-employes-de-Google-protestent-contre-la-collaboration-avec-le-Pentagone/" target="_blank">Non, l'IA de Google ne doit pas être au service de la guerre ! Plus de 3000 employés de Google protestent contre la collaboration avec le Pentagone</a><br />
:fleche: <a href="https://www.developpez.com/actu/102963/Robots-militaires-les-Etats-Unis-testent-l-efficacite-de-leurs-prototypes-dans-le-Pacifique-l-armee-irakienne-presente-son-robot-mitrailleur/" target="_blank">Robots militaires : les États-Unis testent l'efficacité de leurs prototypes dans le Pacifique, l'armée irakienne présente son robot mitrailleur</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Patrick Ruiz</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185621/general-developpement/programmation-systeme/embarque/robots-humanoides-apprenant-s-entrainer-se-battre-facon-autonome-ne-relevent-plus-scifi/</guid>
		</item>
		<item>
			<title><![CDATA[L'Iran devrait rétro-ingénierer un drone sous-marin américain capturé, un revers pour le Pentagone et Anduril]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185576&amp;goto=newpost</link>
			<pubDate>Thu, 10 Sep 2026 04:03:42 GMT</pubDate>
			<description>*Les USA minimisent la saisie...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Les USA minimisent la saisie par l'Iran d'un drone sous-marin autonome dans le détroit d'Ormuz. « Ce dernier était défectueux », d’après le commandement militaire américain pour le Moyen-Orient (Centcom)</font></b><br />
<br />
<b>Le 8 septembre 2026, le Corps des Gardiens de la révolution iraniens (CRI) a annoncé la capture d'un drone sous-marin autonome américain (UAV/AUV) à l'entrée du détroit d'Hormuz. Les médias d'État iraniens et les experts ont identifié l'appareil comme étant le Dive-LD, un véhicule sous-marin autonome de grande taille développé par l'entreprise de défense américaine <a href="https://intelligence-artificielle.developpez.com/actu/365564/OpenAI-entre-en-partenariat-avec-Anduril-et-laisse-certains-employes-inquiets-a-propos-de-l-utilisation-de-l-IA-par-les-militaires-Plusieurs-pays-sont-lances-dans-une-course-a-l-armement-pilote-p" target="_blank">Anduril Industries</a>. Alors que l'Iran qualifie cette saisie de capture de haute technologie lors d'une « opération d'intelligence complexe », le commandement militaire américain pour le Moyen-Orient (CentCom) minimise l'incident. Washington affirme qu'il s'agit d'un modèle ancien tombé en panne en mission de routine.</b> <br />
<br />
<b><font size="3">Le Dive-LD (Large Displacement) est un drone sous-marin lourd, optimisé pour l'endurance et les environnements marins difficiles.</font></b><br />
<br />
Son architecture physique se distingue par : <br />
<br />
<ul><li style="">	Ses dimensions : ce drone sous-marin autonome mesure près de 6 mètres</li><li style="">	Sa profondeur maximale : Conçu pour la haute mer, il peut descendre jusqu’à 6000 mètres</li><li style="">	Son coût : sa valeur unitaire est estimée à environ 2,5 millions de dollars</li><li style="">	Son autonomie opérationnelle : il dispose d’une propulsion à haute efficacité énergétique lui permettant de naviguer en continu pendant 10 jours sans intervention humaine.</li><li style="">	Son architecture externe repose sur des technologies de fabrication additive (impression 3D), facilitant des modifications rapides de sa coque selon la charge utile embarquée.</li><li style="">	Capteurs et équipements : Il intègre des systèmes de cartographie des fonds marins, des sonars de détection de mines, ainsi que des caméras d'inspection pour les infrastructures (câbles sous-marins et pipelines). (Note : Les États-Unis affirment que l'exemplaire précis perdu ne contenait aucun équipement sonar ou radar classifié)</li></ul><br />
<br />
<b><font size="3">Caractéristiques logicielles</font></b> <br />
<br />
<ul><li style="">	Système d'exploitation Lattice OS : Le drone est propulsé par la plateforme logicielle d'Anduril (Lattice), qui utilise l'intelligence artificielle pour traiter les données des capteurs en temps réel et naviguer de manière totalement autonome sans intervention humaine constante.</li><li style="">	Navigation autonome sans GPS : À grande profondeur, le signal GPS ne passe pas. Le logiciel utilise la navigation à l'estime combinée à des capteurs acoustiques (loch Doppler) et à la reconnaissance de formes topographiques pour se repérer.</li><li style="">	Gestion de mission intelligente : L'IA embarquée permet de modifier sa trajectoire de manière dynamique si elle détecte un obstacle, une anomalie sous-marine ou une menace potentielle.</li></ul><br />
<br />
 <blockquote class="twitter-tweet"><p lang="en" dir="ltr">&#9889;&#65039;BREAKING: The IRGC has released Footage of the Seizure of US Navy's Advanced Dive-LD Autonomous Underwater Vehicle<br><br>The United States was using it to Detect Mines in the Strait of Hormuz<br><br>The Dive-LD contains Classified Technology and Iran will likely Share it with Russia and… <a rel="nofollow" href="https://t.co/JznS0A2C7T">pic.twitter.com/JznS0A2C7T</a></p>&mdash; Iran Observer (@IranObserver0) <a rel="nofollow" href="https://x.com/IranObserver0/status/2097388572042998093?ref_src=twsrc%5Etfw">September 8, 2026</a></blockquote>  <b><font size="3">La guerre robotisée et assistée par l'intelligence artificielle est désormais une réalité opérationnelle majeure. Les champs de bataille en Ukraine et au Moyen-Orient servent de laboratoires à ciel ouvert pour ces technologies.</font></b><br />
<br />
Plusieurs cas documentés illustrent cette bascule technologique : <br />
<br />
<ul><li style="">	Assauts terrestres 100 % robotisés en Ukraine : En avril 2026, l'armée ukrainienne a mené une opération inédite au cours de laquelle une position russe a été prise exclusivement par des drones et des robots terrestres (UGV), sans aucune intervention de l'infanterie humaine. Les machines terrestres, équipées de mitrailleuses automatiques, ont forcé les soldats ennemis à se rendre, permettant une capture de position avec zéro perte côté ukrainien. L'Ukraine a d'ailleurs commandé 50 000 de ces robots terrestres pour l'année 2026. On note aussi une utilisation croissante de chiens-robots. Du point de vue du développeur informatique, ces robots sont des kits matériels - à la présentation visuelle similaire à celle d’un chien sur pattes – programmables via une API fournie par le constructeur. C’est au travers de cette dernière, ainsi que d’une série de modules d’extensions, que le développeur peut aller à l’essentiel de l’application à mettre en œuvre.</li></ul><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="40"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br />336<br />337<br />338<br />339<br />340<br />341<br />342<br />343<br />344<br />345<br />346<br />347<br />348<br />349<br />350<br />351<br />352<br />353<br />354<br />355<br />356<br />357<br />358<br />359<br />360<br />361<br />362<br />363<br />364<br />365<br />366<br />367<br />368<br />369<br />370<br />371<br />372<br />373<br />374<br />375<br />376<br />377<br />378<br />379<br />380<br />381<br />382<br />383<br />384<br />385<br />386<br />387<br />388<br />389<br />390<br />391<br />392<br />393<br />394<br />395<br />396<br />397<br />398<br />399<br />400<br />401<br />402<br />403<br />404<br />405<br />406<br />407<br />408<br />409<br />410<br />411<br />412<br />413<br />414<br />415<br />416<br />417<br />418<br />419<br />420<br />421<br />422<br />423<br />424<br />425<br />426<br />427<br />428<br />429<br />430<br />431<br />432<br />433<br />434<br />435<br />436<br />437<br />438<br />439<br />440<br />441<br />442<br />443<br />444<br />445<br />446<br />447<br />448<br />449<br />450<br />451<br />452<br />453<br />454<br />455<br />456<br />457<br />458<br />459<br />460<br />461<br />462<br />463<br />464<br />465<br />466<br />467<br />468<br />469<br />470<br />471<br />472<br />473<br />474<br />475<br />476<br />477<br />478<br />479<br />480<br />481<br />482<br />483<br />484<br />485<br />486<br />487<br />488<br />489<br />490<br />491<br />492<br />493<br />494<br />495<br />496<br />497<br />498<br />499<br />500<br />501<br />502<br />503<br />504<br />505<br />506<br />507<br />508<br />509<br />510<br />511<br />512<br />513<br />514<br />515<br />516<br />517<br />518<br />519<br />520<br />521<br />522<br />523<br />524<br />525<br />526<br />527<br />528<br />529<br />530<br />531<br />532<br />533<br />534<br />535<br />536<br />537<br />538<br />539<br />540<br />541<br />542<br />543<br />544<br />545<br />546<br />547<br />548<br />549<br />550<br />551<br />552<br />553<br />554<br />555<br />556<br />557<br />558<br />559<br />560<br />561<br />562<br />563<br />564<br />565<br />566<br />567<br />568<br />569<br />570<br />571<br />572<br />573<br />574<br />575<br />576<br />577<br />578<br />579<br />580<br />581<br />582<br />583<br />584<br />585<br />586<br />587<br />588<br />589<br />590<br />591<br />592<br />593<br />594<br />595<br />596<br />597<br />598<br />599<br />600<br />601<br />602<br />603<br />604<br />605<br />606<br />607<br />608<br />609<br />610<br />611<br />612<br />613<br />614<br />615<br />616<br />617<br />618<br />619<br />620<br />621<br />622<br />623<br />624<br />625<br />626<br />627<br />628<br />629<br />630<br />631<br />632<br />633<br />634<br />635<br />636<br />637<br />638<br />639<br />640<br />641<br />642<br />643<br />644<br />645<br />646<br />647<br />648<br />649<br />650<br />651<br />652<br />653<br />654<br />655<br />656<br />657<br />658<br />659<br />660<br />661<br />662<br />663<br />664<br />665<br />666<br />667<br />668<br />669<br />670<br />671<br />672<br />673<br />674<br />675<br />676<br />677<br />678<br />679<br />680<br />681<br />682<br />683<br />684<br />685<br />686<br />687<br />688<br />689<br />690<br />691<br />692<br />693<br />694<br />695<br />696<br />697<br />698<br />699<br />700<br />701<br />702<br />703<br />704<br />705<br />706<br />707<br />708<br />709<br />710<br />711<br />712<br />713<br />714<br />715<br />716<br />717<br />718<br />719<br />720<br />721<br />722<br />723<br />724<br />725<br />726<br />727<br />728<br />729<br />730<br />731<br />732<br />733<br />734<br />735<br />736<br />737<br />738<br />739<br />740<br />741<br />742<br />743<br />744<br />745<br />746<br />747<br />748<br />749<br />750<br />751<br />752<br />753<br />754<br />755<br />756<br />757<br />758<br />759<br />760<br />761<br />762<br />763<br />764<br />765<br />766<br />767<br />768<br />769<br />770<br />771<br />772<br />773<br />774<br />775<br />776<br />777<br />778<br />779<br />780<br />781<br />782<br />783<br />784<br />785<br />786<br />787<br />788<br />789<br />790<br />791<br />792<br />793<br />794<br />795<br />796<br />797<br />798<br />799<br />800<br />801<br />802<br />803<br />804<br />805<br />806<br />807<br />808<br />809<br />810<br />811<br />812<br />813<br />814<br />815<br />816<br />817<br />818<br />819<br />820<br />821<br />822<br />823<br />824<br />825<br />826<br />827<br />828<br />829<br />830<br />831<br />832<br />833<br />834<br />835<br />836<br />837<br />838<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #808080;"># Copyright (c) 2023 Boston Dynamics, Inc.  All rights reserved.</span>
<span style="color: #808080;"># Downloading, reproducing, distributing or otherwise using the SDK Software </span>
<span style="color: #808080;"># is subject to the terms and conditions of the Boston Dynamics Software </span>
<span style="color: #808080;"># Development Kit License (20191101-BDSDK-SL). </span>
&nbsp;
<span style="color: #FF0000;">&quot;&quot;&quot;Tutorial to show how to use the Boston Dynamics API to detect and follow an object&quot;&quot;&quot;</span> 
<span style="color: #0000ff;">import</span> argparse 
<span style="color: #0000ff;">import</span> io 
<span style="color: #0000ff;">import</span> json 
<span style="color: #0000ff;">import</span> math 
<span style="color: #0000ff;">import</span> os 
<span style="color: #0000ff;">import</span> signal 
<span style="color: #0000ff;">import</span> sys 
<span style="color: #0000ff;">import</span> time 
<span style="color: #0000ff;">from</span> multiprocessing <span style="color: #0000ff;">import</span> Barrier, Process, Queue, Value 
<span style="color: #0000ff;">from</span> queue <span style="color: #0000ff;">import</span> Empty, Full 
<span style="color: #0000ff;">from</span> threading <span style="color: #0000ff;">import</span> BrokenBarrierError, Thread 
&nbsp;
<span style="color: #0000ff;">import</span> cv2 
<span style="color: #0000ff;">import</span> numpy <span style="color: #0000ff;">as</span> np 
<span style="color: #0000ff;">from</span> PIL <span style="color: #0000ff;">import</span> Image 
<span style="color: #0000ff;">from</span> scipy <span style="color: #0000ff;">import</span> ndimage 
<span style="color: #0000ff;">from</span> tensorflow_object_detection <span style="color: #0000ff;">import</span> DetectorAPI 
&nbsp;
<span style="color: #0000ff;">import</span> bosdyn.client 
<span style="color: #0000ff;">import</span> bosdyn.client.util 
<span style="color: #0000ff;">from</span> bosdyn <span style="color: #0000ff;">import</span> geometry 
<span style="color: #0000ff;">from</span> bosdyn.api <span style="color: #0000ff;">import</span> geometry_pb2 <span style="color: #0000ff;">as</span> geo 
<span style="color: #0000ff;">from</span> bosdyn.api <span style="color: #0000ff;">import</span> image_pb2, trajectory_pb2 
<span style="color: #0000ff;">from</span> bosdyn.api.image_pb2 <span style="color: #0000ff;">import</span> ImageSource 
<span style="color: #0000ff;">from</span> bosdyn.api.spot <span style="color: #0000ff;">import</span> robot_command_pb2 <span style="color: #0000ff;">as</span> spot_command_pb2 
<span style="color: #0000ff;">from</span> bosdyn.client.async_tasks <span style="color: #0000ff;">import</span> AsyncPeriodicQuery, AsyncTasks 
<span style="color: #0000ff;">from</span> bosdyn.client.frame_helpers <span style="color: #0000ff;">import</span> <span class="br0">&#40;</span>GROUND_PLANE_FRAME_NAME, VISION_FRAME_NAME, get_a_tform_b, 
                                         get_vision_tform_body<span class="br0">&#41;</span> 
<span style="color: #0000ff;">from</span> bosdyn.client.image <span style="color: #0000ff;">import</span> ImageClient 
<span style="color: #0000ff;">from</span> bosdyn.client.lease <span style="color: #0000ff;">import</span> LeaseClient, LeaseKeepAlive 
<span style="color: #0000ff;">from</span> bosdyn.client.math_helpers <span style="color: #0000ff;">import</span> Quat, SE3Pose 
<span style="color: #0000ff;">from</span> bosdyn.client.robot_command <span style="color: #0000ff;">import</span> <span class="br0">&#40;</span>CommandFailedError, CommandTimedOutError, 
                                         RobotCommandBuilder, RobotCommandClient, blocking_stand<span class="br0">&#41;</span> 
<span style="color: #0000ff;">from</span> bosdyn.client.robot_state <span style="color: #0000ff;">import</span> RobotStateClient 
&nbsp;
LOGGER = bosdyn.client.util.get_logger<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
SHUTDOWN_FLAG = Value<span class="br0">&#40;</span><span style="color: #FF0000;">'i'</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> 
&nbsp;
<span style="color: #808080;"># Don't let the queues get too backed up </span>
QUEUE_MAXSIZE = <span style="color: #cc66cc;">10</span> 
&nbsp;
<span style="color: #808080;"># This is a multiprocessing.Queue for communication between the main process and the </span>
<span style="color: #808080;"># Tensorflow processes. </span>
<span style="color: #808080;"># Entries in this queue are in the format: </span>
&nbsp;
<span style="color: #808080;"># { </span>
<span style="color: #808080;">#     'source': Name of the camera, </span>
<span style="color: #808080;">#     'world_tform_cam': transform from VO to camera, </span>
<span style="color: #808080;">#     'world_tform_gpe':  transform from VO to ground plane, </span>
<span style="color: #808080;">#     'raw_image_time': Time when the image was collected, </span>
<span style="color: #808080;">#     'cv_image': The decoded image, </span>
<span style="color: #808080;">#     'visual_dims': (cols, rows), </span>
<span style="color: #808080;">#     'depth_image': depth image proto, </span>
<span style="color: #808080;">#     'system_cap_time': Time when the image was received by the main process, </span>
<span style="color: #808080;">#     'image_queued_time': Time when the image was done preprocessing and queued </span>
<span style="color: #808080;"># } </span>
RAW_IMAGES_QUEUE = Queue<span class="br0">&#40;</span>QUEUE_MAXSIZE<span class="br0">&#41;</span> 
&nbsp;
<span style="color: #808080;"># This is a multiprocessing.Queue for communication between the Tensorflow processes and </span>
<span style="color: #808080;"># the bbox print process. This is meant for running in a containerized environment with no access </span>
<span style="color: #808080;"># to an X display </span>
<span style="color: #808080;"># Entries in this queue have the following fields in addition to those in : </span>
<span style="color: #808080;"># { </span>
<span style="color: #808080;">#   'processed_image_start_time':  Time when the image was received by the TF process, </span>
<span style="color: #808080;">#   'processed_image_end_time':  Time when the image was processing for bounding boxes </span>
<span style="color: #808080;">#   'boxes': list of detected bounding boxes for the processed image </span>
<span style="color: #808080;">#   'classes': classes of objects, </span>
<span style="color: #808080;">#   'scores': confidence scores, </span>
<span style="color: #808080;"># } </span>
PROCESSED_BOXES_QUEUE = Queue<span class="br0">&#40;</span>QUEUE_MAXSIZE<span class="br0">&#41;</span> 
&nbsp;
<span style="color: #808080;"># Barrier for waiting on Tensorflow processes to start, initialized in main() </span>
TENSORFLOW_PROCESS_BARRIER = <span style="color: #339933;">None</span> 
&nbsp;
COCO_CLASS_DICT = <span class="br0">&#123;</span> 
    <span style="color: #cc66cc;">1</span>: <span style="color: #FF0000;">'person'</span>, 
    <span style="color: #cc66cc;">2</span>: <span style="color: #FF0000;">'bicycle'</span>, 
    <span style="color: #cc66cc;">3</span>: <span style="color: #FF0000;">'car'</span>, 
    <span style="color: #cc66cc;">4</span>: <span style="color: #FF0000;">'motorcycle'</span>, 
    <span style="color: #cc66cc;">5</span>: <span style="color: #FF0000;">'airplane'</span>, 
    <span style="color: #cc66cc;">6</span>: <span style="color: #FF0000;">'bus'</span>, 
    <span style="color: #cc66cc;">7</span>: <span style="color: #FF0000;">'train'</span>, 
    <span style="color: #cc66cc;">8</span>: <span style="color: #FF0000;">'truck'</span>, 
    <span style="color: #cc66cc;">9</span>: <span style="color: #FF0000;">'boat'</span>, 
    <span style="color: #cc66cc;">10</span>: <span style="color: #FF0000;">'trafficlight'</span>, 
    <span style="color: #cc66cc;">11</span>: <span style="color: #FF0000;">'firehydrant'</span>, 
    <span style="color: #cc66cc;">13</span>: <span style="color: #FF0000;">'stopsign'</span>, 
    <span style="color: #cc66cc;">14</span>: <span style="color: #FF0000;">'parkingmeter'</span>, 
    <span style="color: #cc66cc;">15</span>: <span style="color: #FF0000;">'bench'</span>, 
    <span style="color: #cc66cc;">16</span>: <span style="color: #FF0000;">'bird'</span>, 
    <span style="color: #cc66cc;">17</span>: <span style="color: #FF0000;">'cat'</span>, 
    <span style="color: #cc66cc;">18</span>: <span style="color: #FF0000;">'dog'</span>, 
    <span style="color: #cc66cc;">19</span>: <span style="color: #FF0000;">'horse'</span>, 
    <span style="color: #cc66cc;">20</span>: <span style="color: #FF0000;">'sheep'</span>, 
    <span style="color: #cc66cc;">21</span>: <span style="color: #FF0000;">'cow'</span>, 
    <span style="color: #cc66cc;">22</span>: <span style="color: #FF0000;">'elephant'</span>, 
    <span style="color: #cc66cc;">23</span>: <span style="color: #FF0000;">'bear'</span>, 
    <span style="color: #cc66cc;">24</span>: <span style="color: #FF0000;">'zebra'</span>, 
    <span style="color: #cc66cc;">25</span>: <span style="color: #FF0000;">'giraffe'</span>, 
    <span style="color: #cc66cc;">27</span>: <span style="color: #FF0000;">'backpack'</span>, 
    <span style="color: #cc66cc;">28</span>: <span style="color: #FF0000;">'umbrella'</span>, 
    <span style="color: #cc66cc;">31</span>: <span style="color: #FF0000;">'handbag'</span>, 
    <span style="color: #cc66cc;">32</span>: <span style="color: #FF0000;">'tie'</span>, 
    <span style="color: #cc66cc;">33</span>: <span style="color: #FF0000;">'suitcase'</span>, 
    <span style="color: #cc66cc;">34</span>: <span style="color: #FF0000;">'frisbee'</span>, 
    <span style="color: #cc66cc;">35</span>: <span style="color: #FF0000;">'skis'</span>, 
    <span style="color: #cc66cc;">36</span>: <span style="color: #FF0000;">'snowboard'</span>, 
    <span style="color: #cc66cc;">37</span>: <span style="color: #FF0000;">'sportsball'</span>, 
    <span style="color: #cc66cc;">38</span>: <span style="color: #FF0000;">'kite'</span>, 
    <span style="color: #cc66cc;">39</span>: <span style="color: #FF0000;">'baseballbat'</span>, 
    <span style="color: #cc66cc;">40</span>: <span style="color: #FF0000;">'baseballglove'</span>, 
    <span style="color: #cc66cc;">41</span>: <span style="color: #FF0000;">'skateboard'</span>, 
    <span style="color: #cc66cc;">42</span>: <span style="color: #FF0000;">'surfboard'</span>, 
    <span style="color: #cc66cc;">43</span>: <span style="color: #FF0000;">'tennisracket'</span>, 
    <span style="color: #cc66cc;">44</span>: <span style="color: #FF0000;">'bottle'</span>, 
    <span style="color: #cc66cc;">46</span>: <span style="color: #FF0000;">'wineglass'</span>, 
    <span style="color: #cc66cc;">47</span>: <span style="color: #FF0000;">'cup'</span>, 
    <span style="color: #cc66cc;">48</span>: <span style="color: #FF0000;">'fork'</span>, 
    <span style="color: #cc66cc;">49</span>: <span style="color: #FF0000;">'knife'</span>, 
    <span style="color: #cc66cc;">50</span>: <span style="color: #FF0000;">'spoon'</span>, 
    <span style="color: #cc66cc;">51</span>: <span style="color: #FF0000;">'bowl'</span>, 
    <span style="color: #cc66cc;">52</span>: <span style="color: #FF0000;">'banana'</span>, 
    <span style="color: #cc66cc;">53</span>: <span style="color: #FF0000;">'apple'</span>, 
    <span style="color: #cc66cc;">54</span>: <span style="color: #FF0000;">'sandwich'</span>, 
    <span style="color: #cc66cc;">55</span>: <span style="color: #FF0000;">'orange'</span>, 
    <span style="color: #cc66cc;">56</span>: <span style="color: #FF0000;">'broccoli'</span>, 
    <span style="color: #cc66cc;">57</span>: <span style="color: #FF0000;">'carrot'</span>, 
    <span style="color: #cc66cc;">58</span>: <span style="color: #FF0000;">'hotdog'</span>, 
    <span style="color: #cc66cc;">59</span>: <span style="color: #FF0000;">'pizza'</span>, 
    <span style="color: #cc66cc;">60</span>: <span style="color: #FF0000;">'donut'</span>, 
    <span style="color: #cc66cc;">61</span>: <span style="color: #FF0000;">'cake'</span>, 
    <span style="color: #cc66cc;">62</span>: <span style="color: #FF0000;">'chair'</span>, 
    <span style="color: #cc66cc;">63</span>: <span style="color: #FF0000;">'couch'</span>, 
    <span style="color: #cc66cc;">64</span>: <span style="color: #FF0000;">'pottedplant'</span>, 
    <span style="color: #cc66cc;">65</span>: <span style="color: #FF0000;">'bed'</span>, 
    <span style="color: #cc66cc;">67</span>: <span style="color: #FF0000;">'diningtable'</span>, 
    <span style="color: #cc66cc;">70</span>: <span style="color: #FF0000;">'toilet'</span>, 
    <span style="color: #cc66cc;">72</span>: <span style="color: #FF0000;">'tv'</span>, 
    <span style="color: #cc66cc;">73</span>: <span style="color: #FF0000;">'laptop'</span>, 
    <span style="color: #cc66cc;">74</span>: <span style="color: #FF0000;">'mouse'</span>, 
    <span style="color: #cc66cc;">75</span>: <span style="color: #FF0000;">'remote'</span>, 
    <span style="color: #cc66cc;">76</span>: <span style="color: #FF0000;">'keyboard'</span>, 
    <span style="color: #cc66cc;">77</span>: <span style="color: #FF0000;">'cellphone'</span>, 
    <span style="color: #cc66cc;">78</span>: <span style="color: #FF0000;">'microwave'</span>, 
    <span style="color: #cc66cc;">79</span>: <span style="color: #FF0000;">'oven'</span>, 
    <span style="color: #cc66cc;">80</span>: <span style="color: #FF0000;">'toaster'</span>, 
    <span style="color: #cc66cc;">81</span>: <span style="color: #FF0000;">'sink'</span>, 
    <span style="color: #cc66cc;">82</span>: <span style="color: #FF0000;">'refrigerator'</span>, 
    <span style="color: #cc66cc;">84</span>: <span style="color: #FF0000;">'book'</span>, 
    <span style="color: #cc66cc;">85</span>: <span style="color: #FF0000;">'clock'</span>, 
    <span style="color: #cc66cc;">86</span>: <span style="color: #FF0000;">'vase'</span>, 
    <span style="color: #cc66cc;">87</span>: <span style="color: #FF0000;">'scissors'</span>, 
    <span style="color: #cc66cc;">88</span>: <span style="color: #FF0000;">'teddybear'</span>, 
    <span style="color: #cc66cc;">89</span>: <span style="color: #FF0000;">'hairdrier'</span>, 
    <span style="color: #cc66cc;">90</span>: <span style="color: #FF0000;">'toothbrush'</span> 
<span class="br0">&#125;</span> 
&nbsp;
<span style="color: #808080;"># Mapping from visual to depth data </span>
VISUAL_SOURCE_TO_DEPTH_MAP_SOURCE = <span class="br0">&#123;</span> 
    <span style="color: #FF0000;">'frontleft_fisheye_image'</span>: <span style="color: #FF0000;">'frontleft_depth_in_visual_frame'</span>, 
    <span style="color: #FF0000;">'frontright_fisheye_image'</span>: <span style="color: #FF0000;">'frontright_depth_in_visual_frame'</span> 
<span class="br0">&#125;</span> 
ROTATION_ANGLES = <span class="br0">&#123;</span> 
    <span style="color: #FF0000;">'back_fisheye_image'</span>: <span style="color: #cc66cc;">0</span>, 
    <span style="color: #FF0000;">'frontleft_fisheye_image'</span>: -<span style="color: #cc66cc;">78</span>, 
    <span style="color: #FF0000;">'frontright_fisheye_image'</span>: -<span style="color: #cc66cc;">102</span>, 
    <span style="color: #FF0000;">'left_fisheye_image'</span>: <span style="color: #cc66cc;">0</span>, 
    <span style="color: #FF0000;">'right_fisheye_image'</span>: <span style="color: #cc66cc;">180</span> 
<span class="br0">&#125;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> _update_thread<span class="br0">&#40;</span>async_task<span class="br0">&#41;</span>: 
    <span style="color: #0000ff;">while</span> <span style="color: #339933;">True</span>: 
        async_task.update<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        time.sleep<span class="br0">&#40;</span><span style="color: #cc66cc;">0.01</span><span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">class</span> AsyncImage<span class="br0">&#40;</span>AsyncPeriodicQuery<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Grab image.&quot;&quot;&quot;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self, image_client, image_sources<span class="br0">&#41;</span>: 
        <span style="color: #808080;"># Period is set to be about 15 FPS </span>
        super<span class="br0">&#40;</span>AsyncImage, self<span class="br0">&#41;</span>.<span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span><span style="color: #FF0000;">'images'</span>, image_client, LOGGER, period_sec=<span style="color: #cc66cc;">0.067</span><span class="br0">&#41;</span> 
        self.image_sources = image_sources 
&nbsp;
    <span style="color: #0000ff;">def</span> _start_query<span class="br0">&#40;</span>self<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">return</span> self._client.get_image_from_sources_async<span class="br0">&#40;</span>self.image_sources<span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">class</span> AsyncRobotState<span class="br0">&#40;</span>AsyncPeriodicQuery<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Grab robot state.&quot;&quot;&quot;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self, robot_state_client<span class="br0">&#41;</span>: 
        <span style="color: #808080;"># period is set to be about the same rate as detections on the CORE AI </span>
        super<span class="br0">&#40;</span>AsyncRobotState, self<span class="br0">&#41;</span>.<span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span><span style="color: #FF0000;">'robot_state'</span>, robot_state_client, LOGGER, 
                                              period_sec=<span style="color: #cc66cc;">0.02</span><span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> _start_query<span class="br0">&#40;</span>self<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">return</span> self._client.get_robot_state_async<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_source_list<span class="br0">&#40;</span>image_client<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Gets a list of image sources and filters based on config dictionary </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; image_client: Instantiated image client </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
&nbsp;
    <span style="color: #808080;"># We are using only the visual images with their corresponding depth sensors </span>
    sources = image_client.list_image_sources<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    source_list = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
    <span style="color: #0000ff;">for</span> source <span style="color: #0000ff;">in</span> sources: 
        <span style="color: #0000ff;">if</span> source.image_type == ImageSource.IMAGE_TYPE_VISUAL: 
            <span style="color: #808080;"># only append if sensor has corresponding depth sensor </span>
            <span style="color: #0000ff;">if</span> source.name <span style="color: #0000ff;">in</span> VISUAL_SOURCE_TO_DEPTH_MAP_SOURCE: 
                source_list.append<span class="br0">&#40;</span>source.name<span class="br0">&#41;</span> 
                source_list.append<span class="br0">&#40;</span>VISUAL_SOURCE_TO_DEPTH_MAP_SOURCE<span class="br0">&#91;</span>source.name<span class="br0">&#93;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> source_list 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> capture_images<span class="br0">&#40;</span>image_task, sleep_between_capture<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot; Captures images and places them on the queue </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; image_task <span class="br0">&#40;</span>AsyncImage<span class="br0">&#41;</span>: Async task that provides the images response to use </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; sleep_between_capture <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Time to sleep between each image capture </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    <span style="color: #0000ff;">while</span> <span style="color: #0000ff;">not</span> SHUTDOWN_FLAG.value: 
        get_im_resp = image_task.proto 
        start_time = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> get_im_resp: 
            <span style="color: #0000ff;">continue</span> 
        depth_responses = <span class="br0">&#123;</span> 
            img.source.name: img 
            <span style="color: #0000ff;">for</span> img <span style="color: #0000ff;">in</span> get_im_resp 
            <span style="color: #0000ff;">if</span> img.source.image_type == ImageSource.IMAGE_TYPE_DEPTH 
        <span class="br0">&#125;</span> 
        entry = <span class="br0">&#123;</span><span class="br0">&#125;</span> 
        <span style="color: #0000ff;">for</span> im_resp <span style="color: #0000ff;">in</span> get_im_resp: 
            <span style="color: #0000ff;">if</span> im_resp.source.image_type == ImageSource.IMAGE_TYPE_VISUAL: 
                source = im_resp.source.name 
                depth_source = VISUAL_SOURCE_TO_DEPTH_MAP_SOURCE<span class="br0">&#91;</span>source<span class="br0">&#93;</span> 
                depth_image = depth_responses<span class="br0">&#91;</span>depth_source<span class="br0">&#93;</span> 
&nbsp;
                acquisition_time = im_resp.shot.acquisition_time 
                image_time = acquisition_time.seconds + acquisition_time.nanos * <span style="color: #cc66cc;">1e-9</span> 
&nbsp;
                <span style="color: #0000ff;">try</span>: 
                    image = Image.open<span class="br0">&#40;</span>io.BytesIO<span class="br0">&#40;</span>im_resp.shot.image.data<span class="br0">&#41;</span><span class="br0">&#41;</span> 
                    source = im_resp.source.name 
&nbsp;
                    image = ndimage.rotate<span class="br0">&#40;</span>image, ROTATION_ANGLES<span class="br0">&#91;</span>source<span class="br0">&#93;</span><span class="br0">&#41;</span> 
                    <span style="color: #0000ff;">if</span> im_resp.shot.image.pixel_format == image_pb2.Image.PIXEL_FORMAT_GREYSCALE_U8: 
                        image = cv2.cvtColor<span class="br0">&#40;</span>image, cv2.COLOR_GRAY2RGB<span class="br0">&#41;</span>  <span style="color: #808080;"># Converted to RGB for TF </span>
                    tform_snapshot = im_resp.shot.transforms_snapshot 
                    frame_name = im_resp.shot.frame_name_image_sensor 
                    world_tform_cam = get_a_tform_b<span class="br0">&#40;</span>tform_snapshot, VISION_FRAME_NAME, frame_name<span class="br0">&#41;</span> 
                    world_tform_gpe = get_a_tform_b<span class="br0">&#40;</span>tform_snapshot, VISION_FRAME_NAME, 
                                                    GROUND_PLANE_FRAME_NAME<span class="br0">&#41;</span> 
                    entry<span class="br0">&#91;</span>source<span class="br0">&#93;</span> = <span class="br0">&#123;</span> 
                        <span style="color: #FF0000;">'source'</span>: source, 
                        <span style="color: #FF0000;">'world_tform_cam'</span>: world_tform_cam, 
                        <span style="color: #FF0000;">'world_tform_gpe'</span>: world_tform_gpe, 
                        <span style="color: #FF0000;">'raw_image_time'</span>: image_time, 
                        <span style="color: #FF0000;">'cv_image'</span>: image, 
                        <span style="color: #FF0000;">'visual_dims'</span>: <span class="br0">&#40;</span>im_resp.shot.image.cols, im_resp.shot.image.rows<span class="br0">&#41;</span>, 
                        <span style="color: #FF0000;">'depth_image'</span>: depth_image, 
                        <span style="color: #FF0000;">'system_cap_time'</span>: start_time, 
                        <span style="color: #FF0000;">'image_queued_time'</span>: time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
                    <span class="br0">&#125;</span> 
                <span style="color: #0000ff;">except</span> Exception <span style="color: #0000ff;">as</span> exc:  <span style="color: #808080;"># pylint: disable=broad-except </span>
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Exception occurred during image capture {exc}'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">try</span>: 
            RAW_IMAGES_QUEUE.put_nowait<span class="br0">&#40;</span>entry<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> Full <span style="color: #0000ff;">as</span> exc: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'RAW_IMAGES_QUEUE is full: {exc}'</span><span class="br0">&#41;</span> 
        time.sleep<span class="br0">&#40;</span>sleep_between_capture<span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> start_tensorflow_processes<span class="br0">&#40;</span>num_processes, model_path, detection_class, detection_threshold, 
                               max_processing_delay<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Starts Tensorflow processes in parallel. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; It does not keep track of the processes once they are started because they run indefinitely </span>
<span style="color: #FF0000;">&nbsp; &nbsp; and are never joined back to the main process. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; num_processes <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: Number of Tensorflow processes to start in parallel. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; model_path <span class="br0">&#40;</span>str<span class="br0">&#41;</span>: Filepath to the Tensorflow model to use. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; detection_class <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: Detection class to detect </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; detection_threshold <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Detection threshold to apply to all Tensorflow detections. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; max_processing_delay <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Allowed delay before processing an incoming image. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    processes = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
    <span style="color: #0000ff;">for</span> _ <span style="color: #0000ff;">in</span> range<span class="br0">&#40;</span>num_processes<span class="br0">&#41;</span>: 
        process = Process<span class="br0">&#40;</span> 
            target=process_images, args=<span class="br0">&#40;</span> 
                model_path, 
                detection_class, 
                detection_threshold, 
                max_processing_delay, 
            <span class="br0">&#41;</span>, daemon=<span style="color: #339933;">True</span><span class="br0">&#41;</span> 
        process.start<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        processes.append<span class="br0">&#40;</span>process<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> processes 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> process_images<span class="br0">&#40;</span>model_path, detection_class, detection_threshold, max_processing_delay<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Starts Tensorflow and detects objects in the incoming images. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; model_path <span class="br0">&#40;</span>str<span class="br0">&#41;</span>: Filepath to the Tensorflow model to use. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; detection_class <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: Detection class to detect </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; detection_threshold <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Detection threshold to apply to all Tensorflow detections. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; max_processing_delay <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Allowed delay before processing an incoming image. </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
&nbsp;
    odapi = DetectorAPI<span class="br0">&#40;</span>path_to_ckpt=model_path<span class="br0">&#41;</span> 
    num_processed_skips = <span style="color: #cc66cc;">0</span> 
&nbsp;
    <span style="color: #0000ff;">if</span> TENSORFLOW_PROCESS_BARRIER <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span>: 
        <span style="color: #0000ff;">return</span> 
&nbsp;
    <span style="color: #0000ff;">try</span>: 
        TENSORFLOW_PROCESS_BARRIER.wait<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">except</span> BrokenBarrierError <span style="color: #0000ff;">as</span> exc: 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Error waiting for Tensorflow processes to initialize: {exc}'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
&nbsp;
    <span style="color: #0000ff;">while</span> <span style="color: #0000ff;">not</span> SHUTDOWN_FLAG.value: 
        <span style="color: #0000ff;">try</span>: 
            entry = RAW_IMAGES_QUEUE.get_nowait<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> Empty: 
            time.sleep<span class="br0">&#40;</span><span style="color: #cc66cc;">0.1</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">continue</span> 
        <span style="color: #0000ff;">for</span> _, capture <span style="color: #0000ff;">in</span> entry.items<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
            start_time = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
            processing_delay = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> - capture<span class="br0">&#91;</span><span style="color: #FF0000;">'raw_image_time'</span><span class="br0">&#93;</span> 
            <span style="color: #0000ff;">if</span> processing_delay &gt; max_processing_delay: 
                num_processed_skips += <span style="color: #cc66cc;">1</span> 
                <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'skipped image because it took {processing_delay}'</span><span class="br0">&#41;</span> 
                <span style="color: #0000ff;">continue</span>  <span style="color: #808080;"># Skip image due to delay </span>
&nbsp;
            image = capture<span class="br0">&#91;</span><span style="color: #FF0000;">'cv_image'</span><span class="br0">&#93;</span> 
            boxes, scores, classes, _ = odapi.process_frame<span class="br0">&#40;</span>image<span class="br0">&#41;</span> 
            confident_boxes = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
            confident_object_classes = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
            confident_scores = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
            <span style="color: #0000ff;">if</span> len<span class="br0">&#40;</span>boxes<span class="br0">&#41;</span> == <span style="color: #cc66cc;">0</span>: 
                <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'no detections founds'</span><span class="br0">&#41;</span> 
                <span style="color: #0000ff;">continue</span> 
            <span style="color: #0000ff;">for</span> box, score, box_class <span style="color: #0000ff;">in</span> sorted<span class="br0">&#40;</span>zip<span class="br0">&#40;</span>boxes, scores, classes<span class="br0">&#41;</span>, key=<span style="color: #0000ff;">lambda</span> x: x<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, 
                                                reverse=<span style="color: #339933;">True</span><span class="br0">&#41;</span>: 
                <span style="color: #0000ff;">if</span> score &gt; detection_threshold <span style="color: #0000ff;">and</span> box_class == detection_class: 
                    confident_boxes.append<span class="br0">&#40;</span>box<span class="br0">&#41;</span> 
                    confident_object_classes.append<span class="br0">&#40;</span>COCO_CLASS_DICT<span class="br0">&#91;</span>box_class<span class="br0">&#93;</span><span class="br0">&#41;</span> 
                    confident_scores.append<span class="br0">&#40;</span>score<span class="br0">&#41;</span> 
                    image = cv2.rectangle<span class="br0">&#40;</span>image, <span class="br0">&#40;</span>box<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, box<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>box<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span>, box<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span><span style="color: #cc66cc;">255</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>, <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> 
&nbsp;
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'processed_image_start_time'</span><span class="br0">&#93;</span> = start_time 
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'processed_image_end_time'</span><span class="br0">&#93;</span> = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'boxes'</span><span class="br0">&#93;</span> = confident_boxes 
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'classes'</span><span class="br0">&#93;</span> = confident_object_classes 
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'scores'</span><span class="br0">&#93;</span> = confident_scores 
            capture<span class="br0">&#91;</span><span style="color: #FF0000;">'cv_image'</span><span class="br0">&#93;</span> = image 
        <span style="color: #0000ff;">try</span>: 
            PROCESSED_BOXES_QUEUE.put_nowait<span class="br0">&#40;</span>entry<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> Full <span style="color: #0000ff;">as</span> exc: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'PROCESSED_BOXES_QUEUE is full: {exc}'</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'tf process ending'</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> <span style="color: #339933;">True</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_go_to<span class="br0">&#40;</span>world_tform_object, robot_state, mobility_params, dist_margin=<span style="color: #cc66cc;">0.5</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Gets trajectory command to a goal location </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; world_tform_object <span class="br0">&#40;</span>SE3Pose<span class="br0">&#41;</span>: Transform from vision frame to target object </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; robot_state <span class="br0">&#40;</span>RobotState<span class="br0">&#41;</span>: Current robot state </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; mobility_params <span class="br0">&#40;</span>MobilityParams<span class="br0">&#41;</span>: Mobility parameters </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; dist_margin <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Distance margin to target </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    vo_tform_robot = get_vision_tform_body<span class="br0">&#40;</span>robot_state.kinematic_state.transforms_snapshot<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'robot pos: {vo_tform_robot}'</span><span class="br0">&#41;</span> 
    delta_ewrt_vo = np.array<span class="br0">&#40;</span> 
        <span class="br0">&#91;</span>world_tform_object.x - vo_tform_robot.x, world_tform_object.y - vo_tform_robot.y, <span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span> 
    norm = np.linalg.norm<span class="br0">&#40;</span>delta_ewrt_vo<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">if</span> norm == <span style="color: #cc66cc;">0</span>: 
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">None</span> 
    delta_ewrt_vo_norm = delta_ewrt_vo / norm 
    heading = _get_heading<span class="br0">&#40;</span>delta_ewrt_vo_norm<span class="br0">&#41;</span> 
    vo_tform_goal = np.array<span class="br0">&#40;</span><span class="br0">&#91;</span> 
        world_tform_object.x - delta_ewrt_vo_norm<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> * dist_margin, 
        world_tform_object.y - delta_ewrt_vo_norm<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> * dist_margin 
    <span class="br0">&#93;</span><span class="br0">&#41;</span> 
    se2_pose = geo.SE2Pose<span class="br0">&#40;</span>position=geo.Vec2<span class="br0">&#40;</span>x=vo_tform_goal<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, y=vo_tform_goal<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, angle=heading<span class="br0">&#41;</span> 
    tag_cmd = RobotCommandBuilder.synchro_se2_trajectory_command<span class="br0">&#40;</span>se2_pose, 
                                                                 frame_name=VISION_FRAME_NAME, 
                                                                 params=mobility_params<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> tag_cmd 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> _get_heading<span class="br0">&#40;</span>xhat<span class="br0">&#41;</span>: 
    zhat = <span class="br0">&#91;</span><span style="color: #cc66cc;">0.0</span>, <span style="color: #cc66cc;">0.0</span>, <span style="color: #cc66cc;">1.0</span><span class="br0">&#93;</span> 
    yhat = np.cross<span class="br0">&#40;</span>zhat, xhat<span class="br0">&#41;</span> 
    mat = np.array<span class="br0">&#40;</span><span class="br0">&#91;</span>xhat, yhat, zhat<span class="br0">&#93;</span><span class="br0">&#41;</span>.transpose<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> Quat.from_matrix<span class="br0">&#40;</span>mat<span class="br0">&#41;</span>.to_yaw<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> set_default_body_control<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Set default body control params to current body position&quot;&quot;&quot;</span> 
    footprint_R_body = geometry.EulerZXY<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    position = geo.Vec3<span class="br0">&#40;</span>x=<span style="color: #cc66cc;">0.0</span>, y=<span style="color: #cc66cc;">0.0</span>, z=<span style="color: #cc66cc;">0.0</span><span class="br0">&#41;</span> 
    rotation = footprint_R_body.to_quaternion<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    pose = geo.SE3Pose<span class="br0">&#40;</span>position=position, rotation=rotation<span class="br0">&#41;</span> 
    point = trajectory_pb2.SE3TrajectoryPoint<span class="br0">&#40;</span>pose=pose<span class="br0">&#41;</span> 
    traj = trajectory_pb2.SE3Trajectory<span class="br0">&#40;</span>points=<span class="br0">&#91;</span>point<span class="br0">&#93;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> spot_command_pb2.BodyControlParams<span class="br0">&#40;</span>base_offset_rt_footprint=traj<span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_mobility_params<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Gets mobility parameters for following&quot;&quot;&quot;</span> 
    vel_desired = <span style="color: #cc66cc;">.75</span> 
    speed_limit = geo.SE2VelocityLimit<span class="br0">&#40;</span> 
        max_vel=geo.SE2Velocity<span class="br0">&#40;</span>linear=geo.Vec2<span class="br0">&#40;</span>x=vel_desired, y=vel_desired<span class="br0">&#41;</span>, angular=<span style="color: #cc66cc;">.25</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    body_control = set_default_body_control<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    mobility_params = spot_command_pb2.MobilityParams<span class="br0">&#40;</span>vel_limit=speed_limit, obstacle_params=<span style="color: #339933;">None</span>, 
                                                      body_control=body_control, 
                                                      locomotion_hint=spot_command_pb2.HINT_TROT<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> mobility_params 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> depth_to_xyz<span class="br0">&#40;</span>depth, pixel_x, pixel_y, focal_length, principal_point<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Calculate the transform to point in image using camera intrinsics and depth&quot;&quot;&quot;</span> 
    x = depth * <span class="br0">&#40;</span>pixel_x - principal_point.x<span class="br0">&#41;</span> / focal_length.x 
    y = depth * <span class="br0">&#40;</span>pixel_y - principal_point.y<span class="br0">&#41;</span> / focal_length.y 
    z = depth 
    <span style="color: #0000ff;">return</span> x, y, z 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> remove_ground_from_depth_image<span class="br0">&#40;</span>raw_depth_image, focal_length, principal_point, world_tform_cam, 
                                   world_tform_gpe, ground_tolerance=<span style="color: #cc66cc;">0.04</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot; Simple ground plane removal algorithm. Uses ground height </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; and does simple z distance filtering. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; raw_depth_image <span class="br0">&#40;</span>np.array<span class="br0">&#41;</span>: Depth image </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; focal_length <span class="br0">&#40;</span>Vec2<span class="br0">&#41;</span>: Focal length of camera that produced the depth image </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; principal_point <span class="br0">&#40;</span>Vec2<span class="br0">&#41;</span>: Principal point of camera that produced the depth image </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; world_tform_cam <span class="br0">&#40;</span>SE3Pose<span class="br0">&#41;</span>: Transform from VO to camera frame </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; world_tform_gpe <span class="br0">&#40;</span>SE3Pose<span class="br0">&#41;</span>: Transform from VO to GPE frame </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; ground_tolerance <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Distance in meters to add to the ground plane </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    new_depth_image = raw_depth_image 
&nbsp;
    <span style="color: #808080;"># same functions as depth_to_xyz, but converted to np functions </span>
    indices = np.indices<span class="br0">&#40;</span>raw_depth_image.shape<span class="br0">&#41;</span> 
    xs = raw_depth_image * <span class="br0">&#40;</span>indices<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> - principal_point.x<span class="br0">&#41;</span> / focal_length.x 
    ys = raw_depth_image * <span class="br0">&#40;</span>indices<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> - principal_point.y<span class="br0">&#41;</span> / focal_length.y 
    zs = raw_depth_image 
&nbsp;
    <span style="color: #808080;"># create xyz point cloud </span>
    camera_tform_points = np.stack<span class="br0">&#40;</span><span class="br0">&#91;</span>xs, ys, zs<span class="br0">&#93;</span>, axis=<span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> 
    <span style="color: #808080;"># points in VO frame </span>
    world_tform_points = world_tform_cam.transform_cloud<span class="br0">&#40;</span>camera_tform_points<span class="br0">&#41;</span> 
    <span style="color: #808080;"># array of booleans where True means the point was below the ground plane plus tolerance </span>
    world_tform_points_mask = <span class="br0">&#40;</span>world_tform_gpe.z - world_tform_points<span class="br0">&#91;</span>:, :, <span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &lt; ground_tolerance 
    <span style="color: #808080;"># remove data below ground plane </span>
    new_depth_image<span class="br0">&#91;</span>world_tform_points_mask<span class="br0">&#93;</span> = <span style="color: #cc66cc;">0</span> 
    <span style="color: #0000ff;">return</span> new_depth_image 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_distance_to_closest_object_depth<span class="br0">&#40;</span>x_min, x_max, y_min, y_max, depth_scale, raw_depth_image, 
                                         histogram_bin_size=<span style="color: #cc66cc;">0.50</span>, minimum_number_of_points=<span style="color: #cc66cc;">10</span>, 
                                         max_distance=<span style="color: #cc66cc;">8.0</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Make a histogram of distances to points in the cloud and take the closest distance with </span>
<span style="color: #FF0000;">&nbsp; &nbsp; enough points. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; x_min <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: minimum x coordinate <span class="br0">&#40;</span>column<span class="br0">&#41;</span> of object to find </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; x_max <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: maximum x coordinate <span class="br0">&#40;</span>column<span class="br0">&#41;</span> of object to find </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; y_min <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: minimum y coordinate <span class="br0">&#40;</span>row<span class="br0">&#41;</span> of object to find </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; y_max <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: maximum y coordinate <span class="br0">&#40;</span>row<span class="br0">&#41;</span> of object to find </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; depth_scale <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: depth scale of the image to convert from sensor value to meters </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; raw_depth_image <span class="br0">&#40;</span>np.array<span class="br0">&#41;</span>: matrix of depth pixels </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; histogram_bin_size <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: size of each bin of distances </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; minimum_number_of_points <span class="br0">&#40;</span>int<span class="br0">&#41;</span>: minimum number of points before returning depth </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; max_distance <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: maximum distance to object in meters </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    num_bins = math.ceil<span class="br0">&#40;</span>max_distance / histogram_bin_size<span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #808080;"># get a sub-rectangle of the bounding box out of the whole image, then flatten </span>
    obj_depths = <span class="br0">&#40;</span>raw_depth_image<span class="br0">&#91;</span>y_min:y_max, x_min:x_max<span class="br0">&#93;</span><span class="br0">&#41;</span>.flatten<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    obj_depths = obj_depths / depth_scale 
    obj_depths = obj_depths<span class="br0">&#91;</span>obj_depths != <span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> 
&nbsp;
    hist, hist_edges = np.histogram<span class="br0">&#40;</span>obj_depths, bins=num_bins, range=<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, max_distance<span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
    edges_zipped = zip<span class="br0">&#40;</span>hist_edges<span class="br0">&#91;</span>:-<span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, hist_edges<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span>:<span class="br0">&#93;</span><span class="br0">&#41;</span> 
    <span style="color: #808080;"># Iterate over the histogram and return the first distance with enough points. </span>
    <span style="color: #0000ff;">for</span> entry, edges <span style="color: #0000ff;">in</span> zip<span class="br0">&#40;</span>hist, edges_zipped<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">if</span> entry &gt; minimum_number_of_points: 
            filtered_depths = obj_depths<span class="br0">&#91;</span><span class="br0">&#40;</span>obj_depths &gt; edges<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &amp; <span class="br0">&#40;</span>obj_depths &lt; edges<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> 
            <span style="color: #0000ff;">if</span> len<span class="br0">&#40;</span>filtered_depths<span class="br0">&#41;</span> == <span style="color: #cc66cc;">0</span>: 
                <span style="color: #0000ff;">continue</span> 
            <span style="color: #0000ff;">return</span> np.mean<span class="br0">&#40;</span>filtered_depths<span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #0000ff;">return</span> max_distance 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> rotate_about_origin_degrees<span class="br0">&#40;</span>origin, point, angle<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Rotate a point counterclockwise by a given angle around a given origin. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; origin <span class="br0">&#40;</span>tuple<span class="br0">&#41;</span>: Origin to rotate the point around </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; point <span class="br0">&#40;</span>tuple<span class="br0">&#41;</span>: Point to rotate </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; angle <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Angle in degrees </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    <span style="color: #0000ff;">return</span> rotate_about_origin<span class="br0">&#40;</span>origin, point, math.radians<span class="br0">&#40;</span>angle<span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> rotate_about_origin<span class="br0">&#40;</span>origin, point, angle<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Rotate a point counterclockwise by a given angle around a given origin. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; origin <span class="br0">&#40;</span>tuple<span class="br0">&#41;</span>: Origin to rotate the point around </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; point <span class="br0">&#40;</span>tuple<span class="br0">&#41;</span>: Point to rotate </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; angle <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Angle in radians </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
    orig_x, orig_y = origin 
    pnt_x, pnt_y = point 
&nbsp;
    ret_x = orig_x + math.cos<span class="br0">&#40;</span>angle<span class="br0">&#41;</span> * <span class="br0">&#40;</span>pnt_x - orig_x<span class="br0">&#41;</span> - math.sin<span class="br0">&#40;</span>angle<span class="br0">&#41;</span> * <span class="br0">&#40;</span>pnt_y - orig_y<span class="br0">&#41;</span> 
    ret_y = orig_y + math.sin<span class="br0">&#40;</span>angle<span class="br0">&#41;</span> * <span class="br0">&#40;</span>pnt_x - orig_x<span class="br0">&#41;</span> + math.cos<span class="br0">&#40;</span>angle<span class="br0">&#41;</span> * <span class="br0">&#40;</span>pnt_y - orig_y<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> int<span class="br0">&#40;</span>ret_x<span class="br0">&#41;</span>, int<span class="br0">&#40;</span>ret_y<span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> get_object_position<span class="br0">&#40;</span>world_tform_cam, world_tform_gpe, visual_dims, depth_image, bounding_box, 
                        rotation_angle<span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Extract the bounding box, then find the mode in that region. </span>
<span style="color: #FF0000;">&nbsp; </span>
<span style="color: #FF0000;">&nbsp; &nbsp; Args: </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; world_tform_cam <span class="br0">&#40;</span>SE3Pose<span class="br0">&#41;</span>: SE3 transform from world to camera frame </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; visual_dims <span class="br0">&#40;</span>Tuple<span class="br0">&#41;</span>: <span class="br0">&#40;</span>cols, rows<span class="br0">&#41;</span> tuple from the visual image </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; depth_image <span class="br0">&#40;</span>ImageResponse<span class="br0">&#41;</span>: From a depth camera corresponding to the visual_image </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; bounding_box <span class="br0">&#40;</span>list<span class="br0">&#41;</span>: Bounding box from tensorflow </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &nbsp; &nbsp; rotation_angle <span class="br0">&#40;</span>float<span class="br0">&#41;</span>: Angle <span class="br0">&#40;</span>in degrees<span class="br0">&#41;</span> to rotate depth image to match cam image rotation </span>
<span style="color: #FF0000;">&nbsp; &nbsp; &quot;&quot;&quot;</span> 
&nbsp;
    <span style="color: #808080;"># Make sure there are two images. </span>
    <span style="color: #0000ff;">if</span> visual_dims <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span> <span style="color: #0000ff;">or</span> depth_image <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span>: 
        <span style="color: #808080;"># Fail. </span>
        <span style="color: #0000ff;">return</span> 
&nbsp;
    <span style="color: #808080;"># Rotate bounding box back to original frame </span>
    points = <span class="br0">&#91;</span><span class="br0">&#40;</span>bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span>, bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, 
              <span class="br0">&#40;</span>bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span>, bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, bounding_box<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#93;</span> 
&nbsp;
    origin = <span class="br0">&#40;</span>visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> / <span style="color: #cc66cc;">2</span>, visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> / <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span> 
&nbsp;
    points_rot = <span class="br0">&#91;</span>rotate_about_origin_degrees<span class="br0">&#40;</span>origin, point, rotation_angle<span class="br0">&#41;</span> <span style="color: #0000ff;">for</span> point <span style="color: #0000ff;">in</span> points<span class="br0">&#93;</span> 
&nbsp;
    <span style="color: #808080;"># Get the bounding box corners. </span>
    y_min = max<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, min<span class="br0">&#40;</span><span class="br0">&#91;</span>point<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> <span style="color: #0000ff;">for</span> point <span style="color: #0000ff;">in</span> points_rot<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    x_min = max<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span>, min<span class="br0">&#40;</span><span class="br0">&#91;</span>point<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> <span style="color: #0000ff;">for</span> point <span style="color: #0000ff;">in</span> points_rot<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    y_max = min<span class="br0">&#40;</span>visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>, max<span class="br0">&#40;</span><span class="br0">&#91;</span>point<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> <span style="color: #0000ff;">for</span> point <span style="color: #0000ff;">in</span> points_rot<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    x_max = min<span class="br0">&#40;</span>visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, max<span class="br0">&#40;</span><span class="br0">&#91;</span>point<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> <span style="color: #0000ff;">for</span> point <span style="color: #0000ff;">in</span> points_rot<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #808080;"># Check that the bounding box is valid. </span>
    <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>x_min &lt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">or</span> y_min &lt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">or</span> x_max &gt; visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> <span style="color: #0000ff;">or</span> y_max &gt; visual_dims<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Bounding box is invalid: ({x_min}, {y_min}) | ({x_max}, {y_max})'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Bounds: ({visual_dims[0]}, {visual_dims[1]})'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">return</span> 
&nbsp;
    <span style="color: #808080;"># Unpack the images. </span>
    <span style="color: #0000ff;">try</span>: 
        <span style="color: #0000ff;">if</span> depth_image.shot.image.pixel_format == image_pb2.Image.PIXEL_FORMAT_DEPTH_U16: 
            dtype = np.uint16 
        <span style="color: #0000ff;">else</span>: 
            dtype = np.uint8 
        img = np.fromstring<span class="br0">&#40;</span>depth_image.shot.image.data, dtype=dtype<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">if</span> depth_image.shot.image.format == image_pb2.Image.FORMAT_RAW: 
            img = img.reshape<span class="br0">&#40;</span>depth_image.shot.image.rows, depth_image.shot.image.cols<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">else</span>: 
            img = cv2.imdecode<span class="br0">&#40;</span>img, -<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> 
        depth_image_pixels = img 
        depth_image_pixels = remove_ground_from_depth_image<span class="br0">&#40;</span> 
            depth_image_pixels, depth_image.source.pinhole.intrinsics.focal_length, 
            depth_image.source.pinhole.intrinsics.principal_point, world_tform_cam, world_tform_gpe<span class="br0">&#41;</span> 
        <span style="color: #808080;"># Get the depth data from the region in the bounding box. </span>
        max_distance = <span style="color: #cc66cc;">8.0</span> 
        depth = get_distance_to_closest_object_depth<span class="br0">&#40;</span>x_min, x_max, y_min, y_max, 
                                                     depth_image.source.depth_scale, 
                                                     depth_image_pixels, max_distance=max_distance<span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #0000ff;">if</span> depth &gt;= max_distance: 
            <span style="color: #808080;"># Not enough depth data. </span>
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Not enough depth data.'</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
        <span style="color: #0000ff;">else</span>: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'distance to object: {depth}'</span><span class="br0">&#41;</span> 
&nbsp;
        center_x = round<span class="br0">&#40;</span><span class="br0">&#40;</span>x_max - x_min<span class="br0">&#41;</span> / <span style="color: #cc66cc;">2.0</span> + x_min<span class="br0">&#41;</span> 
        center_y = round<span class="br0">&#40;</span><span class="br0">&#40;</span>y_max - y_min<span class="br0">&#41;</span> / <span style="color: #cc66cc;">2.0</span> + y_min<span class="br0">&#41;</span> 
&nbsp;
        tform_x, tform_y, tform_z = depth_to_xyz<span class="br0">&#40;</span> 
            depth, center_x, center_y, depth_image.source.pinhole.intrinsics.focal_length, 
            depth_image.source.pinhole.intrinsics.principal_point<span class="br0">&#41;</span> 
        camera_tform_obj = SE3Pose<span class="br0">&#40;</span>tform_x, tform_y, tform_z, Quat<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #0000ff;">return</span> world_tform_cam * camera_tform_obj 
    <span style="color: #0000ff;">except</span> Exception <span style="color: #0000ff;">as</span> exc:  <span style="color: #808080;"># pylint: disable=broad-except </span>
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Error getting object position: {exc}'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">return</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> _check_model_path<span class="br0">&#40;</span>model_path<span class="br0">&#41;</span>: 
    <span style="color: #0000ff;">if</span> model_path <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span> <span style="color: #0000ff;">or</span> \ 
    <span style="color: #0000ff;">not</span> os.path.exists<span class="br0">&#40;</span>model_path<span class="br0">&#41;</span> <span style="color: #0000ff;">or</span> \ 
    <span style="color: #0000ff;">not</span> os.path.isfile<span class="br0">&#40;</span>model_path<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'ERROR, could not find model file {model_path}'</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
    <span style="color: #0000ff;">return</span> <span style="color: #339933;">True</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> _check_and_load_json_classes<span class="br0">&#40;</span>config_path<span class="br0">&#41;</span>: 
    <span style="color: #0000ff;">if</span> os.path.isfile<span class="br0">&#40;</span>config_path<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">with</span> open<span class="br0">&#40;</span>config_path<span class="br0">&#41;</span> <span style="color: #0000ff;">as</span> json_classes: 
            <span style="color: #0000ff;">global</span> COCO_CLASS_DICT  <span style="color: #808080;"># pylint: disable=global-statement </span>
            COCO_CLASS_DICT = json.load<span class="br0">&#40;</span>json_classes<span class="br0">&#41;</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> _find_highest_conf_source<span class="br0">&#40;</span>processed_boxes_entry<span class="br0">&#41;</span>: 
    highest_conf_source = <span style="color: #339933;">None</span> 
    max_score = <span style="color: #cc66cc;">0</span> 
    <span style="color: #0000ff;">for</span> key, capture <span style="color: #0000ff;">in</span> processed_boxes_entry.items<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">if</span> <span style="color: #FF0000;">'scores'</span> <span style="color: #0000ff;">in</span> capture.keys<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
            <span style="color: #0000ff;">if</span> len<span class="br0">&#40;</span>capture<span class="br0">&#91;</span><span style="color: #FF0000;">'scores'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> &gt; <span style="color: #cc66cc;">0</span> <span style="color: #0000ff;">and</span> capture<span class="br0">&#91;</span><span style="color: #FF0000;">'scores'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> &gt; max_score: 
                highest_conf_source = key 
                max_score = capture<span class="br0">&#91;</span><span style="color: #FF0000;">'scores'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> 
    <span style="color: #0000ff;">return</span> highest_conf_source 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> signal_handler<span class="br0">&#40;</span>signal, frame<span class="br0">&#41;</span>: 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Interrupt caught, shutting down'</span><span class="br0">&#41;</span> 
    SHUTDOWN_FLAG.value = <span style="color: #cc66cc;">1</span> 
&nbsp;
&nbsp;
<span style="color: #0000ff;">def</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
    <span style="color: #FF0000;">&quot;&quot;&quot;Command line interface.&quot;&quot;&quot;</span> 
&nbsp;
    parser = argparse.ArgumentParser<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span> 
        <span style="color: #FF0000;">'--model-path'</span>, default=<span style="color: #FF0000;">'/model.pb'</span>, help= 
        <span class="br0">&#40;</span><span style="color: #FF0000;">'Local file path to the Tensorflow model, example pre-trained models can be found at '</span> 
         <span style="color: #FF0000;">'https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf1_detection_zoo.md'</span> 
        <span class="br0">&#41;</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span><span style="color: #FF0000;">'--classes'</span>, default=<span style="color: #FF0000;">'/classes.json'</span>, type=str, 
                        help=<span style="color: #FF0000;">'File containing json mapping of object class IDs to class names'</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span><span style="color: #FF0000;">'--number-tensorflow-processes'</span>, default=<span style="color: #cc66cc;">1</span>, type=int, 
                        help=<span style="color: #FF0000;">'Number of Tensorflow processes to run in parallel'</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span><span style="color: #FF0000;">'--detection-threshold'</span>, default=<span style="color: #cc66cc;">0.7</span>, type=float, 
                        help=<span style="color: #FF0000;">'Detection threshold to use for Tensorflow detections'</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span> 
        <span style="color: #FF0000;">'--sleep-between-capture'</span>, default=<span style="color: #cc66cc;">0.2</span>, type=float, 
        help=<span class="br0">&#40;</span><span style="color: #FF0000;">'Seconds to sleep between each image capture loop iteration, which captures '</span> 
              <span style="color: #FF0000;">'an image from all cameras'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span> 
        <span style="color: #FF0000;">'--detection-class'</span>, default=<span style="color: #cc66cc;">1</span>, type=int, 
        help=<span class="br0">&#40;</span><span style="color: #FF0000;">'Detection classes to use in the Tensorflow model.'</span> 
              <span style="color: #FF0000;">'Default is to use 1, which is a person in the Coco dataset'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span> 
        <span style="color: #FF0000;">'--max-processing-delay'</span>, default=<span style="color: #cc66cc;">7.0</span>, type=float, 
        help=<span class="br0">&#40;</span><span style="color: #FF0000;">'Maximum allowed delay for processing an image. '</span> 
              <span style="color: #FF0000;">'Any image older than this value will be skipped'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    parser.add_argument<span class="br0">&#40;</span><span style="color: #FF0000;">'--test-mode'</span>, action=<span style="color: #FF0000;">'store_true'</span>, 
                        help=<span style="color: #FF0000;">'Run application in test mode, don<span style="color: #800000;">\'</span>t execute commands'</span><span class="br0">&#41;</span> 
&nbsp;
    bosdyn.client.util.add_base_arguments<span class="br0">&#40;</span>parser<span class="br0">&#41;</span> 
    bosdyn.client.util.add_payload_credentials_arguments<span class="br0">&#40;</span>parser<span class="br0">&#41;</span> 
    options = parser.parse_args<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    signal.signal<span class="br0">&#40;</span>signal.SIGINT, signal_handler<span class="br0">&#41;</span> 
    <span style="color: #0000ff;">try</span>: 
        <span style="color: #808080;"># Make sure the model path is a valid file </span>
        <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> _check_model_path<span class="br0">&#40;</span>options.model_path<span class="br0">&#41;</span>: 
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
&nbsp;
        <span style="color: #808080;"># Check for classes json file, otherwise use the COCO class dictionary </span>
        _check_and_load_json_classes<span class="br0">&#40;</span>options.classes<span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #0000ff;">global</span> TENSORFLOW_PROCESS_BARRIER  <span style="color: #808080;"># pylint: disable=global-statement </span>
        TENSORFLOW_PROCESS_BARRIER = Barrier<span class="br0">&#40;</span>options.number_tensorflow_processes + <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> 
        <span style="color: #808080;"># Start Tensorflow processes </span>
        tf_processes = start_tensorflow_processes<span class="br0">&#40;</span>options.number_tensorflow_processes, 
                                                  options.model_path, options.detection_class, 
                                                  options.detection_threshold, 
                                                  options.max_processing_delay<span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># sleep to give the Tensorflow processes time to initialize </span>
        <span style="color: #0000ff;">try</span>: 
            TENSORFLOW_PROCESS_BARRIER.wait<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> BrokenBarrierError <span style="color: #0000ff;">as</span> exc: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Error waiting for Tensorflow processes to initialize: {exc}'</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
        <span style="color: #808080;"># Start the API related things </span>
&nbsp;
        <span style="color: #808080;"># Create robot object with a world object client </span>
        sdk = bosdyn.client.create_standard_sdk<span class="br0">&#40;</span><span style="color: #FF0000;">'SpotFollowClient'</span><span class="br0">&#41;</span> 
        robot = sdk.create_robot<span class="br0">&#40;</span>options.hostname<span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #0000ff;">if</span> options.payload_credentials_file: 
            robot.authenticate_from_payload_credentials<span class="br0">&#40;</span> 
                *bosdyn.client.util.get_guid_and_secret<span class="br0">&#40;</span>options<span class="br0">&#41;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">else</span>: 
            bosdyn.client.util.authenticate<span class="br0">&#40;</span>robot<span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># Time sync is necessary so that time-based filter requests can be converted </span>
        robot.time_sync.wait_for_sync<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># Verify the robot is not estopped and that an external application has registered and holds </span>
        <span style="color: #808080;"># an estop endpoint. </span>
        <span style="color: #0000ff;">assert</span> <span style="color: #0000ff;">not</span> robot.is_estopped<span class="br0">&#40;</span><span class="br0">&#41;</span>, <span style="color: #FF0000;">'Robot is estopped. Please use an external E-Stop client,'</span> \ 
                                        <span style="color: #FF0000;">' such as the estop SDK example, to configure E-Stop.'</span> 
&nbsp;
        <span style="color: #808080;"># Create the sdk clients </span>
        robot_state_client = robot.ensure_client<span class="br0">&#40;</span>RobotStateClient.default_service_name<span class="br0">&#41;</span> 
        robot_command_client = robot.ensure_client<span class="br0">&#40;</span>RobotCommandClient.default_service_name<span class="br0">&#41;</span> 
        lease_client = robot.ensure_client<span class="br0">&#40;</span>LeaseClient.default_service_name<span class="br0">&#41;</span> 
        image_client = robot.ensure_client<span class="br0">&#40;</span>ImageClient.default_service_name<span class="br0">&#41;</span> 
        source_list = get_source_list<span class="br0">&#40;</span>image_client<span class="br0">&#41;</span> 
        image_task = AsyncImage<span class="br0">&#40;</span>image_client, source_list<span class="br0">&#41;</span> 
        robot_state_task = AsyncRobotState<span class="br0">&#40;</span>robot_state_client<span class="br0">&#41;</span> 
        task_list = <span class="br0">&#91;</span>image_task, robot_state_task<span class="br0">&#93;</span> 
        _async_tasks = AsyncTasks<span class="br0">&#40;</span>task_list<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Detect and follow client connected.'</span><span class="br0">&#41;</span> 
&nbsp;
        lease = lease_client.take<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        lease_keep = LeaseKeepAlive<span class="br0">&#40;</span>lease_client<span class="br0">&#41;</span> 
        <span style="color: #808080;"># Power on the robot and stand it up </span>
        resp = robot.power_on<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">try</span>: 
            blocking_stand<span class="br0">&#40;</span>robot_command_client<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> CommandFailedError <span style="color: #0000ff;">as</span> exc: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Error ({exc}) occurred while trying to stand. Check robot surroundings.'</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
        <span style="color: #0000ff;">except</span> CommandTimedOutError <span style="color: #0000ff;">as</span> exc: 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Stand command timed out: {exc}'</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span> 
        <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Robot powered on and standing.'</span><span class="br0">&#41;</span> 
        params_set = get_mobility_params<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># This thread starts the async tasks for image and robot state retrieval </span>
        update_thread = Thread<span class="br0">&#40;</span>target=_update_thread, args=<span class="br0">&#91;</span>_async_tasks<span class="br0">&#93;</span><span class="br0">&#41;</span> 
        update_thread.daemon = <span style="color: #339933;">True</span> 
        update_thread.start<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #808080;"># Wait for the first responses. </span>
        <span style="color: #0000ff;">while</span> any<span class="br0">&#40;</span>task.proto <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span> <span style="color: #0000ff;">for</span> task <span style="color: #0000ff;">in</span> task_list<span class="br0">&#41;</span>: 
            time.sleep<span class="br0">&#40;</span><span style="color: #cc66cc;">0.1</span><span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># Start image capture process </span>
        image_capture_thread = Process<span class="br0">&#40;</span>target=capture_images, 
                                       args=<span class="br0">&#40;</span>image_task, options.sleep_between_capture<span class="br0">&#41;</span>, 
                                       daemon=<span style="color: #339933;">True</span><span class="br0">&#41;</span> 
        image_capture_thread.start<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        <span style="color: #0000ff;">while</span> <span style="color: #0000ff;">not</span> SHUTDOWN_FLAG.value: 
            <span style="color: #808080;"># This comes from the tensorflow processes and limits the rate of this loop </span>
            <span style="color: #0000ff;">try</span>: 
                entry = PROCESSED_BOXES_QUEUE.get_nowait<span class="br0">&#40;</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">except</span> Empty: 
                <span style="color: #0000ff;">continue</span> 
            <span style="color: #808080;"># find the highest confidence bounding box </span>
            highest_conf_source = _find_highest_conf_source<span class="br0">&#40;</span>entry<span class="br0">&#41;</span> 
            <span style="color: #0000ff;">if</span> highest_conf_source <span style="color: #0000ff;">is</span> <span style="color: #339933;">None</span>: 
                <span style="color: #808080;"># no boxes or scores found </span>
                <span style="color: #0000ff;">continue</span> 
            capture_to_use = entry<span class="br0">&#91;</span>highest_conf_source<span class="br0">&#93;</span> 
            raw_time = capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'raw_image_time'</span><span class="br0">&#93;</span> 
            time_gap = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> - raw_time 
            <span style="color: #0000ff;">if</span> time_gap &gt; options.max_processing_delay: 
                <span style="color: #0000ff;">continue</span>  <span style="color: #808080;"># Skip image due to delay </span>
&nbsp;
            <span style="color: #808080;"># Find the transform to the highest confidence object using the depth sensor </span>
            get_object_position_start = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
            robot_state = robot_state_task.proto 
            world_tform_gpe = get_a_tform_b<span class="br0">&#40;</span>robot_state.kinematic_state.transforms_snapshot, 
                                            VISION_FRAME_NAME, GROUND_PLANE_FRAME_NAME<span class="br0">&#41;</span> 
            world_tform_object = get_object_position<span class="br0">&#40;</span> 
                capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'world_tform_cam'</span><span class="br0">&#93;</span>, world_tform_gpe, capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'visual_dims'</span><span class="br0">&#93;</span>, 
                capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'depth_image'</span><span class="br0">&#93;</span>, capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'boxes'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, 
                ROTATION_ANGLES<span class="br0">&#91;</span>capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'source'</span><span class="br0">&#93;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> 
            get_object_position_end = time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'system_cap_time: {capture_to_use[&quot;system_cap_time&quot;]}, '</span> 
                  f<span style="color: #FF0000;">'image_queued_time: {capture_to_use[&quot;image_queued_time&quot;]}, '</span> 
                  f<span style="color: #FF0000;">'processed_image_start_time: {capture_to_use[&quot;processed_image_start_time&quot;]}, '</span> 
                  f<span style="color: #FF0000;">'processed_image_end_time: {capture_to_use[&quot;processed_image_end_time&quot;]}, '</span> 
                  f<span style="color: #FF0000;">'get_object_position_start_time: {get_object_position_start}, '</span> 
                  f<span style="color: #FF0000;">'get_object_position_end_time: {get_object_position_end}, '</span><span class="br0">&#41;</span> 
&nbsp;
            <span style="color: #808080;"># get_object_position can fail if there is insufficient depth sensor information </span>
            <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> world_tform_object: 
                <span style="color: #0000ff;">continue</span> 
&nbsp;
            scores = capture_to_use<span class="br0">&#91;</span><span style="color: #FF0000;">'scores'</span><span class="br0">&#93;</span> 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Position of object with confidence {scores[0]}: {world_tform_object}'</span><span class="br0">&#41;</span> 
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>f<span style="color: #FF0000;">'Process latency: {time.time() - capture_to_use[&quot;system_cap_time&quot;]}'</span><span class="br0">&#41;</span> 
            tag_cmd = get_go_to<span class="br0">&#40;</span>world_tform_object, robot_state, params_set<span class="br0">&#41;</span> 
            end_time = <span style="color: #cc66cc;">15.0</span> 
            <span style="color: #0000ff;">if</span> tag_cmd <span style="color: #0000ff;">is</span> <span style="color: #0000ff;">not</span> <span style="color: #339933;">None</span>: 
                <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> options.test_mode: 
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'executing command'</span><span class="br0">&#41;</span> 
                    robot_command_client.robot_command<span class="br0">&#40;</span>lease=<span style="color: #339933;">None</span>, command=tag_cmd, 
                                                       end_time_secs=time.time<span class="br0">&#40;</span><span class="br0">&#41;</span> + end_time<span class="br0">&#41;</span> 
                <span style="color: #0000ff;">else</span>: 
                    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">'Running in test mode, skipping command.'</span><span class="br0">&#41;</span> 
&nbsp;
        <span style="color: #808080;"># Shutdown lease keep-alive and return lease gracefully. </span>
        lease_keep.shutdown<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        lease_client.return_lease<span class="br0">&#40;</span>lease<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">True</span> 
    <span style="color: #0000ff;">except</span> Exception <span style="color: #0000ff;">as</span> exc:  <span style="color: #808080;"># pylint: disable=broad-except </span>
        LOGGER.error<span class="br0">&#40;</span><span style="color: #FF0000;">'Spot Tensorflow Detector threw an exception: %s'</span>, exc<span class="br0">&#41;</span> 
        <span style="color: #808080;"># Shutdown lease keep-alive and return lease gracefully. </span>
        <span style="color: #0000ff;">return</span> <span style="color: #339933;">False</span>  
&nbsp;
&nbsp;
<span style="color: #0000ff;">if</span> <span style="color: #0080ff;">__name__</span> == <span style="color: #FF0000;">'__main__'</span>: 
    <span style="color: #0000ff;">if</span> <span style="color: #0000ff;">not</span> main<span class="br0">&#40;</span><span class="br0">&#41;</span>: 
        sys.exit<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#93;</span></pre></td></tr></table></code><hr />
</div><br />
<ul><li style="">Systèmes de ciblage de masse algorithmique (bande de Gaza) : L'armée israélienne a intégré l'IA au cœur de sa doctrine de ciblage avec des programmes massifs comme <a href="https://intelligence-artificielle.developpez.com/actu/356032/Lavender-l-IA-qui-dirige-les-bombardements-israeliens-contre-le-Hamas-provoque-la-mort-de-15-a-20-civils-comme-dommages-collateraux-par-frappe-d-apres-une-recente-et-glacante-enquete/" target="_blank">Lavender</a>. Cet algorithme analyse d'immenses volumes de données de surveillance pour identifier et classer automatiquement des milliers d'individus comme cibles militaires potentielles. Cela compresse drastiquement la chaîne de frappe, générant des listes de cibles à une vitesse impossible à atteindre pour des analystes humains.</li></ul><br />
<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/YXxdpe1SqJc?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="3">Entretemps, les pays peinent à s’accorder sur l’établissement d’instruments juridiquement contraignant à l’échelle internationale afin d’encadrer les usages de l’intelligence artificielle sur les champs de bataille.</font></b>  <br />
<br />
Face à cette prolifération incontrôlée, 128 pays de l'ONU se sont réunis à Genève en septembre 2026 pour tenter d'établir un premier texte de régulation de ces <a href="https://intelligence-artificielle.developpez.com/actu/354634/Des-robots-tueurs-equipes-d-IA-constitueraient-l-avenir-de-la-guerre-ces-systemes-d-armes-etant-capables-de-prendre-des-decisions-de-maniere-autonome-sans-supervision-humaine/" target="_blank">robots tueurs</a>, sous l'impulsion du Secrétaire général de l'ONU qui réclame un traité contraignant avant la fin de l'année. <br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pour ou contre l'utilisation de l'IA à des fins militaires ? Si pour, à quel degré ou à quelles fins ? Si contre, pourquoi ?<br />
:fleche: Êtes-vous surpris de la mise à contribution de l’intelligence artificielle sur les champs de bataille ? La situation des négociations au niveau de l'ONU est-elle surprenante quand on sait que chaque pays considère l'intelligence artificielle comme un moyen de domination ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/215636/Des-representants-de-150-entreprises-de-la-tech-plaident-contre-les-robots-tueurs-autonomes-lors-d-une-conference-internationale-sur-l-IA/" target="_blank">Des représentants de 150 entreprises de la tech plaident contre les robots tueurs autonomes, lors d'une conférence internationale sur l'IA</a><br />
:fleche: <a href="https://www.developpez.com/actu/197662/USA-le-sous-secretaire-a-la-defense-souleve-l-importance-d-associer-l-intelligence-artificielle-a-l-armee-evoquant-une-future-course-aux-armes/" target="_blank">USA : le sous-secrétaire à la défense soulève l'importance d'associer l'intelligence artificielle à l'armée, évoquant une future course aux armes</a><br />
:fleche: <a href="https://www.developpez.com/actu/197399/Des-experts-en-IA-boycottent-un-projet-de-robots-tueurs-d-une-universite-en-Coree-du-Sud-en-partenariat-avec-le-fabricant-d-armes-Hanwha-Systems/" target="_blank">Des experts en IA boycottent un projet de robots tueurs d'une université en Corée du Sud, en partenariat avec le fabricant d'armes Hanwha Systems</a><br />
:fleche: <a href="https://www.developpez.com/actu/196399/Non-l-IA-de-Google-ne-doit-pas-etre-au-service-de-la-guerre-Plus-de-3000-employes-de-Google-protestent-contre-la-collaboration-avec-le-Pentagone/" target="_blank">Non, l'IA de Google ne doit pas être au service de la guerre ! Plus de 3000 employés de Google protestent contre la collaboration avec le Pentagone</a><br />
:fleche: <a href="https://www.developpez.com/actu/102963/Robots-militaires-les-Etats-Unis-testent-l-efficacite-de-leurs-prototypes-dans-le-Pacifique-l-armee-irakienne-presente-son-robot-mitrailleur/" target="_blank">Robots militaires : les États-Unis testent l'efficacité de leurs prototypes dans le Pacifique, l'armée irakienne présente son robot mitrailleur</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Patrick Ruiz</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185576/general-developpement/programmation-systeme/embarque/l-iran-retro-ingenierer-drone-sous-marin-americain-capture-revers-pentagone-anduril/</guid>
		</item>
		<item>
			<title><![CDATA[Voici comment la Tesla d'une femme a été contrôlée à distance et utilisée pour la harceler par un ex-compagnon]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185573&amp;goto=newpost</link>
			<pubDate>Wed, 09 Sep 2026 21:12:39 GMT</pubDate>
			<description><![CDATA[*Voici comment la Tesla d'une...]]></description>
			<content:encoded><![CDATA[<div><b><font size="4">Voici comment la Tesla d'une femme a été contrôlée à distance et utilisée pour la harceler par un ex-compagnon violent</font></b> <br />
<b><font size="1">C’est l’un des cas du genre très scifi de détournement de fonctionnalités logicielles</font></b><br />
<br />
<b>C’est de l'affaire Enrico Pucci, jugée en Australie, dont il est question. En septembre 2026, cet homme de 50 ans a été condamné par un tribunal de Sydney à deux ans et trois mois de prison pour avoir utilisé l'application mobile Tesla afin de traquer et terroriser son ex-compagne. Cette affaire met en lumière les dérives des <a href="https://www.developpez.com/actu/348143/Les-voitures-connectees-un-danger-pour-la-vie-privee-selon-une-etude-de-Mozilla-sur-25-marques-de-voitures-Activite-sexuelle-poids-les-donnees-sensibles-sont-collectees-et-partagees/" target="_blank">véhicules connectés</a> utilisés comme outils de contrôle coercitif. Voici les détails de l'affaire ainsi que l'analyse des composants hardware (matériels) et software (logiciels) impliqués. </b><br />
<br />
<b><font size="3">Le résumé des faits</font></b><br />
<br />
Après sa séparation d'avec sa victime, Enrico Pucci a réussi à s'octroyer le contrôle total de son véhicule. Pendant plusieurs jours en novembre 2025, il a harcelé son ex-compagne à distance pendant qu'elle conduisait, créant des situations routières extrêmement dangereuses. Parmi ses actions : <br />
<br />
<ul><li style="">	Il activait soudainement le mode Valet (voiturier) sur les voies rapides, bridant instantanément la voiture à 40 km/h.</li><li style="">	Il faisait osciller la climatisation entre un froid glacial et une chaleur étouffante.</li><li style="">	Il verrouillait ou déverrouillait les portes à sa guise.</li><li style="">	Il déconnectait à distance le protocole de charge lorsque le véhicule était branché à une borne.</li><li style="">	Il suivait en temps réel les déplacements de la victime.</li></ul><br />
<br />
 <blockquote class="twitter-tweet"><p lang="en" dir="ltr">How one woman’s Tesla was remotely controlled – and used to harass her – by an abusive ex-partner<br>Enrico Pucci was able to control his former partner’s electric car remotely, controlling its speed, temperature settings and lock<a rel="nofollow" href="https://t.co/NXHrtxB2Un">https://t.co/NXHrtxB2Un</a></p>&mdash; Jane Fleming (@fleming77) <a rel="nofollow" href="https://x.com/fleming77/status/2097720230692659314?ref_src=twsrc%5Etfw">September 9, 2026</a></blockquote>  <b><font size="3">Les détails logiciels</font></b><br />
<br />
Contrairement à ce que l'on pourrait penser, il ne s'agissait pas d'un &quot;piratage&quot; informatique (hacking) au sens technique ou de l'exploitation d'une faille de sécurité (0-day). Le harceleur a simplement détourné les fonctionnalités logicielles légitimes de l'écosystème Tesla : <br />
<br />
<ul><li style="">	L’application Tesla pour iOS et Android : Le harceleur a utilisé l'application officielle. Chez Tesla, les commandes de confort (chauffage, klaxon, phares, verrouillage) transitent par l'API de Tesla via des requêtes HTTPS sécurisées vers les serveurs de la marque, qui les renvoient ensuite au véhicule par réseau cellulaire</li><li style="">	La gestion du compte maître : C'est la faille humaine et conceptuelle majeure. La voiture était enregistrée sous le compte Tesla de l'agresseur ou ce dernier possédait les identifiants maîtres. Dans l'architecture logicielle de Tesla, le titulaire du compte principal dispose de droits d’administration absolus. Même si la victime était physiquement propriétaire ou co-propriétaire de l'auto, elle n'était configurée que comme conductrice invitée, ce qui l'empêchait de révoquer les accès de son ex-conjoint.</li><li style="">	Le profil de contrôle parental et le mode Valet : L'agresseur a profité d'une mise à jour de l'interface pour installer un profil de &quot;contrôle parental&quot; et manipuler le Mode Valet (conçu initialement pour restreindre l'accès au coffre et brider la vitesse lorsque l'on confie sa voiture à un voiturier). L'activation de ce mode à distance envoie une instruction logicielle immédiate à l'ordinateur de bord, modifiant les limites dynamiques du véhicule, même s'il est en mouvement.</li></ul><br />
<br />
<b><font size="3">Les détails matériels (hardware)</font></b><br />
<br />
Pour que ces commandes logicielles soient exécutées, l'architecture matérielle de la Tesla a été pleinement exploitée :<br />
<br />
<ul><li style="">	Le modem LTE/5G intégré : Toutes les Tesla sont équipées d'un module de communication cellulaire hardware (télématique) connecté en permanence au réseau internet. C'est ce composant qui reçoit les paquets de données envoyés à distance par l'ex-conjoint via les serveurs de Tesla.</li><li style="">	Le MCU (Media Control Unit) : Il s'agit de l'ordinateur central (qui gère l'écran tactile d'infodivertissement). L'agresseur a réinitialisé à distance le tableau de bord électronique pour y injecter de nouvelles restrictions matérielles (comme le code PIN du mode Valet).</li><li style="">	Les calculateurs ECU et l'architecture &quot;Drive-by-Wire&quot; : Les Tesla sont entièrement basées sur des commandes électroniques. La climatisation (pompe à chaleur), les moteurs de verrouillage des portes et les modules de puissance des moteurs électriques ne sont pas reliés par des câbles mécaniques directs, mais par des bus de données (réseau CAN). Ainsi, une impulsion logicielle envoyée depuis l'application mobile à l'ordinateur central peut physiquement ordonner aux composants hardware (moteurs, compresseurs de climatisation) de s'activer, outrepassant momentanément la volonté de la conductrice.</li><li style="">	Puce GPS : Le récepteur GPS hardware du véhicule transmettait les coordonnées géographiques en temps réel à l'application mobile de l'agresseur.</li></ul><br />
<br />
 <blockquote class="twitter-tweet"><p lang="en" dir="ltr">An abusive ex remotely controlled a woman’s Tesla to harass her. He changed the temperature, locked the car, set curfews, and limited its speed while she was driving.<br><br>Enrico Pucci was convicted of 30 domestic violence-related charges. A judge sentenced him to two years and three… <a rel="nofollow" href="https://t.co/OyRxuIK6Ex">pic.twitter.com/OyRxuIK6Ex</a></p>&mdash; Link Technologies (@LinkTechnlogies) <a rel="nofollow" href="https://x.com/LinkTechnlogies/status/2097686461831131579?ref_src=twsrc%5Etfw">September 9, 2026</a></blockquote>  <b><font size="3">Un problème systémique de l’industrie</font></b> <br />
<br />
Cette affaire australienne n'est pas isolée. Aux États-Unis, plusieurs plaintes similaires ont visé Tesla. Les tribunaux et les constructeurs ont longtemps été critiqués pour leur impuissance réglementaire : les avocats de Tesla ont par exemple soutenu devant la justice américaine qu'il était illogique et irréalisable d'exiger d'un constructeur qu'il arbitre les litiges familiaux pour savoir quel conjoint a légitimement le droit d'utiliser l'application.<br />
<br />
Face à la recrudescence de ces dérives (qui touchent aussi d'autres marques), des organismes de régulation comme la FCC (Federal Communications Commission) ont accentué la pression sur les constructeurs pour inclure des protocoles logiciels permettant aux victimes de violence domestique de couper instantanément la connectivité à distance d'un véhicule depuis l'habitacle. <br />
<br />
<a href="https://embarque.developpez.com/actu/378758/Les-conducteurs-de-Tesla-achetent-des-outils-d-urgence-pour-eviter-de-se-retrouver-coinces-a-l-interieur-faute-de-poignees-manuelles-aisement-accessibles-que-d-autres-constructeurs-offrent-sur-leurs-produits/" target="_blank">C’est dans le même ordre d’idée que les constructeurs de Tesla achètent des outils d’urgence pour éviter de se retrouver coincés à l’intérieur des véhicules faute de poignées manuelles aisément accessibles.</a> <br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pour ou contre trop de complexité informatique dans les véhicules ?<br />
<br />
<b>Voir aussi :</b> <br />
<br />
:fleche: <a href="https://www.developpez.com/actu/313918/" target="_blank">Le levier de vitesse à écran tactile de Tesla est-il une très mauvaise idée ? La NHTSA déclare que cela répond aux normes de conformité et ne viole pas les règles</a><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/331426/" target="_blank">L'unité de conduite autonome de General Motors voudrait déployer des véhicules sans volant, rétroviseurs ou pédales en 2023. Elle a déposé une demande auprès du régulateur NHTSA</a><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/331777/" target="_blank">Les États-Unis suppriment l'exigence de commandes manuelles pour les véhicules entièrement automatisés, les véhicules autonomes sans volant ni pédales sont désormais autorisés</a><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/332889/" target="_blank">Elon Musk déclare que Tesla espère produire un robotaxi sans volant ni pédales en 2024, et qu'un trajet en robotaxi Tesla coûtera moins cher qu'un ticket de bus subventionné</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Patrick Ruiz</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185573/general-developpement/programmation-systeme/embarque/voici-tesla-d-femme-ete-controlee-distance-utilisee-harceler-ex-compagnon/</guid>
		</item>
		<item>
			<title><![CDATA[Pollen Robotics, filiale d'Hugging Face, ouvre les précommandes de son Microduck à 399 $]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185429&amp;goto=newpost</link>
			<pubDate>Wed, 02 Sep 2026 12:33:23 GMT</pubDate>
			<description>*Pollen Robotics, filiale...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Pollen Robotics, filiale d'Hugging Face, ouvre les précommandes de son Microduck à 399 $, un canard robot de 25 cm qui marche, fait du roller et ramasse des chaussettes, alors que Nvidia envisage d'acquérir Hugging Face</font></b><br />
<br />
<b>Pollen Robotics, une filiale de Hugging Face, a ouvert les précommandes pour le « Microduck », un canard robot bipède capable de marcher, de faire du roller et de ramasser de petits objets avec son bec, vendu 399 dollars. Les premières livraisons sont prévues avant Noël 2026 en Amérique du Nord, en Europe et au Royaume-Uni. L'appareil, qui mesure 25 cm, est livré avec une pile logicielle entièrement open source, mais dont le matériel est fermé. L'entreprise indique qu'elle continue de travailler sur l'autonomie du robot et souhaite que la communauté contribue au développement de comportements autonomes tels que la reconnaissance vocale, la navigation et la préhension. Ce lancement intervient alors que Nvidia serait en train de négocier le rachat de Hugging Face.</b><br />
<br />
Hugging Face, Inc. est une entreprise américaine basée à New York qui développe des outils informatiques destinés à la création d'applications utilisant l'apprentissage automatique. La bibliothèque « Transformers » de Hugging Face est conçue pour les applications de traitement du langage naturel. La plateforme Hugging Face permet aux utilisateurs de partager des modèles d'apprentissage automatique et des ensembles de données, ainsi que de présenter leurs travaux.<br />
<br />
Pour rappel, Nvidia s'est récemment engagé à <a href="https://intelligence-artificielle.developpez.com/actu/386527/Nvidia-s-engage-a-racheter-la-plateforme-d-IA-open-source-Hugging-Face-pour-12-9-milliards-une-des-plateformes-les-plus-populaires-ou-les-developpeurs-partagent-des-modeles-d-IA-open-source/" target="_blank">racheter la plateforme d’IA open source Hugging Face</a> pour 12,9 milliards de dollars, soit une valorisation près de 85 fois supérieure au chiffre d’affaires annualisé de la société d'IA. Une telle acquisition permettrait à Nvidia de renforcer son influence sur l’écosystème open source, alors que des acteurs comme Anthropic et OpenAI cherchent à réduire leur dépendance aux processeurs graphiques du groupe en développant leurs propres puces.<br />
<br />
Pollen Robotics, une entreprise bordelaise appartenant à la plateforme d'IA Hugging Face, a dévoilé un robot bipède baptisé « Microduck », proposé à un prix de lancement de 399 dollars hors taxes et frais de livraison. Cette nouvelle machine est dotée d'un œil et de 15 moteurs, mesure 25 cm de haut et pèse moins de 800 g. Les précommandes ont débuté le jeudi 27 août et les premières livraisons sont prévues avant Noël 2026 en Amérique du Nord, en Europe et au Royaume-Uni.<br />
<br />
Le robot marche, s'accroupit, se relève lorsqu'il tombe et ramasse de petits objets avec son bec. Les vidéos publiées lors du lancement le montrent en train de ramasser des chaussettes et un marqueur. Un pack d'accessoires en option comprend des pieds à roulettes qui lui permettent de faire du roller, ainsi qu'une balle, une puce NFC et des étiquettes, ainsi qu'un pointeur laser qu'il suit grâce à sa caméra.<br />
<br />
« Microduck n'est pas un Reachy Mini doté de pattes. Le Reachy Mini a été conçu autour de l'interaction. Il voit, écoute, parle et utilise sa tête et son corps pour communiquer. Microduck aborde l'IA physique sous un autre angle : l'action », a déclaré Pollen Robotics dans un communiqué. « C'est une plateforme idéale pour les développeurs qui souhaitent entraîner des comportements physiques, expérimenter l'apprentissage par renforcement et tester comment l'IA passe de la simulation au monde réel. »<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/RAtzEyGBGFU?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
Microduck fonctionne sur un processeur Rockchip RK3566 équipé d’un accélérateur d’IA, de 1 Go de RAM et de 32 Go de stockage intégré. Il perçoit son environnement grâce à une caméra frontale et évalue les distances à l’aide d’un LiDAR compact, une matrice à temps de vol de 8 × 8. Une unité de mesure inertielle est intégrée au corps et une seconde à la tête. Une boucle de décision à 50 Hz relie le modèle embarqué à ces capteurs et détermine la prochaine action du robot. Microduck fonctionne par ailleurs avec une batterie NP-F550 amovible pour caméra, une batterie de 2 600 mAh couramment utilisée dans les kits vidéo qui offre environ une heure d'autonomie.<br />
<br />
<b><font size="3">Une pile logicielle ouverte sur un châssis fermé</font></b><br />
<br />
L'ensemble de la pile logicielle du Microduck est disponible en open source et déjà accessible. Le SDK et le logiciel du robot sont stockés dans un dépôt GitHub, tandis que les outils d'apprentissage par renforcement et de transfert simulation-réalité ont été hébergés dans un autre dépôt plusieurs mois avant l'arrivée du premier robot. Un développeur peut ainsi enseigner une compétence en mode simulation, puis la transférer sur la machine. Les entreprises européennes de robotique travaillent de plus en plus souvent de cette manière et NEURA Robotics a même mis en place des « salles d'entraînement » pour robots.<br />
<br />
« [Microduck] est livré avec des comportements préprogrammés, ce qui vous permet de l'utiliser immédiatement. Vous pouvez le faire marcher à l'aide d'une manette, lui faire suivre un point laser, déclencher des mouvements ou le laisser réagir à son environnement. L'objectif est de permettre une première interaction immédiate, même si vous n'écrivez jamais de code », a déclaré Pollen Robotics. « Ensuite, si vous souhaitez aller plus loin, ce même robot se transforme en une plateforme de développement complète. Sa pile logicielle open source couvre le contrôle du robot, la simulation, l'apprentissage par renforcement et le déploiement sim-to-real. »<br />
<br />
En ce qui concerne le matériel, c'est une autre histoire, Pollen se montrant d'une franchise inhabituelle à ce sujet. Son dossier de presse informe les journalistes que la déclaration relative à l'open source ne concerne que la pile logicielle. Les fichiers de conception mécanique et électronique ne sont pas ouverts et l'entreprise demande aux journalistes de ne pas présenter le robot comme du matériel open source. Un représentant de Pollen a par ailleurs déclaré que la société n'avait pas l'intention de rendre le matériel open source.<br />
<br />
Les acheteurs bénéficient d'une architecture ouverte sur un châssis fermé. Pollen utilise déjà cette configuration pour le Reachy Mini, dont les ventes auraient dépassé les 10 000 unités depuis son lancement l'année dernière.<br />
<br />
Clément Delangue, PDG de Hugging Face, a décrit le Microduck comme « un minuscule robot open source à 399 dollars auquel on peut apprendre de nouveaux tours grâce à l’apprentissage par renforcement ». Sa publication sur X a été vue 4,4 millions de fois. Delangue a passé l’année dernière à affirmer que les modèles ouverts avaient le vent en poupe : « Bienvenue dans l’ère des robots open source abordables, qui démocratisent l’IA physique et les modèles du monde », a-t-il écrit.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p678577d1788352310/general-developpement/programmation-systeme/embarque/pollen-robotics-filiale-d-hugging-face-ouvre-precommandes-microduck-399/microduck-hugging-face-fig-2.png/" border="0" alt="Nom : microduck hugging face fig 2.png
Affichages : 796
Taille : 284,3 Ko"  style="float: CONFIG" /></div><br />
<b><font size="3">Le robot arrive à peine à soulever un savon</font></b><br />
<br />
Santiago Pavon, de Pollen Robotics, a estimé la capacité de levage du robot à environ 100 grammes. Cela correspond à peu près au poids d’un savon. Le bec est articulé et la caméra permet de repérer un objet, mais Pavon admet que la préhension restera limitée sur une machine de cette taille. <br />
<br />
Pollen Robotics ne commercialise pas un assistant ménager. Certains médias ont qualifié Microduck de « banc d’essai bon marché » destiné à familiariser le grand public avec l’IA matérielle, l’apprentissage automatique et la robotique moderne. Il ne s’agit ni d’un majordome ni d’un agent d’entretien à domicile. Ce cadrage est important en cette année où les démonstrations de robots ont pris le pas sur les machines elles-mêmes. L’humanoïde qui a battu le record d’Usain Bolt à Pékin n’a pas impressionné les roboticiens.<br />
<br />
<b><font size="3">Le comportement autonome est la pièce manquante du puzzle</font></b><br />
<br />
Ce qui manque à Microduck, c’est une finalité propre. Pollen Robotics souhaite que les propriétaires développent des fonctionnalités de reconnaissance vocale, de navigation et de préhension à partir de cette plateforme. L’entreprise vise également la localisation et la cartographie simultanées. Elle sollicite ainsi de l’aide plutôt que de promettre une feuille de route, ce qui en fait un pari sur une base d’utilisateurs qui n’existe pas encore.<br />
<br />
« Nous continuons à travailler sur l’ajout d’un objectif et d’une autonomie au robot, et nous espérons que la communauté prendra le relais et y contribuera », a déclaré Santiago Pavon. Il a décrit le comportement autonome comme un objectif de la communauté et a qualifié cette idée de passionnante. N’importe qui peut entraîner de nouveaux comportements en simulation à l’aide de l’apprentissage par renforcement, a-t-il ajouté.<br />
<br />
Selon Pollen, la réponse à la question de savoir ce que les gens devraient créer, c'est « plus de canards ». L'entreprise affirme que le robot est environ dix fois plus amusant lorsqu'il évolue en groupe. « Les courses, le football et les interactions entre les robots sont ce qui lui a donné vie à nos yeux », a déclaré l'entreprise. Pour les développeurs, c'est un moyen peu coûteux de se familiariser avec le comportement multi-robots, sans avoir besoin d'une pièce remplie de matériel.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p678578d1788352342/general-developpement/programmation-systeme/embarque/pollen-robotics-filiale-d-hugging-face-ouvre-precommandes-microduck-399/microduck-hugging-face-simreal.gif/" border="0" alt="Nom : microduck hugging face simreal.gif
Affichages : 674
Taille : 946,3 Ko"  style="float: CONFIG" /></div><br />
L'entreprise indique également qu'elle dispose déjà d'une liste de comportements qu'elle souhaite développer, mais que la liste la plus intéressante proviendra de la communauté. <br />
<br />
« Qu'il s'agisse d'un nouveau style de marche, d'une meilleure stratégie de récupération, d'une expérience en salle de classe ou de quelque chose auquel nous n'avons pas encore pensé, nous voulons que ces idées soient faciles à reproduire, à modifier et à partager », a déclaré l'entreprise bordelaise. « C'est également là que Hugging Face trouve tout naturellement sa place. Les modèles sont utiles car ils permettent aux utilisateurs de s'appuyer sur les travaux des autres. Nous souhaitons que les comportements physiques deviennent tout aussi faciles à partager, ainsi que les environnements et les procédures d'entraînement nécessaires à leur reproduction. »<br />
<br />
Pollen Robotics n'est pas la seule entreprise à chercher à normaliser la manière dont les modèles d'IA sont déployés sur du matériel réel. Anthropic a publié une norme relative au matériel de laboratoire le jour même où Microduck a été mis en précommande.<br />
<br />
<b><font size="3">Chaque Microduck s'exprime différemment des autres</font></b><br />
<br />
Microduck chante et chaque son est unique. Pollen Robotics explique que le robot communique par de petits sons et que chacun d'entre eux génère sa propre identité sonore dès sa première mise en marche. Cette « voix » accompagnera alors l’appareil tout au long de sa durée de vie.<br />
<br />
« Microduck s'exprime de manière très différente de Reachy Mini. Il ne parle pas avec des mots. Il communique plutôt par de petits sons étranges, qui le font davantage ressembler à une créature qu'à un assistant. Chaque Microduck se voit attribuer sa propre identité sonore lors de sa première mise en marche ; celle-ci est liée à ce robot en particulier, de sorte qu'il conserve la même voix toute sa vie », a indiqué l'entreprise.<br />
<br />
<b><font size="3">Microduck fait ses débuts alors que Nvidia envisage le rachat de Hugging Face</font></b><br />
<br />
Hugging Face a racheté Pollen Robotics en avril 2025 afin de développer du matériel ouvert à bas prix. Les deux entreprises ont lancé le Reachy Mini quelques mois plus tard. Ce robot de bureau est désormais disponible en deux versions : un modèle à 499 dollars fonctionnant sur un Raspberry Pi, et une version « Lite » à 399 dollars fonctionnant sur un Mac ou un PC.<br />
<br />
Le lancement du Microduck intervient en plein milieu d'une opération de rachat. Selon plusieurs rapports, Nvidia aurait accepté de racheter Hugging Face pour 12,9 milliards de dollars. Cette annonce fait suite à des informations parues quelques jours plus tôt, indiquant que les deux entreprises étaient en pourparlers en vue d'une vente. Une source proche du dossier a avancé un chiffre supérieur à 13 milliards de dollars et précisé que les deux parties n'avaient pas encore finalisé d'accord.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p678579d1788352366/general-developpement/programmation-systeme/embarque/pollen-robotics-filiale-d-hugging-face-ouvre-precommandes-microduck-399/microduck-hugging-face-fig-1.png/" border="0" alt="Nom : microduck hugging face fig 1.png
Affichages : 165
Taille : 217,2 Ko"  style="float: CONFIG" /></div><br />
<b><font size="3">Des préoccupations en matière de vie privée</font></b><br />
<br />
Microduck est équipé d'une caméra et d'un microphone, et Pollen Robotics prévoit que les utilisateurs l'installeront chez eux. Selon l'entreprise, le robot dispose également d'un voyant dédié à l'utilisation de la caméra, s'inspirant des voyants « REC » des anciens caméscopes. Cette solution a également été adoptée par Meta ce mois-ci pour ses lunettes connectées, après que des utilisateurs ont trouvé le moyen de masquer la LED. <br />
<br />
Santiago Delangue a déjà fait valoir que les robots fonctionnant avec des modèles ouverts l'emportaient sur « un système de type boîte noire » contrôlé par une poignée d'organisations, « surtout si le PDG de ces organisations n'est pas la personne la plus stable au monde », a-t-il déclaré. L'open source offre aux développeurs une traçabilité, mais ne garantit pas la confidentialité des données. Les utilisateurs installent des applications par-dessus le modèle, et ces applications peuvent accéder à la caméra et au microphone. Ce qu'elles en font dépend de la manière dont le développeur les a conçues.<br />
<br />
Certaines caractéristiques du robot sont encore à confirmer. Selon Pollen Robotics, la résolution de la caméra, la portée du LiDAR, les versions radio, les langages du SDK et toute recommandation d'âge sont provisoires. Deux éléments permettront alors de déterminer si ce projet tient la route. Le premier est de savoir si les appareils seront commercialisés avant Noël 2026, date avancée par Pollen. Le second est de savoir si quelqu’un en dehors de l’entreprise proposera une fonctionnalité qui vaille la peine d’être installée, car l’autonomie promise par Pollen repose en réalité sur un travail qu’elle a confié à des tiers.<br />
<br />
Le lancement du Microduck s’inscrit dans la vision plus large de Hugging Face qui prône un écosystème d’IA ouvert. Selon Clément Delangue, <a href="https://intelligence-artificielle.developpez.com/actu/385864/Le-PDG-d-Hugging-Face-affirme-que-la-Chine-est-en-tete-dans-la-course-a-l-IA-et-pourrait-dominer-le-secteur-d-ici-la-fin-de-l-annee-les-chinois-collaborent-ouvertement-contrairement-aux-americains/" target="_blank">la Chine est désormais en tête de la course à l'IA</a> et pourrait dominer le secteur d'ici la fin de l'année 2026. Il attribue cet avantage à une collaboration plus ouverte entre les chinois, contrairement aux créateurs de modèles américains qui, selon lui, travaillent davantage « en silos » et risquent de prendre du retard.<br />
<br />
<b>Source :</b> <a rel="nofollow" href="https://pollen-robotics.com/microduck/blog/introducing-microduck/" target="_blank">Pollen Robotics</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Quel est votre avis sur le sujet ?<br />
:fleche: Trouvez-vous cette initiative de Pollen Robotics crédible ou pertinente ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/373654/Hugging-Face-lance-Reachy-Mini-un-robot-a-299-dollars-susceptible-de-bouleverser-l-ensemble-du-secteur-de-la-robotique-concu-pour-rendre-la-robotique-alimentee-par-l-IA-accessible-a-tous-les-developpeurs/" target="_blank">Hugging Face lance Reachy Mini, un robot à 299 dollars susceptible de bouleverser l'ensemble du secteur de la robotique, conçu pour rendre la robotique alimentée par l'IA accessible à tous les développeurs</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/372658/Concu-en-collaboration-avec-une-societe-francaise-Hugging-Face-devoile-deux-robots-revolutionnaires-HopeJR-sera-disponible-en-open-source-pour-seulement-3-000/" target="_blank">Conçu en collaboration avec une société française, Hugging Face dévoile deux robots révolutionnaires, HopeJR sera disponible en open source pour seulement 3 000 $</a><br />
<br />
:fleche: <a href="https://intelligence-artificielle.developpez.com/actu/385646/73-pourcent-des-requetes-sont-a-caractere-sexuel-la-plateforme-d-IA-Hugging-Face-heberge-des-outils-permettant-de-creer-des-images-intimes-non-consensuelles-et-des-deepfakes-de-femmes-et-d-enfants-nus/" target="_blank">73 % des requêtes sont à caractère sexuel : la plateforme d'IA Hugging Face héberge des outils permettant de créer des images intimes non consensuelles et des « deepfakes » de femmes et d'enfants nus</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p678577d1788352310/general-developpement/programmation-systeme/embarque/pollen-robotics-filiale-d-hugging-face-ouvre-precommandes-microduck-399/microduck-hugging-face-fig-2.png/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p678578d1788352342/general-developpement/programmation-systeme/embarque/pollen-robotics-filiale-d-hugging-face-ouvre-precommandes-microduck-399/microduck-hugging-face-simreal.gif/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p678579d1788352366/general-developpement/programmation-systeme/embarque/pollen-robotics-filiale-d-hugging-face-ouvre-precommandes-microduck-399/microduck-hugging-face-fig-1.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Anthony</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185429/general-developpement/programmation-systeme/embarque/pollen-robotics-filiale-d-hugging-face-ouvre-precommandes-microduck-399-a/</guid>
		</item>
		<item>
			<title><![CDATA[Dans les coulisses de l'initiative de Meta visant à mettre des robots au travail dans ses centres de données]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185395&amp;goto=newpost</link>
			<pubDate>Mon, 31 Aug 2026 15:44:41 GMT</pubDate>
			<description>*Dans les coulisses de...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Dans les coulisses de l'initiative de Meta visant à mettre des robots au travail dans ses centres de données : les robots restent plus lents que les techniciens humains et fonctionnent sous supervision</font></b><br />
<br />
<b>Meta teste actuellement des robots développés par Watney Robotics, Kinova et ABB pour des tâches telles que le remplacement de câbles réseau, le redémarrage de serveurs, la réinstallation de matériel et la coupure d’alimentation des équipements. Cependant, la technologie présente des limites évidentes. Les robots d’inventaire de Meta peuvent rencontrer des difficultés avec les angles et les câbles, tandis que leurs caméras en niveaux de gris ne parviennent pas à distinguer les voyants verts des voyants rouges des équipements. Pour les employés, l'offensive de Meta dans le domaine de la robotique alimente les craintes que les centres de données construits pour alimenter l'IA finissent par employer moins de personnel.</b><br />
<br />
Meta Platforms, Inc. (opérant sous le nom de Meta) est une multinationale américaine du secteur des technologies dont le siège social est situé à Menlo Park, en Californie. Meta détient et exploite plusieurs plateformes de réseaux sociaux et services de communication de premier plan, notamment Facebook, Instagram, WhatsApp, Messenger et Threads. L’entreprise gère également un réseau publicitaire pour ses propres sites et pour des tiers ; en 2023, la publicité représentait 97,8 % de son chiffre d’affaires total. Meta est considérée comme faisant partie du « Big Tech ».<br />
<br />
En juin 2026, <a href="https://intelligence-artificielle.developpez.com/actu/383998/Meta-a-un-tel-besoin-de-puissance-de-calcul-pour-ses-projets-en-lien-avec-la-superintelligence-qu-il-fait-construire-des-centres-de-donnees-qui-s-apparentent-a-des-tentes-remplies-de-puces-d-IA/" target="_blank">Meta a commencé à ériger des espèces de tentes industrielles pour accueillir des serveurs surchauffés</a>, faute de centre de données construits à temps. Les rapports font état de ce que Meta a opté pour cette approche au vu de ce qu’on estime être une situation critique au sein de l’entreprise. Elle a donc commencé à construire des centres de données sous forme de tentes équipés de turbines à gaz mobiles.<br />
<br />
Dans le cadre de son projet « Prometheus », un campus de centres de données d'une puissance de l'ordre du gigawatt situé dans la banlieue de Columbus, dans l'Ohio, Meta a érigé six immenses tentes industrielles résistantes aux intempéries afin d'accélérer le déploiement de ses précieuses puces d'IA. Chacune de ces « structures à déploiement rapide » mesure 11 613 mètres carrés et est alimentée par une centrale électrique de 200 mégawatts située à proximité, d’après les données à disposition.<br />
<br />
Selon un nouveau rapport, Meta teste actuellement des robots développés par Watney Robotics, Kinova et ABB pour des tâches telles que le remplacement de câbles réseau, le redémarrage de serveurs, la réinstallation de matériel et la coupure d’alimentation des équipements. Selon un reportage de WIRED s’appuyant sur des entretiens avec des employés actuels et anciens de Meta, ces essais ont lieu dans plusieurs sites, notamment sur le campus de Meta à Altoona, dans l’Iowa, et dans son centre de données Prometheus à New Albany, dans l’Ohio.<br />
<br />
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">I didn't find evidence that Meta is pursuing humanoids for its data centers. But here's a look at some of the other robots it is trying as data center robotics heats up<a rel="nofollow" href="https://t.co/NEWWZ2BSq9">https://t.co/NEWWZ2BSq9</a> <a rel="nofollow" href="https://t.co/eylWuysyWx">https://t.co/eylWuysyWx</a></p>&mdash; Paresh Dave (@peard33) <a rel="nofollow" href="https://x.com/peard33/status/2093399012510757332?ref_src=twsrc%5Etfw">August 28, 2026</a></blockquote> <b>Meta teste des robots au sein de ses centres de données dédiés à l’IA</b><br />
<br />
À Altoona, Meta teste depuis juin 2025 deux robots Watney à deux bras pour des travaux de câblage. Ces machines restent plus lentes que les techniciens humains et fonctionnent sous supervision. Un employé de Meta a déclaré qu’un système de remplacement de câbles performant pourrait à terme réduire jusqu’à 80 % de la charge de travail dans certains postes. « <i>Nous pensions que ceux d’entre nous qui effectuaient les tâches physiques étaient à l’abri pendant un certain temps, mais ce n’est plus le cas. Malheureusement, cela va nous concerner tous</i> », a déclaré cet employé. Meta teste également un bras robotisé Kinova Gen3 pour le redémarrage des serveurs, tandis que des machines ABB sont utilisées sur le site de l’Ohio pour réinstaller des composants.<br />
<br />
Les robots ne sont pas une nouveauté absolue dans les centres de données de Meta. L’entreprise avait déjà présenté des machines autonomes capables de déplacer de lourds racks de serveurs et de suivre les stocks. Ces systèmes sont désormais opérationnels sur plusieurs sites, selon des personnes proches des projets. Mais les dernières expérimentations rapprochent l’automatisation de la maintenance proprement dite. Un simple dispositif peut actionner à distance le bouton d’alimentation d’un Mac Mini ou d’un équipement similaire pour le redémarrer.<br />
<br />
Les ambitions de Meta en matière de robotique ne sont pas non plus nouvelles. Eric Xu, responsable senior de la robotique chez Meta, a déclaré lors d’une conférence l’année dernière, que l’intégration de robots dans les centres de données figurait parmi les objectifs à long terme de l’entreprise, notamment pour la gestion des incidents, la surveillance environnementale et la maintenance préventive.<br />
<br />
La technologie présente des limites évidentes. Les robots d’inventaire de Meta peuvent rencontrer des difficultés avec les angles et les câbles, tandis que leurs caméras en niveaux de gris ne parviennent pas à distinguer les voyants verts des voyants rouges des équipements. Les employés signalent également des temps d’arrêt liés à la recharge des batteries et la nécessité de déplacer manuellement certaines machines d’un bâtiment à l’autre. Les tâches plus exigeantes restent également difficiles à réaliser. Meta a reconnu en interne que les robots ne sont pas équipés pour le câblage intensif requis par les systèmes Nvidia GB300.<br />
<br />
<b>Les usines industrielles accueillent de plus en plus de robots</b><br />
<br />
Nvidia et Alibaba développent également des systèmes visant à améliorer la formation des robots. En juin, Alibaba a dévoilé sa suite Qwen-Robot, comprenant des modèles de navigation, de manipulation d’objets et de simulation physique, tandis que les chercheurs de Nvidia ont présenté des agents IA chargés de former des flottes de robots. Le manque de données issues du monde réel reste toutefois un obstacle à l’introduction des robots dans les entrepôts. Wang Xiaogang, président d’ACE Robotics, a déclaré que l’IA incarnée — qui permet aux machines de percevoir et d’agir dans des environnements physiques — pourrait connaître un « moment ChatGPT » d’ici fin 2027.<br />
<br />
Les entreprises testent également des robots en dehors des centres de données. Bedrock Robotics a déployé des engins de chantier autonomes, et Mercedes-Benz a testé des robots humanoïdes pour des tâches répétitives en usine. Leurs développeurs invoquent la pénurie de main-d’œuvre et la sécurité des travailleurs, tandis que les détracteurs mettent en garde contre le risque que l’automatisation ne supprime des emplois.<br />
<br />
En mars 2026, <a href="https://embarque.developpez.com/actu/380856/Pour-la-premiere-fois-BMW-introduit-un-robot-humanoide-dote-d-une-IA-dans-son-usine-en-Allemagne-afin-d-integrer-la-robotique-humanoide-dans-la-production-en-serie-existante-de-voitures/" target="_blank">BMW introduit un robot humanoïde dans son usine en Allemagne</a>, franchissant ainsi une nouvelle étape vers la modernisation de la production automobile. Ce déploiement fait suite à un essai de près d'un an dans l'usine BMW de Spartanburg, en Caroline du Sud, où un robot humanoïde travaillait par roulement de 10 heures pour positionner des pièces en tôle en vue du soudage. BMW a créé un nouveau centre de compétences dédié à l'IA physique dans la production afin d'évaluer et de superviser les déploiements dans ses usines. <br />
<br />
En juin, General Motors avait également revu à la baisse ses ambitions en matière de véhicules électriques et <a href="https://emploi.developpez.com/actu/384471/General-Motors-a-licencie-plus-de-1-000-ouvriers-d-usine-et-installe-50-robots-sur-la-chaine-de-production-suscitant-des-inquietudes-chez-les-salaries-quant-a-l-avenir-de-l-emploi-dans-le-secteur-manufacturier/" target="_blank">supprimé plus de 1 000 emplois dans son usine d’assemblage phare de Détroit, tout en installant 50 robots</a>, ce qui a suscité l’indignation des syndicats. Ces « robots collaboratifs », ou « cobots », ont été installés sur la chaîne de montage de l’usine Factory Zero de GM, dans le Michigan, dans un contexte de forte baisse de la demande pour ses modèles de véhicules électriques et de la volonté qui en découle de réduire les coûts.<br />
<br />
En octobre 2025, <a href="https://embarque.developpez.com/actu/377075/Amazon-prevoit-de-remplacer-plus-d-un-demi-million-d-emplois-par-des-robots-ce-qui-lui-permettrait-d-economiser-12-6-milliards-de-dollars-entre-2025-et-2027-selon-des-documents-internes-divulgues/" target="_blank">un rapport a révélé qu'Amazon accélère les plans d'automatisation de ses entrepôts</a>. À terme, cela permettrait à Amazon de réduire ses coûts liés à la main-d'œuvre humaine et de réaliser des économies. Les documents divulgués ont révélé que l'équipe de robotique d'Amazon travaillait à l'automatisation de 75 % de l'ensemble des opérations de l'entreprise. Amazon espère que les robots occuperont plus de 600 000 postes aux États-Unis qu'il aurait dû pourvoir d'ici à 2033. Cela permettrait d'économiser environ 30 cents sur chaque article stocké et livré par Amazon à ses clients, les efforts d'automatisation devant permettre à la société d'économiser 12,6 milliards de dollars entre 2025 et 2027.<br />
<br />
<b>Un contexte social explosif : l'automatisation pourrait provoquer plus de licenciement ?</b><br />
<br />
L'offensive de Meta dans le domaine de la robotique alimente les craintes que les centres de données construits pour alimenter l'IA finissent par employer moins de personnel. Des employés ont confié que l'automatisation pourrait réduire la demande de techniciens expérimentés et confier les tâches restantes à des employés moins bien rémunérés, suivant des instructions générées par l'IA. Pourtant, un porte-parole de Meta a déclaré que l'entreprise continuait à embaucher et à former du personnel malgré une pénurie de main-d'œuvre qualifiée. « <i>Les États-Unis connaissent actuellement leur plus grand boom des infrastructures depuis la Seconde Guerre mondiale, et il y a une pénurie majeure de travailleurs qualifiés pour pourvoir ces postes ; nous avons besoin de plus de travailleurs, pas moins</i> », a déclaré le porte-parole.<br />
<br />
En se référant aux récentes révélations concernant Meta, ces craintes semblent naturelles. En effet, le 21 avril 2026, des mémos internes ont révélé que <a href="https://intelligence-artificielle.developpez.com/actu/383205/Chez-Meta-former-l-IA-qui-vous-remplace-est-devenu-une-clause-implicite-du-contrat-de-travail-et-certains-employes-commencent-a-dire-non-au-mouchard-qui-analyse-leurs-activites-pour-entrainer-l-IA/" target="_blank">Meta déploie sur les ordinateurs professionnels de ses salariés basés aux États-Unis un logiciel de surveillance baptisé Model Capability Initiative (MCI)</a>. L'outil capte les mouvements de souris, les frappes clavier et prend des captures d'écran périodiques, dans le but déclaré d'entraîner des modèles d'IA sur la façon dont les humains naviguent sur leurs ordinateurs au fil des tâches quotidiennes.<br />
<br />
Le mémo indiquait que l'initiative visait à améliorer les modèles là où l'IA peine encore, notamment pour choisir dans des menus déroulants et utiliser des raccourcis clavier. Ces détails, presque anodins en apparence, éclairent pourtant la nature profonde du projet : il ne s'agit pas de surveiller la productivité, mais de capturer le savoir-faire implicite des travailleurs du savoir pour l'injecter dans des pipelines d'entraînement. <br />
<br />
Le timing de ce déploiement n'est pas anodin. Le mouvement de protestation a éclaté à quelques jours à peine de <a href="https://emploi.developpez.com/actu/383049/Mark-Zuckerberg-le-confirme-les-8-000-salaries-qui-seront-licencies-vont-compenser-ses-investissements-dans-l-IA-quand-la-main-d-oeuvre-humaine-devient-une-variable-d-ajustement-budgetaire/" target="_blank">la suppression annoncée de 8 000 postes prévue pour le 20 mai, une mesure qualifiée « d'initiative d'efficacité » liée aux dépenses en IA</a>. Quelque 6 000 postes ouverts ne seront pas pourvus. Pour une partie du personnel, l'équation est brutale : on leur demande de former leurs successeurs algorithmiques tout en sachant qu'ils figurent peut-être sur la prochaine liste de licenciements.<br />
<br />
Cela ne signifie pas nécessairement que des suppressions d’emplois massives sont imminentes. Les robots restent plus lents, limités et dépendants des humains. Meta affirme également avoir besoin de plus de travailleurs qualifiés et a lancé des programmes de formation visant à former chaque année des milliers de techniciens en électricité, en mécanique et en plomberie. L’évolution la plus intéressante réside dans le fait que l’automatisation dépasse désormais le cadre des tâches logicielles. Les expériences menées par Meta suggèrent que les prochains gains de productivité liés à l’IA pourraient provenir non seulement de l’automatisation des décisions à l’écran, mais aussi de machines assurant la maintenance physique de l’infrastructure qui alimente l’IA elle-même.<br />
<br />
<b>Sources</b> : Meta, Wired<br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que ce rapport est crédible ou pertinent ?<br />
:fleche: Pensez-vous que la robotisation devrait alimenter les craintes des employés ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://intelligence-artificielle.developpez.com/actu/379635/Jensen-Huang-met-en-garde-Vous-n-avez-aucune-idee-de-ce-qui-vous-attend-en-2026-Robots-penurie-de-main-d-oeuvre-et-automatisation-totale-le-futur-du-travail-selon-le-PDG-de-NVIDIA/" target="_blank">Jensen Huang met en garde : « Vous n'avez aucune idée de ce qui vous attend en 2026 ». Robots, pénurie de main-d'œuvre et automatisation totale, le futur du travail selon le PDG de NVIDIA</a><br />
<br />
:fleche: <a href="https://intelligence-artificielle.developpez.com/actu/375008/28-centres-de-donnees-ne-suffisent-pas-a-Mark-Zuckerberg-Meta-est-tellement-avide-de-puissance-IA-qu-elle-achete-pour-10-milliards-de-dollars-de-services-cloud-a-son-concurrent-Google/" target="_blank">28 centres de données ne suffisent pas à Mark Zuckerberg : Meta est tellement avide de puissance IA qu'elle achète pour 10 milliards de dollars de services cloud à son concurrent Google</a><br />
<br />
:fleche: <a href="https://cloud-computing.developpez.com/actu/384864/L-immense-centre-de-donnees-IA-de-Meta-a-contamine-le-reseau-d-eau-potable-d-une-ville-avec-des-bacteries-mortelles-ce-qui-a-attise-la-colere-du-public-a-l-egard-des-centres-de-donnees-IA/" target="_blank">L'immense centre de données IA de Meta a contaminé le réseau d'eau potable d'une ville avec des bactéries mortelles, ce qui a attisé la colère du public à l'égard des centres de données IA</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Alex</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185395/general-developpement/programmation-systeme/embarque/coulisses-l-initiative-meta-visant-mettre-robots-travail-centres-donnees/</guid>
		</item>
		<item>
			<title>Quelle stratégie adopter pour intégrer Rust dans les nouveaux projets systèmes et embarqués ?</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2185035&amp;goto=newpost</link>
			<pubDate>Thu, 06 Aug 2026 20:19:33 GMT</pubDate>
			<description>Salut à toute la communauté...</description>
			<content:encoded><![CDATA[<div>Salut à toute la communauté des développeurs, ingénieurs, chefs de projets et passionnés de technologie. Étant moi-même un grand passionné de programmation système, d'embarqué et de langages de programmation bas niveau, je viens humblement solliciter vos retours d'expérience.Je me pose plusieurs questions concernant le démarrage de nouveaux projets :<br />
Comment intégrer efficacement Rust dans l'architecture de nouveaux projets systèmes et embarqués ?<br />
Faut-il impérativement tout coder en Rust, ou une approche hybride est-elle préférable ?<br />
est ce mieux de faire cohabiter au mieux le C, le C++, Rust ou même Zig au sein d'un projet ?<br />
Plus globalement, quelles sont les tendances industrielles actuelles dans ces domaines et comment adopter la démarche la plus pragmatique possible sur le terrain ?<br />
Merci d'avance pour vos partages et vos précieux conseils !</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>devmael</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2185035/general-developpement/programmation-systeme/embarque/strategie-adopter-integrer-rust-nouveaux-projets-systemes-embarques/</guid>
		</item>
		<item>
			<title><![CDATA[[PIC] Programme Basic à modifier]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184967&amp;goto=newpost</link>
			<pubDate>Mon, 03 Aug 2026 13:41:11 GMT</pubDate>
			<description>Bonjour, 
Je suis débutant,...</description>
			<content:encoded><![CDATA[<div>Bonjour,<br />
Je suis débutant, j'ai récupérer sur Elektor, un programme pour réaliser un thermostat universel.<br />
Celui-ci fonctionne correctement, mais je souhaiterais réaliser quelques modifications au niveau de l'affichage.<br />
Je ne possède pas de logiciel en Basic, il me faudrait aussi pouvoir compiler le programme pour le PIC.<br />
Pourriez-vous m'aider dans ma démarche ?<br />
Cordialement,<br />
Alain</div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Prisme55</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184967/general-developpement/programmation-systeme/embarque/programme-basic-modifier/</guid>
		</item>
		<item>
			<title>La Chine accueille la toute première compétition d’UFC opposant des robots humanoïdes au monde</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184746&amp;goto=newpost</link>
			<pubDate>Mon, 20 Jul 2026 10:18:10 GMT</pubDate>
			<description>*La Chine accueille la...</description>
			<content:encoded><![CDATA[<div><b><font size="4">La Chine accueille la première compétition d’UFC entre robots humanoïdes : l'inauguration a vu un robot appelé « Matador » poursuivre le combat même après avoir été décapité par son adversaire</font></b><br />
<br />
<b>La société chinoise EngineAI a récemment organisé la toute première ligue de combat libre pour robots humanoïdes grandeur nature. La compétition a mis en scène le modèle T800, une machine sophistiquée de 173 cm conçue initialement pour la logistique industrielle. L'événement a marqué les esprits lorsqu'un robot humanoïde appelé « Matador » a continué à porter des coups malgré une décapitation spectaculaire provoquée par un coup de pied adverse. Outre le divertissement, ces affrontements servent de tests de résistance en conditions réelles pour évaluer la robustesse et la modularité des composants de ces machines avant une production de masse.</b><br />
<br />
En juillet 2026, la chine a inauguré la toute première compétition de combat libre pour robots humanoïdes de taille humaine, nommée Ultimate Robot Knock-out Legend (URKL). Cet événement, organisé à Shenzhen par l'entreprise EngineAI, rassemble 32 équipes finalistes issues d'universités prestigieuses du monde entier, telles que Stanford, Berkeley ou encore Tsinghua. Le prix est une ceinture en or estimée à environ 1,48 million de dollars.<br />
<br />
Pour concourir, toutes les équipes doivent utiliser un modèle de robot humanoïde standardisé fourni par l'organisateur, le T800. Les équipes ont la mission d'optimiser ce modèle en développant des armures personnalisées et des améliorations techniques. L'objectif officiel d'EngineAI avec ce tournoi est de promouvoir « l'innovation technologique et la collaboration mondiale » tout en offrant une plateforme de développement pour la robotique.<br />
<br />
Les robots « combattants » sont évalués par des juges sur la base de critères tels que le contrôle des mouvements, les algorithmes d’équilibre, la perception, la prise de décision, les systèmes de propulsion et la protection structurelle. Plus de 200 équipes étaient initialement inscrites, en provenance de 10 pays.<br />
<br />
<b><font size="3">Un affrontement spectaculaire marqué par une décapitation</font></b><br />
<br />
La phase finale a début le 16 juillet 2026. Lors de la soirée d'ouverture, l'attention s'est focalisée sur un affrontement impressionnant entre deux machines nommées White Eagle et Matador. Au cours du combat, White Eagle a asséné un coup de pied au crâne de son adversaire, ce qui a partiellement détaché la tête de Matador. Étonnamment, les deux robots ont continué à échanger des coups alors que la tête de Matador pendillait dans le vide.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/vpyO73jyx1g?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
Matador a fini par chuter, écrasant sa tête au sol, et lorsqu'il a tenté de se relever, celle-ci s'est complètement séparée de son corps. Il a tout de même continué à se battre, ce qui suggère que les composants informatiques vitaux et la source d'alimentation se trouvent vraisemblablement dans le torse du robot. Après sa victoire par décapitation, White Eagle a effectué une danse de célébration en imitant la contraction de ses biceps devant la foule. <br />
<br />
L'acteur Donnie Yen était présent dans le public et s'est montré visiblement choqué par la précision de cette attaque. Le robot a réussi à réaliser un impressionnant coup de pied sauté, mieux que Conor McGregor, qui s’était blessé lors de l’UFC 329 en tentant un coup de pied bien moins exigeant physiquement.<br />
<br />
Certains critiques ne semblent toutefois pas impressionnés par cette démonstration. « Ils ont prouvé que les robots savaient bien danser et donner des coups de poing. Aucune de ces deux choses n’a de valeur commerciale. Et si on montrait qu’ils sont capables d’effectuer des tâches utiles sur le plan commercial qui nécessitent de la dextérité manuelle ? Comme assembler un iPhone… ou faire de la plomberie, par exemple », a commenté un critique.<br />
<br />
<b><font size="3">Les prouesses technologiques sous-tendant le modèle T800</font></b><br />
<br />
Le T800, la machine au cœur de cette compétition, est un robot humanoïde initialement pensé par EngineAI pour des applications logistiques et industrielles, avec un coût unitaire avoisinant les 40 500 dollars. D'une taille d'environ 173 centimètres pour un poids compris entre 75 et 85 kilogrammes, le robot humanoïde T800 possède 29 articulations mobiles lui permettant de reproduire une vaste gamme de mouvements humains « complexes ».<br />
<br />
Selon EngineAI, sa conception inclut des panneaux en alliage d'aluminium de qualité aéronautique, des capteurs LiDAR et un radar omnidirectionnel à 360 degrés. En outre, le T800 est équipé d'un système de refroidissement actif et d'une batterie robuste qui lui garantissent une autonomie pouvant atteindre quatre heures d'activité intense, ce qui est indispensable pour exécuter des frappes et des manœuvres d'arts martiaux très exigeantes.<br />
<br />
Ce système embarqué (capteurs LiDAR, caméras stéréo et RGB, radar omnidirectionnel à 360 degrés...) est capable d'effectuer un traitement des données environnementales à la milliseconde près. La force physique du T800 est remarquable, affichant un couple articulaire pouvant atteindre 450 newtons-mètres. <br />
<br />
C'est la combinaison de cette robustesse et de ces technologies de pointe qui permet au T800 d'exécuter des actions complexes inspirées des arts martiaux, incluant des combinaisons de coups de poing, des coups de pied circulaires et des coups de pied sautés. « C'est troublant à voir, surtout quand ils se relèvent. Il a été pensé pour des applications logistiques et industrielles, mais ne sera-t-il pas détourné pour la guerre, s'interroge un critique.<br />
<br />
<b><font size="3">Un banc d'essai visant à préparer une production en masse</font></b><br />
<br />
Au-delà du simple divertissement sportif, la nouvelle ligue URKL fonctionne comme un véritable laboratoire de test en conditions extrêmes pour ces prototypes de robot. Les chocs violents subis par les robots fournissent à EngineAI des données inestimables pour améliorer la modularité, renforcer les fixations et perfectionner les algorithmes de récupération après une chute, dans l'optique d'une utilisation future dans des entrepôts logistiques.<br />
<br />
EngineAI a pour ambition de lancer la production en série de ces machines d'ici la mi-2026. Dans un communiqué de presse en mai dernier, il a annoncé la création d’un site de production de 12 000 mètres carrés et vise à doter ce site d’une capacité de production de 10 000 unités de son robot phare, le T800.<br />
<br />
Zhao Tongyang, fondateur et PDG d'EngineAI, a révélé la vitesse à laquelle son entreprise, fondée en 2023, se développe dans le domaine des robots humanoïdes : « de notre premier prototype en 2024 à la production à petite échelle de plusieurs centaines d’unités PM01 en 2025, en passant par le bond qualitatif vers une capacité de livraison de 10 000 unités, nous entrons dans une nouvelle phase d’industrialisation et de commercialisation ».<br />
<br />
Le PM01 susmentionné a été le premier robot à réussir un saut périlleux avant. Même si l’UFC robotisé ne remplacera probablement pas les sports de combat réels entre êtres humains dans un avenir proche, les capacités de ces robots humanoïdes ne cessent de s’améliorer à mesure que le secteur se développe, ce qui pourrait inquiéter ceux qui se méfient d’une technologie aussi puissante, notamment un détournement de leur usage initial.<br />
<br />
Selon certains critiques, cet événement sert de vitrine commerciale à une technologie à double usage. Le combat en cage est présenté comme du divertissement, mais il valide en conditions réelles la stabilité, l'équilibre et la résistance aux chocs des robots humanoïdes. Ces capacités sont directement transférables à des applications militaires ou policières. <a href="https://embarque.developpez.com/actu/382012/" target="_blank">L'Ukraine et la Russie utilisent déjà massivement des robots dans la guerre qui les oppose</a>.<br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Quel est votre avis sur le sujet ?<br />
:fleche: Que pensez-vous des caractéristiques techniques du robot T800 d'EngineAI ?<br />
:fleche: Que vous inspire cette compétition de combat entre robots humanoïdes ? La trouvez-vous utile ?<br />
<br />
<b>Voir aussi</b><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/382012/" target="_blank">L'Ukraine dit avoir déployé des « robots terrestres » à la place de soldats lors de plus de 21 000 missions au premier trimestre. Des soldats affirment que le front ressemble à l'univers Terminator</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/383838/" target="_blank">Grâce aux robots, l'Ukraine parle désormais de victoire, et non plus seulement de survie. Un nombre croissant de ces engins autonomes sont pilotés par l'IA, ce qui suscite des préoccupations éthiques</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/359670/" target="_blank">Les robots tueurs de la Chine arrivent : les grandes puissances ont commencé à développer des &quot;robots tueurs&quot; entièrement autonomes et dotés d'une IA pour remplacer leurs soldats sur le champ de bataille</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Mathis Lucas</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184746/general-developpement/programmation-systeme/embarque/chine-accueille-toute-premiere-competition-d-ufc-opposant-robots-humanoides-monde/</guid>
		</item>
		<item>
			<title><![CDATA[[MicroPython]Polices Truetype Micropython pour afficheurs matriciels]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184744&amp;goto=newpost</link>
			<pubDate>Mon, 20 Jul 2026 09:17:34 GMT</pubDate>
			<description><![CDATA[Bonjour à tous :D, 
 
J'ai le...]]></description>
			<content:encoded><![CDATA[<div>Bonjour à tous :D,<br />
<br />
J'ai le plaisir de vous proposer le tutoriel<br />
<a href="https://herve-troadec.developpez.com/tutoriels/micropython/fontes" target="_blank"><div style="text-align: center;"><font size="5"><b>Polices Truetype Micropython pour afficheurs matriciels</b></font></div></a><br />
portant sur la manipulation des polices Truetype ou Opentype avec MicroPython pour l'affichage sur écrans matriciels pilotés par microcontrôleur.<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p677639d1784538184/general-developpement/programmation-systeme/embarque/micropython-polices-truetype-micropython-afficheurs-matriciels/img4.png/" border="0" alt="Nom : img4.png
Affichages : 2992
Taille : 168,3 Ko"  style="float: CONFIG" /></div><br />
<div class="bbcode_container">
	<div class="bbcode_description">Citation:</div>
	<div class="bbcode_quote printable">
		<hr />
		
			MicroPython implémente la classe FrameBuffer pour gérer l’affichage sur les écrans matriciels tels que les écrans OLED, LCD ou TFT. Cette classe fournit, entre autres, une fonction destinée à afficher du texte sur ces écrans.<br />
Pour afficher du texte, cette fonction doit disposer d’une fonte au format bitmap. FrameBuffer fournit donc une fonte de ce type. Cette fonte est à chasse fixe et chaque caractère est dessiné dans une matrice de 8×8 pixels. Si, compte tenu des dimensions courantes des écrans, elle permet un remplissage optimal de la zone d’affichage, elle présente malgré tout trois inconvénients majeurs :<br />
    • sa taille est insuffisante pour assurer un confort de lecture correct ;<br />
    • elle n’est actuellement pas modifiable, et rien ne laisse penser qu’elle le sera dans un avenir proche ;<br />
    • elle ne dispose que du sous-ensemble imprimable des caractères ASCII, donc codés sur 7 bits, s’étendant de 32 à 126, ce qui interdit notamment l’affichage des signes diacritiques utilisés dans la langue française.<br />
Dans ce tutoriel, nous allons voir comment générer des fontes bitmap à partir des fontes Truetype vectorielles et comment les utiliser pour réaliser un affichage digne de ce nom, dans les limites, bien sûr, des contraintes liées au matériel.<br />
Nous verrons également comment optimiser l’utilisation de la RAM en pré-compilant les fichiers.
			
		<hr />
	</div>
</div>Bonne lecture,<br />
amicalement,<br />
naute</div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p677639d1784538184/general-developpement/programmation-systeme/embarque/micropython-polices-truetype-micropython-afficheurs-matriciels/img4.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>naute</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184744/general-developpement/programmation-systeme/embarque/micropython-polices-truetype-micropython-afficheurs-matriciels/</guid>
		</item>
		<item>
			<title>Une voiture autonome de Waymo a livré à la police des adolescents qui se comportaient mal</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184552&amp;goto=newpost</link>
			<pubDate>Wed, 08 Jul 2026 12:58:11 GMT</pubDate>
			<description>*Une voiture Waymo livre à la...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Une voiture Waymo livre à la police des adolescents qui se comportaient mal, après qu'un employé de Waymo a alerté les forces de l'ordre et immobilisé le véhicule à un endroit où les agents ont pu procéder à l'arrestation</font></b><br />
<br />
<b>Un véhicule autonome de Waymo a livré deux adolescents à la police de San Mateo, en Californie, après qu’un employé de l’entreprise, qui travaillait à distance, a détecté un comportement dangereux à l’intérieur du véhicule sans conducteur. Âgés de 15 ans, les deux adolescents auraient bu de l’alcool et tiré des billes Orbeez sur d’autres véhicules à l’aide d’un pistolet jouet. L'employé de Waymo a alerté les forces de l'ordre, puis a immobilisé le véhicule à distance dans un endroit sûr afin de permettre aux agents de procéder à l'arrestation des passagers en toute sécurité.</b><br />
<br />
Le rôle joué par l’opérateur de Waymo dans cet incident s’inscrit dans un débat de fond sur le degré d'autonomie réel des robotaxis et sur la place de la supervision humaine dans leur fonctionnement. Quelques mois auparavant, Waymo avait reconnu devant le Sénat américain que ses véhicules autonomes <a href="https://embarque.developpez.com/actu/380052/Waymo-admet-ce-que-Tesla-cache-ses-vehicules-autonomes-font-appel-a-des-operateurs-humains-bases-aux-Philippines-Robotaxis-la-plus-grande-arnaque-semantique-de-la-decennie-Tech/" target="_blank">s'appuient régulièrement sur des opérateurs humains</a> basés aux Philippines pour assister certaines situations. Cette déclaration a alimenté le débat sur la définition même des « voitures autonomes » et a soulevé plusieurs questions techniques, sécuritaires et géopolitiques.<br />
<br />
Waymo vous surveille en permanence, c'est ce que deux adolescents en vacances d'été ont découvert cette semaine. Le lundi 6 juillet 2026, en début d'après-midi, ces adolescents de 15 ans se trouvaient à bord d'une voiture autonome sans conducteur dans les environs de San Mateo, en Californie. Ils avaient consommé de l'alcool à l'intérieur du taxi Waymo et tiré des billes Orbeez avec un pistolet jouet sur d'autres véhicules.<br />
<br />
Un employé de Waymo, qui surveillait le véhicule à distance, a réussi à leurrer les adolescents indisciplinés, ont indiqué les autorités. Il a expliqué aux jeunes passagers que le véhicule rencontrait des problèmes mécaniques et devait s'arrêter. À l'insu des adolescents, l'employé de Waymo avait également appelé la police de San Mateo pour signaler qu'un coup de feu avait été tiré depuis la voiture.<br />
<br />
« Ils ont aperçu dans le véhicule ce qu’ils ont décrit comme une arme à feu, de couleur noire, et ont à un moment donné pensé que les passagers faisaient feu », a déclaré Jeanine Luna, porte-parole de la police de San Mateo.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/dKIqEgZDKcM?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
La voiture Waymo s'est arrêtée sur le parking d'un centre commercial situé à proximité d'El Camino Real et de l'autoroute 92, où cinq policiers l'attendaient.<br />
<br />
« Nous avons procédé à un contrôle routier à haut risque. Waymo a immobilisé le véhicule à un endroit où nous avons pu nous installer en toute sécurité. À ce moment-là, nous les avons fait sortir du véhicule, nous avons procédé à une fouille du véhicule, puis nous avons trouvé ce que nous avons identifié comme étant des Orbeez », a déclaré Jeanine Luna.<br />
<br />
Les passagers, âgés de 15 ans, ont été interpellés par la police puis remis à leurs parents. La police a transmis le dossier au parquet afin qu’il examine la possibilité de poursuites, notamment pour consommation d’alcool par des mineurs et comportement menaçant.<br />
<br />
« Parents, savez-vous où se trouvent vos adolescents ? Waymo, lui, le sait ! », a écrit la police.<br />
<br />
« Ce que les adolescents peuvent considérer comme un divertissement inoffensif peut avoir de réelles conséquences », a expliqué la porte-parole de la police de San Mateo. « Ça n’a rien de dangereux tant qu’on ne s’en sent pas menacé. Ce qu’on constate, c’est que des gens prennent des petits pistolets, des pistolets-jouets ou des pistolets à eau, et les peignent en noir pour qu’ils ressemblent à de vraies armes à feu. Et c’est là le problème, car pour un œil non averti, on va croire que c’est une vraie arme. »<br />
<br />
Alors que le recours à des opérateurs humains continue d'alimenter le débat sur les robotaxis, Waymo défend publiquement l'idée qu'une gestion transparente des risques liés à cette technologie est essentielle lors du déploiement des véhicules autonomes. En octobre 2025, la co-PDG de Waymo, Tekedra Mawakana, a déclaré que la société finirait par <a href="https://embarque.developpez.com/actu/377202/La-societe-acceptera-un-deces-cause-par-un-robotaxi-declare-la-co-PDG-de-Waymo-Tekedra-Mawakana/" target="_blank">accepter la possibilité d'un décès causé par un robotaxi</a>, à condition que les entreprises communiquent ouvertement sur leurs performances en matière de sécurité. Cette position illustre les défis auxquels le secteur est confronté pour concilier innovation, responsabilité et confiance du public.<br />
<br />
<b>Sources :</b> <a rel="nofollow" href="https://www.facebook.com/CityofSanMateoPolice" target="_blank">Service de Police de San Mateo</a>, <a rel="nofollow" href="https://www.facebook.com/watch/?v=2428145947684610" target="_blank">Publication de la police de San Mateo</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Quel est votre avis sur le sujet ?<br />
:fleche: Trouvez-vous cette initiative de Waymo crédible ou pertinente ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/379255/Un-passager-d-une-voiture-autonome-Waymo-saute-hors-du-vehicule-apres-qu-il-se-soit-arrete-sur-une-voie-ferree-pres-d-un-train-en-approche/" target="_blank">Un passager d'une voiture autonome Waymo saute hors du véhicule après qu'il se soit arrêté sur une voie ferrée près d'un train en approche</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/376939/Desesperes-de-mettre-fin-aux-detours-inutiles-des-vehicules-autonomes-Waymo-et-du-bruit-qu-ils-font-toute-la-nuit-dans-un-quartier-a-San-Francisco-des-residents-ont-essaye-un-cone-orange-avec-un-panneau/" target="_blank">Désespérés de mettre fin aux détours inutiles des véhicules autonomes Waymo et du bruit qu'ils font toute la nuit dans un quartier à San Francisco, des résidents ont essayé un cône orange avec un panneau</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/370493/Apres-80-millions-de-kilometres-les-robotaxis-de-Waymo-ont-beaucoup-moins-d-accidents-que-les-conducteurs-humains-mais-des-defaillances-techniques-persistantes-remettent-en-cause-leur-securite/" target="_blank">Après 80 millions de kilomètres, les robotaxis de Waymo ont beaucoup moins d'accidents que les conducteurs humains, mais des défaillances techniques persistantes remettent en cause leur sécurité</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Anthony</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184552/general-developpement/programmation-systeme/embarque/voiture-autonome-waymo-livre-police-adolescents-se-comportaient-mal/</guid>
		</item>
		<item>
			<title>Une femme de 76 ans a été tuée après qu’une Tesla Model 3 en Autopilot s’est encastrée dans sa maison</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184321&amp;goto=newpost</link>
			<pubDate>Mon, 22 Jun 2026 11:25:40 GMT</pubDate>
			<description>*Une femme de 76 ans a été...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Une femme de 76 ans a été tuée après qu’une Tesla Model 3 en mode Autopilot s’est encastrée à « grande vitesse » dans sa maison au Texas</font></b>  <br />
<br />
<b>Une femme de 76 ans a trouvé la mort après qu'une Tesla a foncé dans une maison dans la région de Katy, selon les autorités. Selon le bureau du constable du 5e district du comté de Harris, la Tesla a percuté une maison située dans le bloc 21300 de Rose Hollow Lane, près de Park Brush Lane, à 20 h 30. Le conducteur a déclaré aux enquêteurs qu’il avait activé l'Autopilot de la Tesla. Le bureau du shérif du comté de Harris (HCSO) a indiqué que le conducteur n’avait pas réussi à rester sur sa voie, avait quitté la chaussée et avait percuté la maison à grande vitesse.</b><br />
<br />
Tesla est une multinationale américaine spécialisée dans l’automobile et les énergies propres. Basée à Austin, au Texas, elle conçoit, fabrique et commercialise des véhicules électriques à batterie (BEV), des systèmes de stockage d'énergie à batterie fixes (allant de l'échelle domestique à celle du réseau), des panneaux solaires et des tuiles solaires, ainsi que des produits et services connexes. Tesla est l’une des entreprises les plus valorisées au monde en termes de capitalisation boursière. <br />
<br />
Tesla a fait l'objet de poursuites judiciaires, de boycotts, d'une surveillance étroite de la part des pouvoirs publics et de critiques journalistiques, en raison d'allégations concernant de multiples cas de représailles à l'encontre de lanceurs d'alerte, de violations des droits des travailleurs telles que le harcèlement sexuel et des pratiques antisyndicales, de défauts de sécurité ayant entraîné des dizaines de rappels de véhicules, de l'absence de service de relations publiques, ainsi que de déclarations controversées de Musk, notamment des promesses exagérées concernant la technologie d'aide à la conduite de l'entreprise et les calendriers de lancement de ses produits. <br />
<br />
Début juin 2026, <a href="https://embarque.developpez.com/actu/383731/Enquete-Les-entraineurs-de-l-IA-de-conduite-autonome-de-Tesla-ne-lui-font-pas-confiance-7-des-9-specialistes-de-l-etiquetage-des-donnees-admettent-qu-ils-ne-monteraient-pas-a-bord-d-une-Tesla-en-mode-FSD/" target="_blank">une enquête auprès de neuf anciens étiqueteurs de données de Tesla et un ancien ingénieur spécialisé dans la conduite autonome</a> a révélé leur avis sur le mode Full Self-Driving (FSD) de Tesla. Sept de ces neuf spécialistes des données ont déclaré qu’ils ne monteraient pas à bord d’une Tesla fonctionnant en mode FSD. Les résultats de l’enquête, qui sont sujets à controverse, ravivent le débat en matière de comparaison entre les humains et les ordinateurs en tant que conducteurs de véhicules.<br />
<br />
Une enquête qui rappelle <a href="https://embarque.developpez.com/actu/363187/Le-Full-Self-Driving-de-Tesla-commet-des-erreurs-occasionnelles-dangereuses-lors-d-un-test-sur-plus-de-1600-kilometres-les-conducteurs-ont-du-intervenir-plus-de-75-fois-alors-que-le-FSD-etait-actif/" target="_blank">un test du cabinet de recherche automobile indépendant AMCI du FSD sur plus de 1600 kilomètres</a>. Au cours du processus d'examen, les conducteurs ont dû intervenir plus de 75 fois. Selon le test, le système Full Self-Driving (FSD) supervisé peut fonctionner parfaitement des dizaines de fois dans le même scénario, jusqu'à ce qu'il se dérègle de manière inattendue et nécessite l'intervention du conducteur. Un rapport qui confirme qu'on ne peut pas faire totalement confiance au système de conduite autonome de Tesla.<br />
<br />
Récemment, une femme de 76 ans a trouvé la mort après qu'une Tesla a foncé dans une maison dans la région de Katy, selon les autorités. Selon le bureau du constable du 5e district du comté de Harris, la Tesla a percuté une maison située dans le bloc 21300 de Rose Hollow Lane, près de Park Brush Lane, à 20 h 30. Le conducteur a déclaré aux enquêteurs qu’il avait activé l'Autopilot de la Tesla.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/qAwE7wAUjg0?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
« <i>Nous cherchons toujours à déterminer ce qui a empêché le conducteur de contrôler la vitesse de son véhicule juste avant l’accident </i>», a déclaré le sergent A. Turman. « <i>Nous avons interrogé des personnes connaissant bien les Tesla, ainsi que le conducteur impliqué dans l’accident, afin de déterminer dans quelle mesure le contrôle exercé par le conducteur sur son véhicule a joué un rôle dans cet accident.</i> »<br />
<br />
Les autorités ont indiqué que le conducteur de la Tesla avait été transporté à l’hôpital en ambulance, et que la femme âgée, qui se trouvait à l’intérieur de la maison, avait été évacuée par hélicoptère vers l’hôpital Memorial Hermann. Selon le bureau du shérif du comté de Harris, la femme a ensuite été déclarée décédée. <br />
<br />
Bryan Diaz, un voisin, a expliqué que lui et sa famille étaient dehors en train de fêter un anniversaire lorsque l’accident s’est produit. « <i>Les enfants avaient peur, tout comme ma mère et mes oncles</i> », a déclaré Diaz. « <i>Ce qui vient de se passer est complètement fou, surtout que ça s’est passé juste devant nous.</i> » Diaz a déclaré que la Tesla semblait rouler à vive allure sur la route avant que le véhicule ne parvienne pas à s’arrêter et percute la maison.<br />
<br />
Le bureau du shérif du comté de Harris (HCSO) a indiqué que le conducteur n’avait pas réussi à rester sur sa voie, avait quitté la chaussée et avait percuté la maison à grande vitesse. « <i>Elle a tout simplement foncé droit dans leur maison, tout s’est passé si vite</i> », a déclaré Diaz. Les autorités ont précisé que l’enquête était toujours en cours.<br />
<br />
Début janvier 2026, <a href="https://embarque.developpez.com/actu/379141/Autopilot-FSD-qui-decoit-accidents-mortels-Marketing-trompeur-condamnations-image-politique-d-Elon-Musk-desastreuse-les-ventes-de-Tesla-chutent-de-28-pourcent-dans-toute-l-Europe-en-2025/" target="_blank">les chiffres définitifs des performances européennes de Tesla pour 2025</a> ont montré que les ventes se sont effondrées de 27,8 %, passant de 326 000 unités à 235 322, certains pays comme l'Allemagne et la France affichant des résultats nettement moins bons (respectivement -48,4 % et -37,5 %). Le pionnier des véhicules électriques (VE) est désormais confronté à de sérieux défis posés par les nouveaux entrants chinois sur le marché, ainsi qu'à une aversion persistante pour les activités politiques de son PDG, Elon Musk. <br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que ce rapport est crédible ou pertinent ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/381357/Le-systeme-de-detection-de-degradation-du-FSD-de-Tesla-echoue-a-detecter-les-defaillances-ou-a-prevenir-les-conducteurs-en-cas-de-visibilite-reduite-provoquant-plusieurs-accidents-dont-un-mortel/" target="_blank">Le système de « détection de dégradation » du FSD de Tesla échoue à détecter les défaillances ou à prévenir les conducteurs en cas de visibilité réduite, provoquant plusieurs accidents, dont un mortel</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/375504/Tesla-modifie-la-signification-du-terme-Full-Self-Driving-et-renonce-a-sa-promesse-d-offrir-une-conduite-autonome-sans-surveillance-les-problemes-techniques-persistent-et-le-logiciel-rebute-les-clients/" target="_blank">Tesla modifie la signification du terme « Full Self-Driving » et renonce à sa promesse d'offrir une conduite autonome sans surveillance, les problèmes techniques persistent et le logiciel rebute les clients</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/378956/Une-famille-accuse-l-Autopilot-et-la-fonction-de-guidage-automatique-de-sa-Tesla-d-avoir-fait-devier-la-voiture-sur-la-trajectoire-d-un-camion-venant-en-sens-inverse-causant-la-mort-de-4-proches/" target="_blank">Une famille accuse l'Autopilot et la fonction de guidage automatique de sa Tesla d'avoir fait dévier la voiture sur la trajectoire d'un camion venant en sens inverse, causant la mort de 4 proches</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Alex</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184321/general-developpement/programmation-systeme/embarque/femme-76-ans-ete-tuee-apres-qu-tesla-model-3-autopilot-s-encastree-maison/</guid>
		</item>
		<item>
			<title><![CDATA[Grâce à l'IA et à une interface cerveau-ordinateur, un patient atteint de SLA est capable d'exercer un emploi]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184271&amp;goto=newpost</link>
			<pubDate>Thu, 18 Jun 2026 07:23:34 GMT</pubDate>
			<description><![CDATA[*Grâce à l'IA et à une...]]></description>
			<content:encoded><![CDATA[<div><b><font size="4">Grâce à l'IA et à une interface cerveau-ordinateur, un patient atteint de SLA et incapable de parler peut exercer un emploi à temps plein</font></b> <br />
<b><font size="1">Les interfaces BCI illustrent le dilemme entre utilité et intrusivité</font></b><br />
<br />
<b>Selon des chercheurs de l'université de Californie à Davis, une interface cerveau-ordinateur implantée a permis à Casey Harrell, un patient atteint de SLA (sclérose latérale amyotrophique) incapable de parler, de synthétiser des phrases à partir de son activité cérébrale avec une précision de 99 % lors de tests contrôlés et d'environ 92 % dans la vie quotidienne. Des rapports font état de ce que le système est utilisé à domicile depuis 2023, aidant ce dernier à communiquer naturellement, à contrôler un ordinateur et à reprendre un travail à temps plein sans que les chercheurs aient besoin de superviser chaque session. Le système ravive le débat sur le rapport entre utilité et intrusivité étant donné qu’il nécessite <a href="https://intelligence-artificielle.developpez.com/actu/332749/Une-nouvelle-interface-cerveau-ordinateur-permet-a-un-homme-de-communiquer-avec-son-fils-et-de-lui-demander-une-biere/" target="_blank">une ouverture de la boite crânienne pour son insertion</a>. </b><br />
<br />
Une équipe de scientifiques de l’Université de Californie à Davis a publié un article détaillant une étude menée sur plusieurs années portant sur un système d’interface cerveau-ordinateur (BCI) implanté chez un patient atteint de sclérose latérale amyotrophique (SLA, également connue sous le nom de maladie de Lou Gehrig). Cette maladie détruit les motoneurones et entraîne une perte du contrôle moteur, puis une paralysie. Selon l’équipe, leur patient, Casey Harrell, vit depuis 2023 avec des implants cérébraux qui continuent de fonctionner à date, lui permettant non seulement de contrôler le curseur d’un ordinateur par la pensée, mais aussi de parler. Le neurochirurgien de Davis, David Brandman, co-chercheur principal et co-auteur principal de l’article, ainsi que le chirurgien qui a posé l’implant de Casey Harrell, décrivent les résultats publiés comme le franchissement d’un cap dans la technologie des implants cérébraux : non seulement celui de Casey Harrell fonctionne bien au quotidien depuis 2023, mais il est également d’une précision incroyable.<br />
<br />
Lors de tests contrôlés, le système a réussi à synthétiser des phrases à partir de l’activité cérébrale du patient avec une précision de 99 % ; en dehors du laboratoire, dans le cadre d’une utilisation quotidienne, Harrell a tout de même estimé que le système était précis dans 92 % des cas. « Ce qui compte le plus à mes yeux, c’est que cela permette une communication quotidienne à un homme qui souhaite parler mais en est incapable », a déclaré Brandman lors d’une interview. « Bien qu’il soit paralysé, [Harrell] a repris le travail à temps plein et entretient des conversations enrichissantes avec sa fille, qui n’a jamais entendu le son de sa voix. »<br />
<br />
Les travaux antérieurs dans le domaine de l’interface cerveau-ordinateur (BCI) exigeaient soit que les chercheurs soient présents au domicile du patient chaque fois que celui-ci utilisait la technologie, soit que le patient se rende chez les chercheurs. Ce n’est pas le cas ici : le système permet à l’équipe de soins à domicile de le connecter elle-même au dispositif, ce qui lui a permis de l’utiliser pendant plus de 3800 heures au cours des dernières années. D’après la date de dépôt de l’étude, cela signifierait que Harrell utilisait le dispositif en moyenne plus de cinq heures par jour. « C’est une vie plus riche en activités dynamiques, avec mes amis, ma famille et mes collègues, et c’est quelque chose qui me permet de communiquer de manière plus naturelle que n’importe quelle autre technologie que j’ai pu essayer », a déclaré Harrell à l’UC Davis via son système d’interface cerveau-ordinateur (BCI).<br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p677021d1781767247/general-developpement/programmation-systeme/embarque/grace-l-ia-interface-cerveau-ordinateur-patient-atteint-sla-capable-d-exercer-emploi/0.jpg/" border="0" alt="Nom : 0.jpg
Affichages : 679
Taille : 130,5 Ko"  style="float: CONFIG" /></div><br />
<b><font size="3">Le dispositif vient allonger une longue liste de ceux à controverse en raison du dilemme entre leur potentielle utilité et les dangers en lien avec leur utilisation.</font></b><br />
<br />
En Suède par exemple, on compte des milliers de personnes avec des puces RFID sous-cutanées. C’est le genre de chose qu’on ne voit en principe que dans les films de science-fiction, mais depuis 2015, les Suédois ont translaté cette pratique dans la réalité. <a href="https://www.developpez.com/actu/81037/Le-personnel-d-une-entreprise-experimente-une-puce-d-identification-sous-la-peau-pour-acceder-aux-bureaux-et-aux-photocopieurs/" target="_blank">Après l’ouverture du bal par les employés de la startup scandinave Epicenter</a>, on assiste pratiquement à un phénomène de mode dans le pays depuis 2018.<br />
<br />
De façon brossée, <a href="https://www.developpez.com/actu/128410/Suede-150-employes-d-une-entreprise-se-sont-fait-implanter-des-puces-electroniques-qui-les-transforment-en-terminaux-de-communication-NFC/" target="_blank">pour être transformées en terminal de communication NFC</a>, les puces électroniques sont injectées entre le pouce et l’index pour 180 $. Il s’agit de bornes de communication en champ proche (CCP ou NFC en anglais) de la taille d’un grain de riz. Pour rappel, la technologie CCP permet des communications de proximité (quelques centimètres) entre un lecteur et n’importe quel terminal mobile (tag CCP), ou entre les terminaux eux-mêmes, et ce, à un débit de 424 kbit à la seconde. Concrètement, l’humain (devenu tag CCP) peut communiquer avec un terminal par le biais d’un champ magnétique.<br />
<br />
Certains demandeurs sont issus du dynamique milieu des startups du pays, mais aussi de « gros » comme les compagnies de chemin de fer. Les usages sont multiples : stockage (des coordonnées en cas d’urgence, de profils de réseaux sociaux, de billets électroniques pour les événements et les voyages, etc.), accès aux domiciles, bureaux, gymnases, etc. « Les puces sont conçues pour accélérer les opérations de routine et simplifier la vie », écrit NPR. <br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/5N-mqiMuS-I?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<a href="https://www.developpez.com/actu/126636/Neuralink-d-Elon-Musk-proposera-bientot-des-ordinateurs-a-implanter-dans-le-cerveau-pour-permettre-aux-humains-de-rivaliser-avec-l-IA/" target="_blank">Les ordinateurs à insérer dans le crâne, sur lesquels travaille Neuralink d’Elon Musk</a>, sont tout aussi sujets à controverse. En effet, la technologie est intrusive : elle demande d’ouvrir le corps humain pour son insertion. L’utilité mise en avant par l’entreprise derrière la technologie est pourtant noble : augmenter les capacités des humains dans le but de les préparer à une ère d’apocalypse durant laquelle les robots pourraient chercher à dominer sur les hommes. <br />
<br />
Source : <a rel="nofollow" href="https://health.ucdavis.edu/news/headlines/brain-computer-interface-enables-independent-accurate-communication-for-man-living-with-als/2026/06" target="_blank">Udavis</a> <br />
<br />
<b>Et vous ?</b><br />
<br />
 :fleche: Accepteriez-vous de recevoir un implant cérébral pour gagner en productivité dans vos tâches journalières de développeur informatique ?<br />
:fleche: Que pensez-vous d’un monde dans lequel les gens se baladeraient dans les rues en arborant de tels dispositifs ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/53273/Un-mini-implant-high-tech-analyse-en-temps-reel-le-sang-et-signale-via-un-smartphone-l-approche-d-une-attaque-cardiaque/" target="_blank">Un mini-implant high-tech analyse en temps réel le sang et signale via un smartphone l'approche d'une attaque cardiaque</a><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/96529/Le-Pentagone-met-au-point-un-prototype-d-interface-cerveau-machine-ne-necessitant-pas-de-percer-de-trou-dans-la-tete-du-sujet/" target="_blank">Le Pentagone met au point un prototype d'interface cerveau-machine ne nécessitant pas de percer de trou dans la tête du sujet</a><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/116817/Huit-salaries-d-une-societe-en-Belgique-se-sont-fait-volontairement-implanter-sous-la-peau-une-puce-electronique-qui-fait-office-de-badge/" target="_blank">Huit salariés d'une société en Belgique se sont fait volontairement implanter sous la peau une puce électronique qui fait office de badge</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p677021d1781767247/general-developpement/programmation-systeme/embarque/grace-l-ia-interface-cerveau-ordinateur-patient-atteint-sla-capable-d-exercer-emploi/0.jpg/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Patrick Ruiz</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184271/general-developpement/programmation-systeme/embarque/grace-l-ia-interface-cerveau-ordinateur-patient-atteint-sla-capable-d-exercer-emploi/</guid>
		</item>
		<item>
			<title>Les véhicules autonomes et leurs IA parviendront-ils à mettre un terme aux embouteillages ?</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184253&amp;goto=newpost</link>
			<pubDate>Tue, 16 Jun 2026 17:15:07 GMT</pubDate>
			<description>*Les véhicules autonomes et...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Les véhicules autonomes et leurs IA parviendront-ils à mettre un terme aux embouteillages ? Les données à disposition suggèrent qu’ils y contribuent en roulant à vide sur 40 % de leur trajet journalier</font></b><br />
<br />
<b>L'ère des robotaxis, longtemps réservée à la science-fiction, est désormais une réalité, du moins <a href="https://embarque.developpez.com/actu/374484/Lyft-s-associe-au-geant-chinois-Baidu-pour-mettre-en-circulation-ses-robotaxis-Eurobocab-dans-les-rues-europeennes-en-utilisant-les-vehicules-Apollo-qui-proposent-deja-des-trajets-autonomes-a-travers-la-Chine/" target="_blank">dans quelques villes américaines, européennes ou chinoises</a>. Les partisans de cette technologie, qui a attiré au moins 100 milliards de dollars d'investissements, affirment que les robotaxis seront plus sûrs que les véhicules conduits par des humains. La sécurité n'est pas le seul argument de vente : les véhicules autonomes sont aussi attendus sur l’axe de la réduction voire de la mise à terme des embouteillages. Les avis divergent sur cette perspective.</b><br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p676987d1781629769/general-developpement/programmation-systeme/embarque/vehicules-autonomes-leurs-ia-parviendront-mettre-terme-aux-embouteillages/0.png/" border="0" alt="Nom : 0.png
Affichages : 539
Taille : 539,9 Ko"  style="float: CONFIG" /></div><br />
<b><font size="3">Des données issues des rapports de Waymo à la Commission des services publics de Californie montrent que les robotaxis ne sont pas plus performants que les services de VTC tels que Lyft et Uber pour ce qui est de réduire les embouteillages</font></b><br />
<br />
Cette étude, publiée dans la revue Transport Findings analyse des données couvrant la période d’août 2023 à décembre 2025, soit environ 1 000 jours. Au cours de cette période, les robotaxis de Waymo ont effectué 13,8 millions de trajets pour 19,3 millions de passagers, sur une distance totale parcourue de 86,3 millions de miles (138,8 millions de km), avec une croissance d’environ 15 % par mois. Elle avait pour objectif de déterminer quelle proportion de ces trajets était effectuée par des robotaxis vides — ce que l’on appelle les « trajets à vide » — et comment ce chiffre évoluait au fil du temps.<br />
<br />
Au départ, seuls 36 % des miles parcourus par Waymo l’étaient avec un passager à bord. Mais à la fin de la période étudiée, ce chiffre était passé à environ 56 %, avant de se stabiliser, a constaté Abdelhalim. Ainsi, environ 44 % des miles parcourus par Waymo le sont avec des véhicules électriques vides.<br />
<br />
Des arguments similaires concernant la réduction du trafic avaient déjà été avancés à l’époque au sujet des services de VTC. En 2014, d’autres chercheurs du MIT avaient publié une étude affirmant que ces services pourraient réduire le nombre de véhicules en circulation et diminuer le trafic. Deux des auteurs sont par la suite revenus sur leurs conclusions après que des données ont montré que les services de VTC augmentaient en réalité le trafic et les émissions de CO&#8322;, en partie parce que leur faible coût incitait les usagers à effectuer des trajets qu’ils n’auraient pas faits autrement. Ils ont fait remarquer que les robotaxis risquaient fort de tomber dans le même piège. (Une étude de 2018 a révélé que près de la moitié de l’augmentation du nombre de miles parcourus à San Francisco était imputable aux services de VTC.)<br />
<br />
Au total, environ 40 % de la distance totale parcourue par un chauffeur Lyft ou Uber se fait à vide, ce qui suggère qu’il y a peu de différence en termes d’embouteillages, qu’il y ait ou non un humain au volant, du moins pour le moment. En gros, les véhicules qu’ils soient autonomes ou avec chauffeurs humains, circulent une bonne partie de leur trajet global sans aucun passager pour se repositionner, aller chercher le prochain passager ou éviter les frais de stationnement urbain élevés. <br />
<br />
<div style="text-align: center;"><img src="https://www.developpez.net/forums/attachments/p676988d1781629796/general-developpement/programmation-systeme/embarque/vehicules-autonomes-leurs-ia-parviendront-mettre-terme-aux-embouteillages/1.png/" border="0" alt="Nom : 1.png
Affichages : 484
Taille : 126,9 Ko"  style="float: CONFIG" /></div><br />
<b><font size="3">Le volet logiciel fait partie des aspects pour lesquels certains observateurs sont d’avis que les véhicules dits autonomes sont sceptiques sur la perspective selon laquelle les véhicules autonomes  parviendront à mettre un terme aux embouteillages</font></b><br />
<br />
L’autonomie des véhicules se définit selon des paliers :<br />
<br />
<ul><li style="">	Niveau 0 : c’est l’automobiliste qui reste maître à bord ;</li><li style="">	Niveau 1 : l’ordinateur peut intervenir pour gérer la vitesse ou la direction (régulateur de vitesse, alerte distance de sécurité) mais le conducteur garde le contrôle du véhicule ;</li><li style="">	Niveau 2 : la voiture peut « se conduire » temporairement, en se garant toute seule par exemple (park assist). Le conducteur reste responsable de la conduite ;</li><li style="">	Niveau 3 : le conducteur peut déléguer la conduite à l’ordinateur dans certaines situations comme les bouchons. La fonction embouteillage du XC 90 de Volvo illustre parfaitement ce niveau. L’ordinateur peut aussi indiquer au conducteur quand il doit reprendre le véhicule en main ;</li><li style="">	Niveau 4 : plus besoin du conducteur dans certains cas prédéfinis ; le véhicule dépose son conducteur, se gare seul et revient chercher son propriétaire ;</li><li style="">	Niveau 5 : la voiture est totalement autonome et contrôle toutes les fonctions du véhicule. Le conducteur peut être présent ou non.</li></ul><br />
Mercedez Benz est devenue la première entreprise automobile à obtenir un certificat de conformité pour véhicules autonomes de niveau 3. Les rapports ont fait état de ce qu’un véhicule Waymo était équipé d’un Advanded Driving Systems de niveau 4 lorsqu’il a écrasé un chien à San Francisco à mi-parcours de l’année. Les débats portent désormais sur la possibilité de l’atteinte du stade de véhicules entièrement autonomes, c’est-à-dire, le niveau 5. En attendant d’y être, les véhicules autonomes pourront s’appuyer sur <a href="https://embarque.developpez.com/actu/361679/Une-nouvelle-technologie-qui-permet-aux-voitures-de-se-parler-les-Etats-Unis-publient-une-feuille-de-route-pour-accelerer-le-deploiement-de-cette-technologie-et-sauver-ainsi-des-milliers-de-vies/" target="_blank">le réseau V2X dont un plan de développement est paru en 2024</a>. Ce dernier permet aux véhicules de se parler et est donc susceptible de servir à l’un des objectifs visés qui est de réduire les embouteillages.  <br />
<br />
Le V2X fournit une connectivité par le biais de communications directes et en réseau. Dans le cadre du V2X direct, les véhicules échangent des messages fréquents et structurés par l'intermédiaire de dispositifs embarqués ou de seconde monte qui échangent en permanence la vitesse relative, la position et d'autres données pertinentes. Cette forme de communication garantit une connaissance à 360 degrés, même dans les situations où la visibilité est faible ou obstruée, par exemple dans les virages ou dans un brouillard épais.<br />
<br />
D'autre part, le V2X en réseau s'appuie sur les réseaux mobiles conventionnels pour permettre aux véhicules d'envoyer et de recevoir des messages. La communication V2X directe convient aux applications de sécurité nécessitant une faible latence, tandis que la communication V2X en réseau est plus adaptée au transport d'informations sur de longues distances, telles que des informations en temps réel sur le trafic et l'état des routes.<br />
<br />
Les communications V2X peuvent fournir aux usagers de la route des informations beaucoup plus précises sur les risques potentiels dans les situations de circulation. De ce fait, le V2X peut améliorer la sécurité des usagers de la route vulnérables à mesure que les capacités de l'infrastructure augmentent. Le partage d'informations clés entre les différentes parties du réseau de transport permet de réagir de manière à améliorer la sécurité, à prévenir les accidents, à optimiser les performances du système, à améliorer la mobilité et l'accessibilité des voyageurs, à améliorer l'efficacité de la circulation des marchandises, à atténuer les incidences négatives sur l'environnement et à remédier aux disparités en matière d'équité dans les transports.<br />
<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/--OdhLEertk?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
Le déploiement à grande échelle de cette technologie suscite néanmoins des doutes, notamment le financement et surtout la sécurité contre les cyberattaques ainsi que la protection de la vie privée. <br />
<br />
Source : <a rel="nofollow" href="https://findingspress.org/article/161870-millions-of-trips-waymo-empty-miles-california-s-first-thousand-days-of-commercial-robotaxi-service" target="_blank">Données waymo</a> <br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Partagez-vous le scepticisme de certains acteurs quant à la perspective selon laquelle les véhicules autonomes mettront un terme aux embouteillages ? Sinon, sur quels aspects vous basez-vous pour être d’avis qu’il faudrait plutôt être optimiste ?<br />
<br />
<b>Voir aussi :</b> <br />
<br />
:fleche: <a href="https://www.developpez.com/actu/329348/Les-conducteurs-de-Tesla-peuvent-jouer-a-des-jeux-video-dans-des-voitures-en-mouvement-cette-fonctionnalite-souleve-de-nouvelles-questions-de-securite-liees-a-la-distraction-au-volant/" target="_blank">Les conducteurs de Tesla peuvent jouer à des jeux vidéo dans des voitures en mouvement, cette fonctionnalité soulève de nouvelles questions de sécurité liées à la distraction au volant</a><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/329435/Le-Gouvernement-americain-demande-a-Tesla-pourquoi-les-gens-peuvent-jouer-a-des-jeux-video-dans-des-voitures-en-mouvement-la-fonctionnalite-fait-l-objet-d-un-examen/" target="_blank">Le Gouvernement américain demande à Tesla pourquoi les gens peuvent jouer à des jeux vidéo dans des voitures en mouvement, la fonctionnalité fait l'objet d'un examen</a><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/314538/Autopilot-de-Tesla-peut-etre-facilement-trompe-pour-fonctionner-sans-personne-sur-le-siege-du-conducteur-selon-Consumer-Reports-mais-vous-ne-devriez-pas-essayer-ca/" target="_blank">Autopilot de Tesla peut être &quot;facilement&quot; trompé pour fonctionner sans personne sur le siège du conducteur, selon Consumer Reports, mais « vous ne devriez pas essayer ça »</a><br />
<br />
:fleche: <a href="https://www.developpez.com/actu/316441/Tesla-doit-desormais-signaler-les-accidents-lies-a-son-Autopilot-au-gouvernement-ou-s-exposer-a-des-amendes-d-apres-une-decision-de-l-agence-federale-chargee-de-la-securite-routiere/" target="_blank">Tesla doit désormais signaler les accidents liés à son Autopilot au gouvernement ou s'exposer à des amendes, d'après une décision de l'agence fédérale chargée de la sécurité routière</a></div>


	<div style="padding:10px">

	

	
		<fieldset class="fieldset">
			<legend>Images attachées</legend>
				<div style="padding:10px">
				<img class="attach" src="https://www.developpez.net/forums/attachments/p676987d1781629769/general-developpement/programmation-systeme/embarque/vehicules-autonomes-leurs-ia-parviendront-mettre-terme-aux-embouteillages/0.png/" alt="" />&nbsp;<img class="attach" src="https://www.developpez.net/forums/attachments/p676988d1781629796/general-developpement/programmation-systeme/embarque/vehicules-autonomes-leurs-ia-parviendront-mettre-terme-aux-embouteillages/1.png/" alt="" />&nbsp;
			</div>
		</fieldset>
	

	

	

	</div>
]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Patrick Ruiz</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184253/general-developpement/programmation-systeme/embarque/vehicules-autonomes-leurs-ia-parviendront-mettre-terme-aux-embouteillages/</guid>
		</item>
		<item>
			<title><![CDATA[Un cambrioleur de San Francisco s'est enfui à bord d'un robotaxi Waymo]]></title>
			<link>https://www.developpez.net/forums/showthread.php?t=2184140&amp;goto=newpost</link>
			<pubDate>Tue, 09 Jun 2026 05:30:27 GMT</pubDate>
			<description>*Un cambrioleur de San...</description>
			<content:encoded><![CDATA[<div><b><font size="4">Un cambrioleur de San Francisco s'est enfui à bord d'un robotaxi Waymo et la police n'a toujours pas réussi à le retrouver. Elle qualifie cet incident de « cambriolage sans précédent » pour la ville</font></b><br />
<br />
<b>Un voleur s'est enfui à bord d'une Waymo lors d'un braquage sans précédent, selon la police de San Francisco. En janvier dernier, le suspect a réussi à s'enfuir avec une grande quantité de marchandises volées au Hot 8 Yoga Studio, dans le quartier de Marina. Il a ensuite pris la fuite à bord d'une Jaguar blanche sans conducteur qui était garée devant le studio. La police qualifie cet incident de « braquage sans précédent » pour la ville, le suspect ayant utilisé ce véhicule <i>high-tech</i> comme voiture de fuite. Après avoir obtenu un mandat de perquisition pour récupérer la vidéo et les informations sur le conducteur auprès de l'entreprise, les policiers n'ont toujours pas identifié publiquement de suspect ni procédé à une arrestation.</b><br />
<br />
Waymo LLC est une entreprise américaine spécialisée dans les technologies de conduite autonome dont le siège social est situé à Mountain View, en Californie. Il s'agit d'une filiale d'Alphabet Inc., la société mère de Google. En mars 2026, Waymo exploitait des services commerciaux publics de robotaxis dans 10 zones métropolitaines des États-Unis, comptait plus de 3 700 robotaxis en service, effectuait 500 000 courses payantes par semaine et avait parcouru 200 millions de kilomètres en mode entièrement autonome.<br />
<br />
L'entreprise trouve ses origines dans la Stanford Racing Team, qui a participé aux Grand Challenges 2005 et 2007 de la Defense Advanced Research Projects Agency (DARPA). Le développement de la technologie de conduite autonome par Google a débuté en janvier 2009 et le projet a été dévoilé en octobre 2010. En décembre 2016, le projet a été rebaptisé Waymo et s'est séparé de Google pour rejoindre Alphabet. En octobre 2020, Waymo est devenue la première entreprise à proposer un service au public sans conducteur de sécurité.<br />
<br />
En janvier 2026, le National Transportation Safety Board et la National Highway Traffic Safety Administration ont ouvert des enquêtes sur les robotaxis de Waymo suite à des incidents récurrents de dépassement illégal de bus scolaires à l'arrêt, et à un incident au cours duquel un robotaxi a percuté un enfant qui s'était précipité depuis l'arrière d'un SUV garé dans une zone scolaire. Récemment, le service a suscité l'attention losqu'un voleur s'est enfuit à bord d'une Waymo lors d'un braquage sans précédent, selon la police de San Francisco.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/BPs3XxD0tEU?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
Un voleur de pantalons de yoga est toujours en fuite à San Francisco après avoir réussi à s'échapper des lieux du crime à bord d'un véhicule autonome Waymo, a indiqué la police. En janvier dernier, le suspect a réussi à s'enfuir avec une grande quantité de marchandises volées au Hot 8 Yoga Studio, dans le quartier de Marina. Il a ensuite pris la fuite à bord d'une Jaguar blanche sans conducteur qui était garée devant le studio.<br />
<br />
La police qualifie cet incident de « braquage sans précédent » pour la ville, le suspect ayant utilisé ce véhicule high-tech comme voiture de fuite. Bien que toutes les voitures autonomes soient équipées de nombreuses caméras, la police a déclaré six mois plus tard que, malgré les images de vidéosurveillance obtenues, elle n'avait toujours pas identifié le suspect. « <i>Je pensais que ce serait plus facile à résoudre avec une Waymo</i> », a déclaré le sergent Tim Faye.<br />
<br />
Après avoir obtenu un mandat de perquisition pour récupérer la vidéo et les informations sur le conducteur auprès de l'entreprise, les policiers n'ont toujours pas identifié publiquement de suspect ni procédé à une arrestation. « <i>Il est tout d’abord très inhabituel qu’un Waymo soit utilisé par un suspect</i> », a déclaré Faye. «<i> Il était décevant que la vidéo interne n’ait pas permis d’identifier un suspect.</i> » <br />
<br />
Au moment où la police a obtenu le mandat de perquisition pour les vidéos de l’intérieur de la voiture, celles-ci n’étaient plus disponibles et les images de l’extérieur du véhicule ne montraient que des visages floutés, au nom de la protection de la vie privée, selon le rapport. Un porte-parole de l’entreprise a déclaré qu’« <i>elle examine minutieusement les demandes des forces de l’ordre pour s’assurer de leur validité juridique, et qu’elle s’y opposera ou demandera à la police d’en restreindre la portée si nécessaire, afin de protéger la vie privée des passagers</i> ».<br />
<br />
Le responsable du studio de yoga, qui a partagé les images du crime, a déclaré que leur vidéo montrait la voiture sans conducteur déposer le suspect, attendre que celui-ci commette le vol avant de l’emmener.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/-Rxvl3INKSg?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
Si le vol à l’aide d’un taxi autonome est une nouveauté dans la région de la baie de San Francisco, ce n’est pas une idée nouvelle chez les criminels et cela s’est déjà produit ailleurs. En janvier 2025, un voleur utilisant un Waymo a tenté d’échapper à la police à bord de la voiture sans conducteur après avoir cambriolé une épicerie à Los Angeles. Contrairement à ce qui s'est passé dans la région de la baie de San Francisco, le véhicule high-tech a aidé les policiers à appréhender le suspect et à déjouer sa tentative de s'enfuir avec le butin. Ces véhicules sont programmés pour s'arrêter s'ils détectent des gyrophares et des sirènes de police, qui tournaient déjà dans le quartier.<br />
<br />
Il y a un an, un rapport a révélé que <a href="https://embarque.developpez.com/actu/372968/Les-trajets-en-robotaxis-Waymo-coutent-plus-cher-que-ceux-proposes-par-Uber-ou-Lyft-mais-les-gens-sont-prets-a-payer-plus-cher-pour-la-nouveaute-le-confort-et-l-attrait-de-voyager-seuls/" target="_blank">Waymo, le service de Google, coûte plus cher qu'Uber et Lyft</a>. Le prix moyen de Waymo pour des trajets comparables était supérieur de 6 dollars à celui de Lyft et de 5 dollars à celui d'Uber (soit respectivement 41 % et 31 % de plus), selon le rapport. L'une des raisons selon le rapport, les véhicules Waymo sont équipés de nombreux capteurs coûteux. En outre, ils évitent également les autoroutes et certaines autres zones.<br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que cette rapport est crédible ou pertinent ?<br />
:fleche: Quel est votre avis sur le sujet ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/380052/Waymo-admet-ce-que-Tesla-cache-ses-vehicules-autonomes-font-appel-a-des-operateurs-humains-bases-aux-Philippines-Robotaxis-la-plus-grande-arnaque-semantique-de-la-decennie-Tech/" target="_blank">Waymo admet ce que Tesla cache : ses véhicules autonomes font appel à des opérateurs humains basés aux Philippines. « Robotaxis », la plus grande arnaque sémantique de la décennie Tech ?</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/376397/La-police-californienne-arrete-un-vehicule-autonome-Waymo-pour-avoir-effectue-un-demi-tour-illegal-mais-elle-ne-peut-pas-lui-infliger-d-amende-car-il-n-y-a-pas-de-conducteur-au-volant/" target="_blank">La police californienne arrête un véhicule autonome Waymo pour avoir effectué un demi-tour illégal, mais elle ne peut pas lui infliger d'amende, car il n'y a pas de conducteur au volant</a><br />
<br />
:fleche: <a href="https://embarque.developpez.com/actu/383496/Waymo-suspend-son-service-a-Atlanta-car-ses-robotaxis-propulses-par-intelligence-artificielle-peinent-avec-les-routes-inondees-dans-lesquelles-ils-se-retrouvent-coinces/" target="_blank">Waymo suspend son service à Atlanta car ses robotaxis propulsés par intelligence artificielle peinent avec les routes inondées dans lesquelles ils se retrouvent coincés.</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f1558/general-developpement/programmation-systeme/embarque/">Embarqué</category>
			<dc:creator>Alex</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2184140/general-developpement/programmation-systeme/embarque/cambrioleur-san-francisco-s-enfui-bord-d-robotaxi-waymo/</guid>
		</item>
	</channel>
</rss>
