De IDE levert OpenMV’s eigen borden, firmware, voorbeelden, machine-learning-modellen en editor-stubs, maar kan hetzelfde soort inhoud van andere bedrijven laden: een bord dat door een partner is gebouwd, de firmware die erop draait, voorbeelden en modellen die erop zijn afgestemd, en code-aanvulling voor de API’s die de firmware toevoegt. Deze arriveren als third-party repositories: mappen met inhoud die de IDE samenvoegt met de zijne en up-to-date blijft.
Deze pagina heeft twee doelgroepen. Het grootste deel ervan is voor de persoon die een repository installeert en beheert die iemand anders heeft gepubliceerd. Het laatste gedeelte, authoring a repository, is voor de leverancier die er een bouwt.
13.1.14.1. De pagina Repository’s van derden
Alles wordt beheerd via Bewerken → Voorkeuren → OpenMV → Repository’s van derden. De tabel vermeldt elke geïnstalleerde repository en, voor elke, de weergavenaam, de korte ID, of deze nu Built-in of User is, de geïnstalleerde versie van elk soort inhoud dat het biedt - firmware, voorbeelden, modellen, stubs - en de URL waarvandaan het updatet.
Built-in betekent dat de repository in de eigen directory van de applicatie is geplaatst door een installatieprogramma dat door de leverancier is geleverd, zoals een driverpakket bestanden aan een programma toevoegt. User betekent dat je het zelf hebt geïnstalleerd vanaf een URL. Het enige praktische verschil is dat je een ingebouwde repository niet uit de IDE kunt verwijderen - het wordt verwijderd door het verwijderen van wat het daar ook heeft geplaatst - dus de knop Verwijderen is ervoor uitgeschakeld.
13.1.14.2. Een opslagplaats installeren
Installeren vanaf URL vraagt om het adres van de config.json van een repository - het kleine manifestbestand dat de leverancier publiceert - en installeert alles waarnaar het verwijst. Plak de URL die de leverancier u heeft gegeven; de IDE downloadt het manifest, haalt de firmware, voorbeelden, modellen en stubs op die erin staan, en verifieert elke download. Het installeren, verwijderen en bijwerken van een repository wordt allemaal van kracht na een herstart, dus de IDE biedt aan om opnieuw op te starten wanneer de installatie is voltooid.
Een leverancier kan een repository ook distribueren als een installatieprogramma dat deze rechtstreeks in de applicatiemap plaatst, in welk geval deze eenvoudigweg aanwezig is als een Built-in rij de eerste keer dat u de pagina opent - er hoeft niets te worden geïnstalleerd.
13.1.14.4. Prioriteit en overschrijvingen
Opslagplaatsen zijn een geordende lijst, met de hoogste prioriteit bovenaan, en Omhoog en Omlaag verplaatsen de geselecteerde volgorde opnieuw. De volgorde is alleen van belang als twee bronnen het same-ding bieden: een bord met dezelfde USB-identificatie, of een voorbeeld, model of stub met dezelfde naam. Wanneer dat gebeurt, wint de hogere inzending, en wint elke repository de ingebouwde inhoud van OpenMV. Dit is opzettelijk - het is hoe een leverancier zijn eigen firmware levert voor een bord dat de USB-identifier van een OpenMV-bord deelt, ter vervanging van de standaardfirmware die de IDE er anders voor zou aanbieden, of een standaardvoorbeeld vervangt door een exemplaar dat voor hun hardware is geschreven.
Omdat een overschrijving stilletjes verandert wat een bekende naam doet, verbergt de pagina er nooit een. In het paneel Override-waarschuwingen wordt elke overschrijving weergegeven die van kracht is - welk repositorybord, voorbeeld, model of stub welke overschrijft - en dezelfde lijst verschijnt één keer als een bericht wanneer een repository voor het eerst wordt bekeken. Als een bord, voorbeeld of model zich niet gedraagt zoals de documentatie van OpenMV beschrijft, is dit paneel de eerste plaats om te kijken.
13.1.14.6. Een repository schrijven
Een repository is een map met de naam van de leverancier, met daarin een config.json-manifest en een submap voor elk soort inhoud dat het biedt:
acme/
config.json
firmware/
settings.json board descriptions
ACME_CAM1/ one folder per board, named by boardFirmwareFolder
firmware.bin
romfs0.img
firmware.version
examples/
index.csv which examples show for which board / sensor
01-Getting-Started/ numbered category folders, same as OpenMV's
hello_acme.py
read_sensor.py
02-Acme-Widgets/
spin_widget.py
examples.version
models/
index.csv which models show for which board
acme/ a group; its index.html + image describe it
index.html
image.jpg
person_detector/ one folder per model
person_detector.tflite
person_detector.txt class labels
models.version
stubs/
acme_hal.pyi a module the firmware adds
csi.pyi overrides OpenMV's to add methods
stubs.version
De mapnaam is de repository-ID: kleine letters, cijfers, - en _, beginnend met een letter. Elke onderdeelmap is optioneel; verzend alleen wat u heeft. Naast elke deelmap bevindt zich een <part>.version-bestand met een enkele versietekenreeks (1.2.0) die de IDE gebruikt om te beslissen wanneer een update nieuwer is.
13.1.14.6.1. Het manifest
config.json noemt de repository en verwijst voor elk onderdeel naar een downloadbaar archief:
{
"name": "acme",
"displayName": "Acme Robotics",
"homepage": "https://acme.example",
"configUrl": "https://acme.example/openmv/config.json",
"firmware": {
"release": { "version": "1.2.0", "url": "https://acme.example/acme-fw-1.2.0.zip", "sha256": "..." },
"development": { "version": "dev-20260701", "url": "https://acme.example/acme-fw-dev.zip", "sha256": "..." }
},
"examples": { "release": { "version": "1.1.0", "url": "https://acme.example/acme-examples-1.1.0.zip", "sha256": "..." } },
"models": { "release": { "version": "1.0.0", "url": "https://acme.example/acme-models-1.0.0.zip", "sha256": "..." } },
"stubs": { "release": { "version": "1.0.0", "url": "https://acme.example/acme-stubs-1.0.0.zip", "sha256": "..." } }
}
name moet overeenkomen met de mapnaam. configUrl is het adres waarop hetzelfde bestand wordt gehost; de IDE haalt het opnieuw op om te controleren op updates, dus laat het alleen weg voor een repository die nooit zal worden bijgewerkt. Elk onderdeel heeft een release-kanaal en de firmware kan ook een development-kanaal hebben dat wordt gebruikt door Install the Latest Development Release. Release version-waarden worden vergeleken als getallen, dus een hogere wordt aangeboden als update; ontwikkelingsversies worden alleen op verandering vergeleken. De sha256 is optioneel, maar wordt geverifieerd indien aanwezig.
Elke url wijst naar een .zip (alleen zip). Een archief bevat precies one top-level folder, en de IDE installeert de contents van die map als onderdeel - dus het firmware-archief is als volgt verpakt:
acme-fw-1.2.0.zip
acme-firmware/ one wrapping folder; its name does not matter
settings.json
ACME_CAM1/
firmware.bin
romfs0.img
en wordt uitgepakt in de eerder getoonde map firmware/. De voorbeelden, modellen en stubs-archieven zijn op dezelfde manier verpakt: één inpakmap met daarin wat er in examples/, models/ of stubs/ zou zitten. De naam van de inpakmap wordt genegeerd; waar het om gaat is dat er precies één is. Het zippen van de bestanden in de archiefhoofdmap zonder inpakmap, of het inpakken in meer dan één map, zal niet worden geïnstalleerd. De eenvoudigste manier om dit goed te doen is door de map zelf te zippen: selecteer acme-firmware en comprimeer deze, in plaats van de inhoud ervan te selecteren.
13.1.14.6.2. Borden, voorbeelden, modellen en stubs
firmware/settings.json gebruikt hetzelfde bordbeschrijvingsformaat als de firmware die de IDE verzendt; voeg een boards-invoer toe voor elk van je borden. Een paar regels zijn specifiek voor borden van derden: boardFirmwareFolder moet uniek zijn (het wordt nog niet gebruikt door OpenMV of een andere leverancier, omdat het de map noemt waarin uw binaire bestanden zich bevinden), elk bord moet zijn eigen firmware_version hebben (dit is wat de update-on-connect-prompt aanstuurt), en een bord kan boardFirmwareFolderAlias instellen op de naam van de firmwaremap van een OpenMV-bord om de voorraadvoorbeelden en -modellen van dat bord te erven - het ontsnappingsluik voor een bord dat firmware-compatibel is met een OpenMV-bord. Hergebruik van OpenMV-bootloader-ID’s wordt verwacht (ze bevatten de ondertekende Windows-stuurprogramma’s); een app-ID die botst met een ingebouwd bord, overschrijft dat bord, wat het paneel Override-waarschuwingen meldt.
Voorbeelden gaan in genummerde categoriemappen zoals OpenMV’s (01-Getting-Started); een categorie die u dezelfde naam geeft als een OpenMV, voegt u erin toe, en een nieuwe naam wordt zijn eigen menusectie. Een model is een map met de .tflite en een bijpassende .txt klasselabels, gegroepeerd onder een map waarvan index.html (en een optionele afbeelding) de beschrijving is die ernaast wordt weergegeven in de Model Zoo. examples/index.csv en models/index.csv zijn dezelfde bord- en sensorfilterbestanden die OpenMV’s eigen voorbeelden en modellen gebruiken, afgestemd op jouw voorbeeld- en modelpaden, en beslissen welke van jou voor welk bord worden weergegeven. Stubs zijn gewone .pyi-bestanden; de IDE overhandigt hun map aan de taalserver, zodat ze samen met die van OpenMV worden omgezet, en een stub met de naam voor een bestaande module (csi.pyi) overschrijft de voltooiing van die module.
13.1.14.6.3. Publiceren en bijwerken
Om te publiceren host u de config.json en de archieven waarnaar deze verwijst op stabiele URL’s en geeft u gebruikers de config.json URL van waaruit ze kunnen installeren. Overal waar gewone bestanden via HTTPS worden aangeboden, werkt het: een webserver, een objectopslag of een codehost. Om een update te verzenden, uploadt u nieuwe archieven, plaatst u de betrokken version-waarden in de gehoste config.json, en de volgende keer dat de IDE van elke gebruiker wordt gestart, wordt de update aangeboden. Gebruikers die de repository via een installatieprogramma hebben geïnstalleerd, krijgen updates op dezelfde manier, zolang de geïnstalleerde config.json een configUrl draagt.
13.1.14.6.4. Hosten op GitHub
GitHub is een handige host, en de IDE haalt er op dezelfde manier van op als zijn eigen bronnen. Er moeten twee stukken worden geplaatst: het manifest en de archieven.
Bewaar de config.json in een repository en geef gebruikers de raw URL: het adres waarop het bestand rechtstreeks wordt aangeboden, niet de GitHub-pagina waarop het wordt weergegeven. De Raw-knop op het bestand laat het zien; het heeft de vorm
https://raw.githubusercontent.com/<user>/<repo>/<branch>/config.json
Die onbewerkte URL is wat een gebruiker in Installeren vanaf URL plakt, en wat u in de eigen configUrl van het manifest plaatst, zodat de IDE deze opnieuw ophaalt om te controleren op updates. Als je het naar een branch (main) richt, betekent het pushen van een nieuwe commit dat de wijziging wordt gepubliceerd; door het naar een tag te wijzen, worden gebruikers in plaats daarvan vastgezet op een vaste versie.
Host de .zip-archieven als release assets in plaats van ze vast te leggen - releases zijn gebouwd voor binaire downloads, dus een firmwarebundel van meerdere megabytes hoort daar thuis, en niet in de geschiedenis van de repository. Voeg elk archief toe aan een GitHub-release en gebruik de download-URL ervan, die de vorm heeft
https://github.com/<user>/<repo>/releases/download/<tag>/acme-fw-1.2.0.zip
in de url-velden van het manifest, elk met de sha256 van het archief. Het verzenden van een update is dan: de nieuwe archieven aan een release koppelen, config.json bewerken om ernaar te verwijzen en de versies tegenhouden, en committen. De IDE pikt de wijziging op bij de volgende keer opstarten (het onbewerkte bestand wordt aangeboden via een cache die binnen een paar minuten na de push wordt vernieuwd).