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 sensor is nu een bevroren Python-module gebouwd op csi. Ze print een deprecation-waarschuwing bij het importeren; een paar functies die de csi-module niet kan ondersteunen, genereren nu OSError. Zie de wijzigingen in de sensor-module.

  • Geladen afbeeldingen previewen zoals cameraframes. Een afbeelding die met copy_to_fb=True in 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) voor protocol.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 een yolo_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 de poll_ms-timer worden aangestuurd. protocol.init() kan ook opnieuw worden aangeroepen om de stack te herinitialiseren. (c00c215f9, f849ffb1b)

  • Meer CBOR-kanaalwidgets — protocol.CBORChannel.add() krijgt text (statische string), lineedit (schrijfbare string), pushbutton (kortstondige actie), spinbox (numerieke invoer in stappen), radio (optiegroep) en waveform (1D-tijdreeks met de argumenten sample_rate, series en typecode; 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_AN500 QEMU-target heeft nu lwIP en een user-mode NIC, met requests, mqtt en sensor bevroren ingebouwd, en een netwerk-unittest. (23546dfb1, 61d187305, 15096c3a2)

  • Voorbeeld voor OpenAI-compatibele API — openai_compatible.py maakt 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 (met lora-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, een timeout-argument (standaard 5 s) is beschikbaar, JSON- en string-bodies worden correct geserialiseerd/gecodeerd, headers worden hoofdletterongevoelig geparseerd en de statusregel op positie, de headers-dict van de aanroeper wordt gekopieerd (zodat auth niet langer naar latere requests lekt), en de body wordt in blokken in een bytearray ingelezen. (889f0b096)

  • mqtt importeert ssl pas 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 ImageIO handelt nu openstaande events af tijdens het wachten op het interval tussen frames, in plaats van te slapen in WFI. (a54790193)

  • Updates van de MicroPython-submodule — volledige netwerkondersteuning op de QEMU-port, machine.mem_backup op 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.py legt beelden vast via zijn csi.CSI-object in plaats van de verouderde sensor-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 terwijl csi.CSI.width() / height() de tweede rapporteerden; het snelle pad voor “geen wijziging” sluit aangepaste groottes nu uit. (cfbb70156)

  • csi.CSI.lens_correction() parseerde radi en coef als 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_write schrijven 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 .jpg schreef tot 1 MB niet-geïnitialiseerde heap weg, en van een JPEG-afbeelding als .png schreef een leeg bestand. Beide genereren nu een fout; een afbeelding die al in het doelformaat staat, wordt nog steeds ongewijzigd gekopieerd. (6c1fdf822)

  • png_write controleert 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() met rgbtuple=True op 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 sdcard SPI-driver is bevroren ingebouwd voor de microSD-socket op het AE3 Battery Shield. (a258f4814)

  • OpenMV RT1062 — lora-sx126x / lora-sync / lora-async bevroren 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 sensor print WARNING: 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 bij import sensor in plaats van bij sensor.reset().

  • Deze functies genereren nu OSError omdat csi geen 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.) Gebruik csi.CSI(delays=False) / csi.CSI(fflush=False) voor de laatste twee.

  • Framesizes die csi niet 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 voorheen OSError bij een fout (de RuntimeError van csi wordt 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.

Commits: c45f99cad, b5c7853f2

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 naar csi (v5.0.0-migratie); vervang disable_delays / disable_full_flush door de constructorargumenten van csi.CSI() en laat get_fb- / auto-rotatie-aanroepen weg.

  • Laad je één enkele afbeelding met copy_to_fb=True en verwacht je die te zien? Voeg img.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 nu csi.CUSTOM.

  • Al het overige: opnieuw flashen en draaien.