v5.0.1#
A v5.0.1 egy karbantartó kiadás a v5.0.0-ra épülve — a régi sensor modul a csi fölötti Python kompatibilitási réteggé válik, a képkocka-pufferbe töltött képek mostantól úgy jelennek meg az előnézetben, mint a kamera képkockái, a JPEG-kódolók megszabadulnak az 1 MB-os kimeneti korláttól és helyesen kezelik a túlcsordulást, továbbá egy sor kamera-, protokoll-, hálózati és ML-könyvtárbeli javítás érkezett. A csi modulra írt szkriptek számára nem vezet be visszafelé nem kompatibilis API-változásokat; a néhány viselkedésbeli változás a visszafelé nem kompatibilis API-változások alatt található.
Kiemelt újdonságok#
A
sensormodul mostantól befagyasztott Python modul, amely acsimodulra épül. Importáláskor elavulási figyelmeztetést ír ki; néhány függvény, amelyet acsimodul nem tud támogatni, mostantólOSErrorhibát vált ki. Lásd a sensor modul változásai.A betöltött képek úgy jelennek meg az előnézetben, mint a kamera képkockái. A
copy_to_fb=Truebeállítással a képkocka-pufferbe helyezett kép (image.Image,image.ImageIO.read(),fir.snapshot(),tof.snapshot()) — mindazzal együtt, amit rárajzoltak — akkor kerül kiürítésre az IDE felé, amikor a következő kép felülírja a képkocka-puffert, nem pedig azonnal. Lásd az előnézet változásai.A JPEG-kódoló átdolgozása. Megszűnt az 1 MB-os kimenetipuffer-korlát (a puffer mérete a szabad memóriából származik), a túlcsordulást mind a szoftveres, mind a hardveres úton kezeli a csonka fájlok írása helyett, és egy tömörített kép másik tömörített kiterjesztéssel való mentése szemét kiírása helyett kivételt vált ki.
Új
protocol.poll()és hat új CBOR widget (text,lineedit,pushbutton,spinbox,radio,waveform) aprotocol.CBORChannelosztályhoz.YOLO Pro utófeldolgozó, FLIR Lepton 3.1R / UW támogatás, IMU burst olvasás, CAN az OpenMV N6-on és egy hálózatképes szimulátor célplatform.
Új funkciók#
YoloPro— új utófeldolgozó az Edge Impulse YOLO Pro objektumészlelő modellekhez, valamint egyyolo_pro_detector.pypélda. (f3f150ebd, ea7bbb398)protocol.poll()— igény szerint lefuttatja a protokollfeladat egy iterációját olyan egyéni transzportokhoz, amelyeket sem az USB-megszakítás, sem apoll_msidőzítő nem hajt meg. Aprotocol.init()is újra meghívható a verem újrainicializálásához. (c00c215f9, f849ffb1b)További CBOR csatorna-widgetek — a
protocol.CBORChannel.add()új típusokat kap:text(statikus karakterlánc),lineedit(írható karakterlánc),pushbutton(pillanatnyi művelet),spinbox(lépésköz szerinti numerikus bevitel),radio(opciócsoport) éswaveform(1D idősorsample_rate,serieséstypecodeargumentumokkal; a streameléshez rendelj hozzá átlapolt mintabájtokat). (8016d29ba)csi.CUSTOM— acsi.CSI.framesize()mostantól egy használható konstanst ad vissza egy egyéni(w, h)felbontás beállítása után, névtelen egész szám helyett. (af8841654)IMU burst olvasás — az
imu.__read_reg()opcionális írható puffert fogad el, és egyetlen tranzakcióban egymást követő regiszterekből tölti fel. (244ca480a)A FLIR Lepton 3.1R és Lepton UW modulokat felismeri a Lepton illesztőprogram, beleértve a radiometrikus erősítési módjaikat is. (0fc356632)
Szimulátor-hálózatkezelés — az
MPS2_AN500QEMU célplatform mostantól lwIP-vel és felhasználói módú hálózati kártyával rendelkezik, befagyasztottrequests,mqttéssensormodulokkal, valamint egy hálózati egységteszttel. (23546dfb1, 61d187305, 15096c3a2)OpenAI-kompatibilis API példa — az
openai_compatible.pykészít egy JPEG pillanatképet, és elküldi egy chat-completions végpontra a jelenet leírásához. (79033c6aa)SX126x LoRa példák — a micropython-lib
lora-sx126xillesztőprogramja (alora-sync/lora-asynccsomagokkal együtt) be van fagyasztva az OpenMV RT1062 firmware-be, küldő/fogadó/ping-pong/képfolyam példákkal egy SX1261 vagy SX1262 modul SPI-buszra kötéséhez. Ez közösségi hozzájárulásként érkezett támogatás; az OpenMV nem árul LoRa hardvert. (19576e1b1)
Egyéb változások és fejlesztések#
A
requestskönyvtár újraírása — a darabolt átvitelű válaszok dekódolásra kerülnek, elérhetővé vált egytimeoutargumentum (alapértelmezés: 5 s), a JSON és karakterlánc törzsek helyesen kerülnek sorosításra/kódolásra, a fejlécek feldolgozása nem különbözteti meg a kis- és nagybetűket, az állapotsor pedig pozíció szerint kerül feldolgozásra, a hívóheadersszótára lemásolásra kerül (így azauthtöbbé nem szivárog át a későbbi kérelmekbe), a törzs pedig blokkonként kerül beolvasásra egybytearray-be. (889f0b096)Az
mqttlustán importálja azsslmodult, így a modul és az egyszerű (nem TLS) kapcsolatok működnek az SSL-támogatás nélküli buildeken is. (c2e0899e8)A JPEG kimeneti puffer mérete a szabad memóriából származik a rögzített 1 MB-os korlát helyett; a kódolók a kép kiírása előtt a kódolt méretre vágják a puffert, így a nagy érzékelőkkel, magas minőségben készített felvételek többé nem hiúsulnak meg. (aa1ca6776)
ML utófeldolgozás tisztítása — a határoló dobozok generálása egységesítve lett a Darknet, Edge Impulse és Ultralytics utófeldolgozók között, a YOLOv8 kimenete pedig a küszöbölés után transzponálásra kerül, így a többi modellhez hasonlóan észlelésenként egy sorban tárolódik. (b5c7853f2, c45f99cad)
PAG7936 biztonságos leállítás — egy új érzékelő-leállítási jelző altatja el a PAG7936-ot a RESET/PWDN váltás előtt, ami megszünteti a lefagyásokat, amikor az érzékelőt hosszabbítókábelen használják. Az illesztőprogram továbbá a MIPI CSI-2 vagy a párhuzamos regiszterkészletét futásidőben, az érzékelő I2C-címe alapján választja ki, nem pedig fordítási időben. (10026530c, f6acf14ec, 5f0251c74)
Az
ImageIOlejátszási ütemezése mostantól a képkockák közötti intervallum kivárása alatt kiszolgálja a függőben lévő eseményeket, ahelyett hogyWFIállapotban aludna. (a54790193)MicroPython almodul-frissítések — teljes hálózati támogatás a QEMU porton,
machine.mem_backupSTM32-n a tartalék SRAM/BKP regisztereken keresztül, az SDIO hardveres folyamvezérlés letiltva marad STM32F4-en, valamint az MPU-attribútumok újrafelhasználása a nem gyorsítótárazható régiókhoz. (31ada5626, ab61d27a6, 06bddf13a)A
differential-translation.pyaz elavultsensormodul helyett a sajátcsi.CSIobjektumán keresztül rögzít, és a példák importálási sortávolsága egységesítve lett. (68c866e7f, 9ceff4513)
Hibajavítások#
Kamera és érzékelők:
Két egyéni
(w, h)felbontás egymás utáni beállítása az érzékelőt az első méreten hagyta, miközben acsi.CSI.width()/height()a másodikat jelentette; a „nincs változás” gyors útvonal mostantól kizárja az egyéni méreteket. (cfbb70156)A
csi.CSI.lens_correction()aradiéscoefértékeket logikai értékként dolgozta fel, így az illesztőprogramnak átadott értékek nem a megadottak voltak. (ab44b3a77)PAG7936: az expozíció és az erősítés közvetlenül egymás utáni beállítása felülírta egymást (mindkettő ugyanazt a manuális módot használja, és a visszaolvasott regiszterek egy képkockával késnek); az illesztőprogram mostantól csak a manuális módba lépéskor tölti fel a manuális regisztereket, és csak az éppen beállított vezérlőt írja. (e7a18c0a0)
A PAG7936 és PS5520 BAYER rögzítés az OpenMV N6-on „Failed to initialize the CSI interface” hibával meghiúsult a teljes felbontástól eltérő bármely méretnél, mert az N6 ISP nem tudja átméretezni a nyers Bayer képet. Az érzékelők mostantól BAYER esetén a kért méretnek megfelelő natív módban futnak (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; a QVGA-nak nincs natív módja, és nem támogatott). (fe6790055, b7622b245)
Képkódolás és mentés:
Szoftveres JPEG-kódoló: a kimeneti puffer túlcsordulása mindig végzetes volt, mert a realloc útvonal le volt tiltva; mostantól növeli a puffert (egyszerre a méretének felével), ha az a sajátja, tisztán visszalép, ha elfogy a memória, és megvágja az eredményt. A
jpeg_write/mjpeg_writesikertelen kódolás után többé nem írja ki a puffert. (28e1110be)Hardveres JPEG-kódolók (STM32): túlcsorduláskor részlegesen kódolt képet adtak vissza a lefoglalt mérettel, ami EOI jelölő nélküli csonka fájlokat eredményezett (pl. egy 5 MP-es felvétel 100-as minőségben, üres alsó féllel). Mostantól jelentik a túlcsordulást, hiba esetén felszabadítják a puffert, siker esetén pedig megvágják. (22ce9619c)
A VC8000 kódoló minden kérésre csendben 4:2:0 krominanciát állított elő; a nem 4:2:0 almintavételezés mostantól az azt támogató HW kodekre vált vissza. (71f2be7f2)
Az
image.Image.save()egy PNG kép.jpg-ként való mentésekor akár 1 MB inicializálatlan heap-tartalmat írt ki, egy JPEG kép.png-ként való mentésekor pedig üres fájlt. Mindkettő mostantól kivételt vált ki; a már a célformátumban lévő kép továbbra is változatlanul kerül másolásra. (6c1fdf822)A
png_writemostantól ellenőrzi a tömörítő visszatérési értékét, és a fájl létrehozása előtt tömörít, így egy hiba többé nem hagy maga után üres fájlt. (557f52d66)
Image modul:
Az
image.Image.get_pixel()rgbtuple=Truebeállítással BAYER és YUV képeken a konvertált pixelt egy veremváltozón túlra, a hívó által vezérelt eltolásra írta. (13f2a17b6)A
gif.Gif.add_frame()egy elérhetetlen Bayer/YUV konverziós ágtól szabadult meg; csak GRAYSCALE és RGB565 képek fogadhatók el, ahogyan azt a Python API már eddig is kikényszerítette. (f20d99d96)
Protokoll:
Dinamikus csatorna regisztrálása, amikor már minden hely foglalt volt, tartományon kívüli írást okozott; a csatornaazonosító mostantól előbb ellenőrzésre kerül, és a fenntartott csatornaazonosítókról statikus ellenőrzés biztosítja, hogy beleférnek a csatornatáblába. (68f635d1f)
A dinamikus csatornaobjektumok a gyökérmutatókban túlélték a szoftveres újraindítást, így a GC továbbra is az előző futás elavult heap-blokkjait pásztázta; a tábla mostantól inicializáláskor törlésre kerül. (ef0ebb03b, e23641145)
Portok:
i.MX RT: pótolva a hiányzó CAN és Encoder deinicializálás szoftveres újraindításkor. (7cb9d3dc2)
Hardver- és kártyatámogatás#
OpenMV N6 — a CAN mostantól engedélyezve van (
machine.CAN). (294f0febd, 91e1c9573)OpenMV AE3 — az
sdcardSPI illesztőprogram be van fagyasztva az AE3 akkumulátoros bővítőlap microSD foglalatához. (a258f4814)OpenMV RT1062 —
lora-sx126x/lora-sync/lora-asyncbefagyasztva (lásd Új funkciók).FLIR Lepton 3.1R / UW — a Lepton illesztőprogram felismeri minden Lepton-képes kártyán.
PAG7936 — biztonságos leállítás, futásidejű interfészválasztás, expozíció/erősítés javítás és BAYER rögzítés az N6-on.
PS5520 — BAYER rögzítés az N6-on natív méreteken.
Szimulátor (MPS2_AN500) — hálózatkezelés.
Minden kártya — a
sensorkompatibilitási modul be van fagyasztva minden kártya manifesztjébe.
Visszafelé nem kompatibilis API-változások#
A v5.0.1 nem vezet be visszafelé nem kompatibilis változásokat a csi és az image API-kban. A v5.0.0-n futó szkriptek változatlanul futnak, a következő viselkedésbeli változásokkal.
A sensor modul (behavior)#
A natív sensor modul (modules/py_csi.c) eltávolításra került, és egy befagyasztott Python modul váltotta fel, amely ugyanazt az API-t valósítja meg a csi modulra építve. Lásd sensor.
Commit: 5e3d40631
Az
import sensoraWARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead.üzenetet írja ki a terminálra.A rejtett
csi.CSIobjektum importáláskor jön létre, így a hiányzó kamera mostantól azimport sensorsornál vált ki hibát, nem pedig asensor.reset()hívásnál.Ezek a függvények mostantól
OSErrorhibát váltanak ki, mert acsimodulban nincs megfelelőjük:get_fb(),alloc_extra_fb(),dealloc_extra_fb(),set_auto_rotation(),get_auto_rotation(),disable_delays(),disable_full_flush(). (A két*_extra_fbfüggvény már a v5.0.0-ban is hibát váltott ki.) Az utolsó kettőhöz használd acsi.CSI(delays=False)/csi.CSI(fflush=False)formát.A
csiáltal nem exportált képkockaméretek (QQCIF,QQSIF,QQQQVGA,HQQQQVGA,HQQQVGA,HQQVGA,B64X32,B64X64,B128X64,B128X128,B160X160,B320X320,LCD,QQVGA2) mostantól(w, h)tuple-ök, amelyek egyéni felbontásként kerülnek továbbításra. Aget_framesize()a beállított tuple-t adja vissza, amíg a kamera még ezen a méreten van, így a konstansokkal való egyenlőségvizsgálatok továbbra is működnek.Az
ioctl()a kérés után legfeljebb négy argumentumot továbbít.A
sleep()/shutdown()hiba esetén továbbra isOSErrorhibát vált ki (acsiRuntimeErrorkivétele átfordításra kerül).
Migrálj a csi modulra — lásd a v5.0.0 migrációs táblázatot.
Képbetöltés a képkocka-pufferbe (behavior)#
A képet a képkocka-pufferbe töltő függvények — az image.Image copy_to_fb=True beállítással, az image.Image.copy() / image.Image.scale() és a to_* konverziók copy_to_fb=True beállítással, az image.ImageIO.read(), valamint az fir.snapshot() és tof.snapshot() copy_to_fb=True beállítással — korábban azonnal az IDE-előnézetbe küldték az új képet, így a visszaadott képre rajzolt tartalom soha nem látszott. Mostantól függőben lévőként jelölik meg a képkocka-puffert, és közvetlenül azelőtt ürítik ki — mindazzal együtt, amit rárajzoltak —, hogy a következő kép felülírná; ez ugyanaz a viselkedés, mint a csi.CSI.snapshot() esetén.
Commitok: 87b6db5ee, 7b1a35c2f, f773c740d
A képek folyamát olvasó ciklusokon nem kell változtatni, és mostantól megjelenítik a rajzolásukat. Egy egyetlen képet betöltő és leálló szkriptnek explicit módon kell kiürítenie azt:
img = image.Image("example.bmp", copy_to_fb=True)
img.flush() # new: send it to the IDE preview now
time.sleep_ms(1000)
ML könyvtár (behavior)#
Csak azt a kódot érinti, amely a mellékelt utófeldolgozókból származtat vagy lemásolja azokat. A YoloV8 mostantól a küszöbölés után transzponálja a modell kimenetét, így a megmaradt észlelések dobozonként egy sorban tárolódnak (bb[:, 4:]), a Darknet és Edge Impulse utófeldolgozókhoz igazodva, dobozonként egy oszlop (bb[4:, :]) helyett. A nyilvános ((x, y, w, h), score) eredmények változatlanok.
A protocol modul (minor)#
A protocol.poll() visszatért. A v5.0.0 eltávolította, amikor a protokollfeladat az időzítőre került; most explicit módként tér vissza a feladat meghajtására egyéni transzportok esetén. Semmi más nem változott — az azt soha nem hívó szkripteket nem érinti.
Commit: c00c215f9
Build / eszközkészlet (tooling)#
Ez semmilyen MicroPython szkriptet nem érint. A py_image.c fel lett osztva: a leíróobjektumok (cascade, keypoints, LBP, keypoint match) a py_image_descriptor.c, a statisztikai objektumok (similarity, statistics, percentile, threshold, histogram) pedig a py_image_stats.c fájlba kerültek. Az imlib kódoló API-ja az imlib többi részéhez lett igazítva: a jpeg_compress / png_compress siker esetén 0-t, hiba esetén -1-et ad vissza, a jpeg_compress pedig elvesztette a realloc argumentumát (az átméretezés a puffer tulajdonjogától függ). Az OMV_PROTOCOL_MAX_CHANNELS az omv_protocol_channel.h fájlban OMV_PROTOCOL_CHANNEL_MAX lett, a portok pedig mostantól inicializáláskor meghívják a py_protocol_init0() függvényt. Az OMV_PAG7936_MIPI_CSI2 kártyadefiníció megszűnt (az interfész futásidőben kerül kiválasztásra). CI-függőségfrissítések és egy üres kiadási changelogot érintő javítás teszik teljessé. A forkok számára releváns részletekért lásd a firmware-tároló előzményeit.
Migrációs ellenőrzőlista#
Még mindig az
import sensorsort használod? Működik, figyelmeztetéssel. Térj át acsimodulra (v5.0.0 migráció); cseréld le adisable_delays/disable_full_flushhívásokat acsi.CSI()konstruktor argumentumaira, és hagyd el aget_fb/ automatikus forgatás hívásokat.Egyetlen képet töltesz be
copy_to_fb=Truebeállítással, és látni szeretnéd? Betöltés után add hozzá azimg.flush()hívást.Lemásoltad a YOLOv8 utófeldolgozót? A küszöbölt kimenetet sor szerint (
bb[:, 4:]) indexeld, ne oszlop szerint.Összehasonlítod a
csi0.framesize()értékét tuple beállítása után? Mostantólcsi.CUSTOMértéket ad vissza.Minden más: flashelj újra, és futtasd.