Després de desplegar el 100è dispositiu de recollida de dades wearable, la nostra canonada de dades de robòtica va començar silenciosament a enverinar-se. En el món de la robòtica d'IA, les dades són el nou oli. Per a la robòtica d'IA, aquest oli pot provenir de dispositius de recopilació de dades portàtils desplegats en cases del món real. Aquests "guants" capturen dades de manipulació bimanual d'alta fidelitat que s'utilitzen per entrenar la propera generació de robots alimentats per la IA. No obstant això, a mesura que vam escalar de 10 prototips a 2.000 unitats, vam colpejar una paret.El nostre procés de fabricació va ser un desordre de guions de Python esbossats, arxius YAML manuals i, el pitjor de tot, firmware construït a mida per a cada guant. Així és com he utilitzat i passar d'un procés fràgil i únicament per a enginyers a un cicle de vida de DevOps de maquinari que va millorar directament la taxa d'èxit de les tasques del nostre robot. WebSèrie WebUSB El malson "hardcoded": per què el firmware com a identitat fracassa En el moment en què vaig unir-me a l'equip, el nostre procés de registre per a aquests dispositius de recollida de dades portàtils era fonamentalment incalculable: Connectar el portàtil a un PC. Executar un script de Python (depenent d'entorns i controladors locals específics). Modificar el codi de firmware en C per incloure les metadades específiques del dispositiu (ID de maquinari, versió de maquinari, versió de firmware i si el dispositiu és esquerre o dret). Compromís manual d'ID de maquinari i dades de calibratge en un repositori de Git utilitzant arxius YAML. Construeix i flash un únic binari d'una vegada per a aquest dispositiu específic. L’impacte dels errors humans Aquest procés va ser un terreny de cultiu per a les inconsistències. Ens vam enfrontar a cadenes de versions malformades, ids de maquinari duplicats i metadades incorrectes. En el món del maquinari, no són només errors, sinó venena de dades. Quan un guant en una casa a 2.000 milles de distància envia dades amb una cadena de versió malformada, els nostres pipelines d'IA a continuació es trenquen. Ens vam trobar escrivint scripts de neteja de dades hacky només per fer que les dades recollides poguessin ser utilitzades. pitjor, les dades de calibratge incorrectes van afectar directament els models que estava entrenant silenciosament, reduint la taxa d'èxit de tasques sense signes evidents del que va anar malament. El canvi arquitectònic: el web com a "eina de fàbrica" El moment que va clicar per a mi va ser quan vaig saber que hi havia i API disponible en navegadors web basats en Chromium que permeten que el front-end web es comuniqui amb dispositius connectats a USB. També vaig adonar-me que el firmware estava fent una feina que no té negoci a fer. Metadades com ara versions de maquinari i dades de calibratge es poden emmagatzemar al núvol i recuperar dinàmicament a través de trucades d'API segures quan fos necessari. També vam passar a un model on cada guant executa exactament el mateix firmware, i el navegador web actua com a pont entre el maquinari físic i la nostra infraestructura de núvol. WebSèrie WebUSB Programari de fabricació amb instal·lació zero i desplegament global instantani Mitjançant l'API WebSerial, hem eliminat el problema "no funciona a la meva màquina".Els nostres equips de fabricació i QC ja no necessiten gestionar els entorns o els controladors de Python. Simplement obren una URL a Chrome, connecten el guant i el navegador gestiona la comunicació de baix nivell amb el PCB personalitzat al guant. Com que tota la interfície és una aplicació d'una pàgina única (SPA), ara gestionem la nostra línia de muntatge física amb la mateixa agilitat que el nostre programari de núvol. Utilitzem pipelines CI/CD estàndard per desencadenar construccions i desplegar a un proveïdor d'allotjament de fitxers estàtic avorrit. Si millorem un algorisme de calibratge o afegim una nova comprovació de QC, simplement emprem el codi i deixem que les pipelines automatitzades facin la resta. Aquest canvi ens va permetre escalar fins a un equip de fabricació intern de 7 persones sense fons de codificació, cosa que hauria estat impossible si cada unitat requeria un enginyer per construir manualment i flash un firmware únic. El pont d'identitat: WebSerial es troba amb WebUSB Vaig pensar que WebSerial era tot el que necessitava, però vaig trobar que no funcionava com esperava a causa d'una limitació tècnica: WebSerial sol no pot recuperar el número de sèrie USB. Per aconseguir un veritable provisionament d'un clic, vaig desenvolupar un enfocament heurístic híbrid per connectar dues APIs independents. Mitjançant l'ús d'una estratègia de "reclamació i prova", podíem verificar si l'usuari va seleccionar el mateix dispositiu físic en les sol·licituds WebUSB i WebSerial. A continuació es mostra un exemple de com es podria aconseguir això en un cas senzill (de fet ho vaig fer d'una manera més fàcil d'usar i més integrada amb els nostres fluxos de treball específics, però això és una il·lustració del concepte). async function openUsbSerialPort( interfaceNumber: number, serialOptions: SerialOptions ): Promise<[USBDevice, SerialPort]> { // 1. let the user pick a USB device and claim the interface for serial communication const device = navigator.usb.requestDevice(); await device.open(); await usbDevice.claimInterface(interfaceNumber); // 2. let the user pick a serial port const port = await navigator.serial.requestPort({ filters: [{ usbVendorId: usbDevice.vendorId, usbProductId: usbDevice.productId }] }); // 3. Test: If the user selected the same device, we shouldn't be able // to open the serial port yet because it's already claimed. const serialPortOpened = await port.open(serialOptions).then(() => true).catch(() => false); if (serialPortOpened) { await port.close(); throw Error("Selected different devices"); } // 4. Match confirmed. Release and open for real. await usbDevice.releaseInterface(interfaceNumber); await port.open(serialOptions); return [device, port]; } Però funciona i ens permet enllaçar automàticament el maquinari físic al seu registre de núvol específic sense que l'operador hagi de seleccionar manualment o escriure un número de sèrie. Desconnexió de la identitat del firmware En comptes de filtrar metadades úniques en cada unitat, la solució basada en la web va revolucionar el flux: Reconeixement d'identitat: El navegador identifica la unitat utilitzant el número de sèrie USB a través de l'heurística WebUSB/WebSerial. Mantenir les metadades al núvol: durant el procés de registre, aquesta identificació única juntament amb les metadades associades es carreguen a una base de dades del núvol durant el procés de registre. Recuperació on-demand: Quan es desplega el guant, qualsevol aplicació o servei pot utilitzar una API per recuperar les metadades per ID de forma dinàmica. El firmware es manté estúpid i fiable, mentre que el núvol serveix com a única font de veritat. Resultats: Dades més netes, robots millors El canvi cap a un model de DevOps de maquinari centrat en la web ha estat transformador: Operacions democratitzades: Un equip intern de 7 ara gestiona tot el procés de registre i QC, alliberant centenars d'hores d'enginyeria. Integritat de dades: Hem eliminat els encapçalaments malformats i els errors de metadades. El nostre tub de dades és ara "net per disseny" en totes les 2.000 unitats. Taxa d'èxit de tasques: La calibració precisa i coherent a tota la flota ha portat a un augment mesurable en el rendiment dels nostres models de manipulació bimanual. Conclusió Si estàs escalant el maquinari d'IoT o Robotics, tracta els navegadors web com l'orquestrador del procés.Amb la combinació de WebSerial i WebUSB amb el CI / CD web estàndard, pots trencar la bretxa entre el maquinari i el núvol, assegurant que cada unitat de maquinari sigui tan àgil i actualitzada.