v5.0.1#
v5.0.1 is een onderhoudsrelease bovenop v5.0.0 — de oude sensor-module wordt een Python-compatibiliteitslaag over csi, afbeeldingen die in de framebuffer worden geladen previewen nu zoals cameraframes, de JPEG-encoders verliezen hun uitvoerlimiet van 1 MB en gaan correct om met overflow, en er is een reeks fixes voor camera, protocol, netwerk en de ML-bibliotheek. Het introduceert geen breaking API-wijzigingen voor scripts die tegen csi zijn geschreven; het handjevol gedragswijzigingen staat onder breaking API-wijzigingen.
Hoogtepunten#
De module
sensoris nu een bevroren Python-module gebouwd opcsi. Ze print een deprecation-waarschuwing bij het importeren; een paar functies die decsi-module niet kan ondersteunen, genereren nuOSError. Zie de wijzigingen in de sensor-module.Geladen afbeeldingen previewen zoals cameraframes. Een afbeelding die met
copy_to_fb=Truein de framebuffer wordt geplaatst (image.Image,image.ImageIO.read(),fir.snapshot(),tof.snapshot()) wordt naar de IDE geflusht — met alles wat erop is getekend — wanneer de volgende afbeelding de framebuffer overschrijft, in plaats van direct. Zie de preview-wijzigingen.JPEG-encoder grondig herzien. De limiet van 1 MB op de uitvoerbuffer is verdwenen (de buffer wordt gedimensioneerd op basis van het vrije geheugen), overflow op zowel het software- als het hardwarepad wordt afgehandeld in plaats van afgekapte bestanden te schrijven, en het opslaan van een gecomprimeerde afbeelding onder de andere gecomprimeerde extensie genereert een fout in plaats van rommel te schrijven.
Nieuw:
protocol.poll()en zes nieuwe CBOR-widgets (text,lineedit,pushbutton,spinbox,radio,waveform) voorprotocol.CBORChannel.YOLO Pro-post-processor, ondersteuning voor FLIR Lepton 3.1R / UW, IMU-burst-reads, CAN op de OpenMV N6 en een simulator-target met netwerkondersteuning.
Nieuwe functies#
YoloPro— een nieuwe post-processor voor Edge Impulse YOLO Pro-objectdetectiemodellen, plus eenyolo_pro_detector.py-voorbeeld. (f3f150ebd, ea7bbb398)protocol.poll()— voert op verzoek één iteratie van de protocoltaak uit, voor aangepaste transporten die niet door de USB-interrupt of depoll_ms-timer worden aangestuurd.protocol.init()kan ook opnieuw worden aangeroepen om de stack te herinitialiseren. (c00c215f9, f849ffb1b)Meer CBOR-kanaalwidgets —
protocol.CBORChannel.add()krijgttext(statische string),lineedit(schrijfbare string),pushbutton(kortstondige actie),spinbox(numerieke invoer in stappen),radio(optiegroep) enwaveform(1D-tijdreeks met de argumentensample_rate,seriesentypecode; wijs interleaved samplebytes toe om te streamen). (8016d29ba)csi.CUSTOM—csi.CSI.framesize()retourneert nu een bruikbare constante nadat een aangepaste(w, h)-resolutie is ingesteld, in plaats van een anoniem geheel getal. (af8841654)IMU-burst-read —
imu.__read_reg()accepteert een optionele schrijfbare buffer en vult die in één transactie vanuit opeenvolgende registers. (244ca480a)FLIR Lepton 3.1R en Lepton UW worden herkend door de Lepton-driver, inclusief hun radiometrische gain-modi. (0fc356632)
Simulator-netwerkondersteuning — het
MPS2_AN500QEMU-target heeft nu lwIP en een user-mode NIC, metrequests,mqttensensorbevroren ingebouwd, en een netwerk-unittest. (23546dfb1, 61d187305, 15096c3a2)Voorbeeld voor OpenAI-compatibele API —
openai_compatible.pymaakt een JPEG-snapshot en post die naar een chat-completions-endpoint voor een beschrijving van de scène. (79033c6aa)SX126x LoRa-voorbeelden — de
lora-sx126x-driver van micropython-lib (metlora-sync/lora-async) is bevroren in de OpenMV RT1062-firmware opgenomen, met zender/ontvanger/ping-pong/image-stream-voorbeelden voor het aansluiten van een SX1261- of SX1262-module op de SPI-bus. Dit is door de community bijgedragen ondersteuning; OpenMV verkoopt geen LoRa-hardware. (19576e1b1)
Overige wijzigingen en verbeteringen#
Herschrijving van de bibliotheek
requests— responses met chunked transfer worden gedecodeerd, eentimeout-argument (standaard 5 s) is beschikbaar, JSON- en string-bodies worden correct geserialiseerd/gecodeerd, headers worden hoofdletterongevoelig geparseerd en de statusregel op positie, deheaders-dict van de aanroeper wordt gekopieerd (zodatauthniet langer naar latere requests lekt), en de body wordt in blokken in eenbytearrayingelezen. (889f0b096)mqttimporteertsslpas wanneer nodig (lazy), zodat de module en gewone (niet-TLS) verbindingen werken op builds zonder SSL-ondersteuning. (c2e0899e8)JPEG-uitvoerbuffer gedimensioneerd op basis van het vrije geheugen in plaats van een vaste limiet van 1 MB; de encoders knippen de buffer bij tot de gecodeerde grootte voordat de afbeelding wordt weggeschreven, zodat opnames van grote sensoren op hoge kwaliteit niet langer mislukken. (aa1ca6776)
Opschoning van ML-post-processing — het genereren van bounding boxes is gestandaardiseerd over de Darknet-, Edge Impulse- en Ultralytics-post-processors, en de YOLOv8-uitvoer wordt na het thresholden getransponeerd zodat ze net als bij de andere modellen met één rij per detectie wordt opgeslagen. (b5c7853f2, c45f99cad)
Veilig afsluiten van de PAG7936 — een nieuwe sensor-halt-vlag zet de PAG7936 in slaapstand voordat RESET/PWDN wordt omgeschakeld, wat vastlopers verhelpt wanneer de sensor via een verlengkabel wordt gebruikt. De driver kiest bovendien zijn MIPI CSI-2- of parallelle registerset tijdens runtime op basis van het I2C-adres van de sensor, in plaats van tijdens het bouwen. (10026530c, f6acf14ec, 5f0251c74)
De afspeeltiming van
ImageIOhandelt nu openstaande events af tijdens het wachten op het interval tussen frames, in plaats van te slapen inWFI. (a54790193)Updates van de MicroPython-submodule — volledige netwerkondersteuning op de QEMU-port,
machine.mem_backupop STM32 via backup-SRAM/BKP-registers, SDIO-hardware-flow-control blijft uitgeschakeld op STM32F4, en hergebruik van MPU-attributen voor niet-cachebare regio’s. (31ada5626, ab61d27a6, 06bddf13a)differential-translation.pylegt beelden vast via zijncsi.CSI-object in plaats van de verouderdesensor-module, en de spatiëring van imports in de voorbeelden is genormaliseerd. (68c866e7f, 9ceff4513)
Bugfixes#
Camera en sensoren:
Twee aangepaste
(w, h)-resoluties achter elkaar instellen liet de sensor op de eerste grootte staan terwijlcsi.CSI.width()/height()de tweede rapporteerden; het snelle pad voor “geen wijziging” sluit aangepaste groottes nu uit. (cfbb70156)csi.CSI.lens_correction()parseerderadiencoefals booleans, waardoor de waarden die aan de driver werden doorgegeven niet de opgegeven waarden waren. (ab44b3a77)PAG7936: belichting en gain direct na elkaar instellen overschreef elkaar (beide delen één handmatige modus en de teruggelezen registers lopen een frame achter); de driver initialiseert de handmatige registers nu alleen bij het ingaan van de handmatige modus en schrijft enkel de instelling die wordt gezet. (e7a18c0a0)
BAYER-opname met de PAG7936 en PS5520 op de OpenMV N6 mislukte met “Failed to initialize the CSI interface” bij elke grootte anders dan de volledige resolutie, omdat de ISP van de N6 ruwe Bayer niet kan herschalen. De sensoren draaien voor BAYER nu in een native modus die overeenkomt met de gevraagde grootte (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; QVGA heeft geen native modus en wordt niet ondersteund). (fe6790055, b7622b245)
Afbeeldingen coderen en opslaan:
Software-JPEG-encoder: een overflow van de uitvoerbuffer was altijd fataal omdat het realloc-pad was uitgeschakeld; de encoder vergroot de buffer nu (telkens met de helft van zijn grootte) wanneer hij er eigenaar van is, valt netjes terug wanneer het geheugen opraakt, en knipt het resultaat bij.
jpeg_write/mjpeg_writeschrijven de buffer niet langer weg na een mislukte codering. (28e1110be)Hardware-JPEG-encoders (STM32): bij overflow werd een gedeeltelijk gecodeerde afbeelding met de toewijzingsgrootte geretourneerd, wat afgekapte bestanden zonder EOI-marker opleverde (bijv. een opname van 5 MP op kwaliteit 100 met een lege onderste helft). Ze melden nu overflow, geven de buffer vrij bij een fout en knippen hem bij bij succes. (22ce9619c)
De VC8000-encoder produceerde stilzwijgend 4:2:0-chroma voor elk verzoek; subsampling anders dan 4:2:0 valt nu terug op de HW-codec die dit ondersteunt. (71f2be7f2)
image.Image.save()van een PNG-afbeelding als.jpgschreef tot 1 MB niet-geïnitialiseerde heap weg, en van een JPEG-afbeelding als.pngschreef een leeg bestand. Beide genereren nu een fout; een afbeelding die al in het doelformaat staat, wordt nog steeds ongewijzigd gekopieerd. (6c1fdf822)png_writecontroleert nu de retourwaarde van de compressor en comprimeert voordat het bestand wordt aangemaakt, zodat een fout geen leeg bestand meer achterlaat. (557f52d66)
Image-module:
image.Image.get_pixel()metrgbtuple=Trueop BAYER- en YUV-afbeeldingen schreef de geconverteerde pixel voorbij een lokale stackvariabele op een door de aanroeper bepaalde offset. (13f2a17b6)Uit
gif.Gif.add_frame()is een onbereikbare Bayer/YUV-conversietak verwijderd; alleen GRAYSCALE- en RGB565-afbeeldingen worden geaccepteerd, zoals de Python-API al afdwong. (f20d99d96)
Protocol:
Het registreren van een dynamisch kanaal terwijl alle slots al in gebruik waren, veroorzaakte een out-of-bounds-schrijfactie; de kanaal-ID wordt nu eerst gecontroleerd, en van de gereserveerde kanaal-ID’s wordt statisch geverifieerd dat ze in de kanaaltabel passen. (68f635d1f)
Dynamische kanaalobjecten overleefden een soft reset in de root pointers, waardoor de GC verouderde heap-blokken van de vorige run bleef scannen; de tabel wordt nu bij init gewist. (ef0ebb03b, e23641145)
Ports:
i.MX RT: de ontbrekende de-initialisatie van CAN en Encoder bij een soft reset is toegevoegd. (7cb9d3dc2)
Hardware- en bordondersteuning#
OpenMV N6 — CAN is nu ingeschakeld (
machine.CAN). (294f0febd, 91e1c9573)OpenMV AE3 — de
sdcardSPI-driver is bevroren ingebouwd voor de microSD-socket op het AE3 Battery Shield. (a258f4814)OpenMV RT1062 —
lora-sx126x/lora-sync/lora-asyncbevroren ingebouwd (zie Nieuwe functies).FLIR Lepton 3.1R / UW — herkend door de Lepton-driver op alle borden met Lepton-ondersteuning.
PAG7936 — halt voor veilig afsluiten, interfaceselectie tijdens runtime, fix voor belichting/gain, en BAYER-opname op de N6.
PS5520 — BAYER-opname op de N6 in native groottes.
Simulator (MPS2_AN500) — netwerkondersteuning.
Alle borden — de
sensor-compatibiliteitsmodule is bevroren in het manifest van elk bord opgenomen.
Breaking API-wijzigingen#
v5.0.1 introduceert geen breaking wijzigingen in de API’s van csi of image. Scripts die op v5.0.0 draaiden, draaien ongewijzigd, met de volgende gedragswijzigingen.
sensor-module (behavior)#
De native sensor-module (modules/py_csi.c) is verwijderd en vervangen door een bevroren Python-module die dezelfde API bovenop csi implementeert. Zie sensor.
Commit: 5e3d40631
import sensorprintWARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead.naar de terminal.Het verborgen
csi.CSI-object wordt bij het importeren aangemaakt, zodat een ontbrekende camera nu een fout genereert bijimport sensorin plaats van bijsensor.reset().Deze functies genereren nu
OSErroromdatcsigeen equivalent heeft:get_fb(),alloc_extra_fb(),dealloc_extra_fb(),set_auto_rotation(),get_auto_rotation(),disable_delays(),disable_full_flush(). (De twee*_extra_fb-functies genereerden in v5.0.0 al een fout.) Gebruikcsi.CSI(delays=False)/csi.CSI(fflush=False)voor de laatste twee.Framesizes die
csiniet exporteert (QQCIF,QQSIF,QQQQVGA,HQQQQVGA,HQQQVGA,HQQVGA,B64X32,B64X64,B128X64,B128X128,B160X160,B320X320,LCD,QQVGA2) zijn nu(w, h)-tuples die als aangepaste resoluties worden doorgegeven.get_framesize()retourneert de ingestelde tuple zolang de camera nog op die grootte staat, zodat gelijkheidscontroles met de constanten blijven werken.ioctl()geeft hoogstens vier argumenten na het verzoek door.sleep()/shutdown()genereren zoals voorheenOSErrorbij een fout (deRuntimeErrorvancsiwordt vertaald).
Migreer naar csi — zie de v5.0.0-migratietabel.
Afbeeldingen laden in de framebuffer (behavior)#
Functies die een afbeelding in de framebuffer laden — image.Image met copy_to_fb=True, image.Image.copy() / image.Image.scale() en de to_*-conversies met copy_to_fb=True, image.ImageIO.read(), fir.snapshot() en tof.snapshot() met copy_to_fb=True — pushten de nieuwe afbeelding voorheen direct naar de IDE-preview, zodat alles wat op de geretourneerde afbeelding werd getekend nooit te zien was. Ze markeren de framebuffer nu als in afwachting en flushen hem, met alles wat erop is getekend, vlak voordat de volgende afbeelding hem overschrijft — hetzelfde gedrag als csi.CSI.snapshot().
Commits: 87b6db5ee, 7b1a35c2f, f773c740d
Lussen die een stroom afbeeldingen lezen hoeven niet te worden aangepast en tonen nu hun tekenwerk. Een script dat één enkele afbeelding laadt en stopt, moet die expliciet flushen:
img = image.Image("example.bmp", copy_to_fb=True)
img.flush() # new: send it to the IDE preview now
time.sleep_ms(1000)
ML-bibliotheek (behavior)#
Raakt alleen code die de meegeleverde post-processors subclasst of kopieert. YoloV8 transponeert de modeluitvoer nu na het thresholden, zodat overgebleven detecties met één rij per box worden opgeslagen (bb[:, 4:]), in lijn met de Darknet- en Edge Impulse-post-processors, in plaats van één kolom per box (bb[4:, :]). De publieke ((x, y, w, h), score)-resultaten zijn ongewijzigd.
protocol-module (minor)#
protocol.poll() is terug. v5.0.0 verwijderde deze functie toen de protocoltaak naar de timer verhuisde; ze keert terug als expliciete manier om de taak aan te sturen voor aangepaste transporten. Verder is er niets veranderd — scripts die haar nooit aanriepen, worden niet beïnvloed.
Commit: c00c215f9
Build / tooling (tooling)#
Niets hiervan raakt MicroPython-scripts. py_image.c is opgesplitst, waarbij de descriptor-objecten (cascade, keypoints, LBP, keypoint match) naar py_image_descriptor.c zijn verhuisd en de statistiekobjecten (similarity, statistics, percentile, threshold, histogram) naar py_image_stats.c. De imlib-encoder-API is in lijn gebracht met de rest van imlib: jpeg_compress / png_compress retourneren 0 bij succes en -1 bij een fout, en jpeg_compress verloor zijn realloc-argument (herdimensioneren hangt af van buffereigendom). OMV_PROTOCOL_MAX_CHANNELS werd OMV_PROTOCOL_CHANNEL_MAX in omv_protocol_channel.h, en ports roepen nu py_protocol_init0() aan bij init. De board-define OMV_PAG7936_MIPI_CSI2 is verdwenen (de interface wordt tijdens runtime gekozen). CI-dependency-bumps en een fix voor een lege release-changelog maken het af. Zie de geschiedenis van de firmware-repository voor details die relevant zijn voor forks.
Migratiechecklist#
Nog steeds op
import sensor? Het werkt, met een waarschuwing. Stap over naarcsi(v5.0.0-migratie); vervangdisable_delays/disable_full_flushdoor de constructorargumenten vancsi.CSI()en laatget_fb- / auto-rotatie-aanroepen weg.Laad je één enkele afbeelding met
copy_to_fb=Trueen verwacht je die te zien? Voegimg.flush()toe na het laden.De YOLOv8-post-processor gekopieerd? Indexeer de gethresholde uitvoer per rij (
bb[:, 4:]) in plaats van per kolom.Vergelijk je
csi0.framesize()na het instellen van een tuple? Die retourneert nucsi.CUSTOM.Al het overige: opnieuw flashen en draaien.