13.3.1.6. Referensi API¶
Permukaan publik dari paket openmv adalah kelas Camera untuk berkomunikasi dengan kamera dan hierarki OMVException untuk kesalahan protokol. Keduanya didokumentasikan di halaman ini.
13.3.1.6.1. Kelas Camera¶
- class openmv.Camera(port: str, *, baudrate: int = 921600, crc: bool = True, seq: bool = True, ack: bool = True, events: bool = True, timeout: float = 1.0, max_retry: int = 3, max_payload: int = 4096, drop_rate: float = 0.0)¶
Proksi sisi host untuk OpenMV cam yang terhubung melalui USB serial.
- Parameter:
port -- Jalur perangkat serial. Di Linux,
/dev/ttyACMxuntuk USB CDC dan/dev/ttyUSBxuntuk jembatan USB-ke-UART. Di macOS,/dev/tty.usbmodem...atau/dev/cu.usbmodem.... Di Windows,COMx.baudrate -- Laju baud serial. Melalui USB,
921600adalah nilai ajaib yang mengalihkan kamera dari MicroPython REPL ke protokol OpenMV -- nilai lain pada tautan USB membiarkan kamera dalam mode REPL, sehingga nilai default harus digunakan. Melalui tautan UART, nilai ini adalah laju baud jalur yang sebenarnya dan dapat diatur bebas di kedua sisi.crc -- Aktifkan validasi CRC pada setiap paket.
seq -- Aktifkan nomor urut per paket.
ack -- Wajibkan pengakuan paket.
events -- Aktifkan notifikasi event dari kamera.
timeout -- Batas waktu per operasi dalam detik.
max_retry -- Jumlah percobaan ulang sebelum memunculkan kesalahan pada paket yang gagal.
max_payload -- Ukuran payload maksimum yang dinegosiasikan dalam byte. Kamera dapat menegosiasikan ke bawah.
drop_rate -- Probabilitas menjatuhkan paket khusus pengujian, dalam
[0.0, 1.0]. Biarkan pada0.0dalam produksi.
Kelas ini mendukung protokol context-manager;
with Camera(port) as cam:memanggilconnect()saat masuk dandisconnect()saat keluar.
13.3.1.6.2. Koneksi¶
- Camera.connect() None¶
Buka port serial dan lakukan handshake protokol. Status yang di-cache (daftar channel, informasi sistem, informasi versi) diisi sebagai efek samping. Dipanggil secara otomatis oleh context manager.
- Camera.disconnect() None¶
Tutup port serial dan lepaskan transport. Dipanggil secara otomatis ketika context manager keluar.
- Camera.boot() None¶
Loncat kamera ke bootloader-nya. Koneksi terputus karena kamera melakukan reboot.
- Camera.update_capabilities() None¶
Negosiasikan ulang kemampuan protokol (CRC, pemeriksaan urutan, ACK, event, payload maksimum) dengan kamera. Kamera melaporkan payload maksimum yang dapat ditanganinya; permintaan host dipotong ke nilai tersebut dan pengaturan yang disepakati dikirim kembali. Dipanggil secara otomatis oleh
connect()-- tidak ada alasan untuk memanggilnya dari kode pengguna kecuali flag konstruktor perlu dinegosiasikan ulang pada koneksi yang sudah ada.
13.3.1.6.3. Eksekusi skrip¶
13.3.1.6.4. Streaming¶
- Camera.streaming(enable: bool, raw: bool = False, resolution: tuple[int, int] | None = None) None¶
Aktifkan atau nonaktifkan streaming bingkai dan pilih format transmisi.
- Parameter:
enable --
Truemengaktifkan streaming,Falsemenonaktifkannya.raw -- Ketika
False(default), kamera mengompres setiap bingkai dengan JPEG sebelum menempatkannya di channel stream danread_frame()melakukan dekompresi di host. KetikaTrue, kamera mengirim buffer piksel yang ditangkap tanpa kompresi -- pilihan yang tepat pada kamera tanpa dukungan hardware JPEG, di mana kompresi perangkat lunak adalah langkah paling lambat dalam loop.resolution --
(width, height)target yang menjadi target kamera untuk memperkecil setiap bingkai mentah sebelum dikirim, karena bingkai tanpa kompresi jauh lebih besar dari yang dikompres dengan JPEG. Diperlukan ketikaraw=True; diabaikan sebaliknya.
- Camera.read_frame() dict | None¶
Baca bingkai terbaru dari channel stream.
- Kembali:
Nonejika tidak ada bingkai yang menunggu, atau dict dengan kunciwidth(int, piksel),height(int, piksel),format(int, pengenal format piksel yang dideklarasikan kamera),depth(int, ukuran citra yang dikompres dalam byte untuk bingkai JPEG / PNG; tidak digunakan untuk format tanpa kompresi),data(bytes, RGB888 dengan panjangwidth * height * 3), danraw_size(int, byte yang dikirim kamera melalui USB sebelum dekode).
13.3.1.6.5. Channel khusus¶
- Camera.has_channel(name: str) bool¶
- Kembali:
Truejika channel yang terdaftar dengannameada di kamera.
- Camera.channel_size(name: str) int¶
- Kembali:
Jumlah byte yang saat ini tersedia di channel yang dinamai, atau
0ketika channel kosong atau tidak ada.
- Camera.channel_write(name: str, data: bytes) bool¶
Tulis
datake channel khusus. Penulisan yang lebih besar dari payload secara otomatis dibagi ke beberapa paket.- Parameter:
name -- Nama channel yang didaftarkan oleh skrip sisi kamera.
data -- Payload berupa bytes untuk dikirim.
- Kembali:
Truejika channel ada dan penulisan telah dikirim,Falsesebaliknya.
- Camera.read_status() dict[str, bool]¶
Poll setiap channel yang terdaftar.
- Kembali:
Dict yang memetakan nama channel ke boolean "data siap dibaca".
- Camera.update_channels() None¶
Segarkan daftar channel yang di-cache dari kamera. Berjalan secara otomatis pada saat berikutnya pencarian channel-berdasarkan-nama dilakukan setelah event pendaftaran channel tiba; aplikasi yang ingin mengetahui channel yang baru terdaftar segera dapat memanggil ini secara langsung.
- Camera.get_channel(name: str | None = None, channel_id: int | None = None) int | str | None¶
Cari channel berdasarkan nama (mengembalikan ID numeriknya) atau berdasarkan ID (mengembalikan namanya). Menyegarkan cache channel melalui
update_channels()terlebih dahulu jika event pendaftaran channel sedang tertunda.- Parameter:
name -- Nama channel untuk diselesaikan menjadi ID.
channel_id -- ID channel untuk diselesaikan menjadi nama.
- Kembali:
ID atau nama yang sesuai, atau
Noneketika channel tidak ada. Salah satu darinameatauchannel_idharus disediakan.
13.3.1.6.6. Introspeksi perangkat¶
- Camera.version() dict¶
Kembalikan triple versi protokol, bootloader, dan firmware kamera. Di-cache setelah
connect(). Setiap triple adalah tuple(major, minor, patch)dariint:protocol_version-- versi protokol wire OpenMV yang diimplementasikan kamera.bootloader_version-- citra bootloader yang ada di flash.firmware_version-- firmware MicroPython yang sedang berjalan.
- Camera.system_info() dict¶
Kembalikan informasi kemampuan hardware dan memori kamera. Di-cache setelah
connect(). Kunci dict yang dikembalikan terbagi dalam empat kelompok.Identitas
cpu_id-- pengenal CPU 32-bit.device_id-- 3-tuple dari kata 32-bit, nomor seri perangkat unik yang tertanam dalam silikon.chip_id-- 3-tuple dari kata 32-bit, satu entri per sensor citra yang terhubung ke kamera.usb_vid-- ID vendor USB.usb_pid-- ID produk USB.
Ukuran memori (semua dalam kilobyte)
flash_size_kb-- total flash internal.ram_size_kb-- total RAM.framebuffer_size_kb-- RAM yang dicadangkan untuk penangkapan citra.stream_buffer_size_kb-- RAM yang dicadangkan untuk channel stream yang mengirimkan bingkai ke host.
Flag kemampuan (satu boolean per fitur, semua dinamai
<feature>_present)gpu_present-- unit pemrosesan grafis.npu_present-- unit pemrosesan saraf.isp_present-- prosesor sinyal citra.venc_present-- enkoder video.jpeg_present-- enkoder hardware JPEG.dram_present-- DRAM eksternal.crc_present-- akselerator CRC.pmu_present-- unit pemantauan kinerja.wifi_present-- radio Wi-Fi.bt_present-- radio Bluetooth.sd_present-- slot kartu SD.eth_present-- Ethernet PHY.multicore_present-- beberapa inti CPU.
Lainnya
usb_highspeed-- boolean,Trueketika USB dienumerasi dalam mode high-speed (USB 2.0 HS, 480 Mbps).pmu_eventcnt-- jumlah penghitung event PMU yang tersedia;0ketika tidak ada PMU.
13.3.1.6.7. Diagnostik¶
13.3.1.6.8. Profiler¶
Profiler melaporkan jumlah panggilan per fungsi dan waktu eksekusi min / maks / total untuk modul firmware yang diinstrumentasi -- saat ini image, ml, dan ulab. Entri dan keluar fungsi dicegat pada waktu kompilasi; runtime mengambil sampel penghitung mikrodetik monoton pada setiap entri dan keluar, mengakumulasi hasilnya per fungsi, dan mengekspos tabel ke host melalui channel profile.
Profiler hanya dibangun ke dalam firmware ketika PROFILE_ENABLE=1 diteruskan ke make. Citra firmware stok tidak menyertakannya -- flag -finstrument-functions yang ditambahkan build ke modul yang dilacak memiliki overhead runtime yang tidak sepele, sehingga build profiling diproduksi dari sumber untuk sesi debugging spesifik yang membutuhkannya. Ketika firmware tidak dibangun dengan flag tersebut, channel profile tidak terdaftar dan setiap metode profiler di halaman ini kembali dengan diam tanpa melakukan apa pun.
Arm Performance Monitoring Unit (PMU) adalah blok penghitung hardware Cortex-M55 -- sekumpulan kecil penghitung yang dapat dikonfigurasi yang melacak jumlah siklus, cache hit dan miss, perilaku cabang, dan event yang didefinisikan arsitektur lainnya tanpa memperlambat kode yang sedang diukur. Pada kamera yang memilikinya -- AE3 dan N6, dua kamera dalam jajaran OpenMV yang dibangun di sekitar M55 -- profiler mengambil sampel penghitung ini bersama data waktu dan total event muncul di setiap rekaman per fungsi. Kamera tanpa PMU tetap menghasilkan rekaman waktu; kolom event dikembalikan sebagai nol, dan profiler_event() adalah no-op.
- Camera.profiler_mode(exclusive: bool = False) None¶
Beralih antara timing inklusif dan eksklusif. Timing inklusif membebankan waktu callee ke pemanggil; timing eksklusif tidak.
- Parameter:
exclusive --
Truememilih timing eksklusif,Falsememilih timing inklusif.
- Camera.profiler_reset(config: list | None = None) None¶
Hapus semua penghitung profil.
config=Nonejuga memulihkan penetapan event PMU default.- Parameter:
config -- Dicadangkan untuk override konfigurasi per-penghitung di masa mendatang. Teruskan
Noneuntuk mempertahankan default.
- Camera.profiler_event(counter_num: int, event_id: int) None¶
Ikat salah satu slot penghitung PMU ke event hardware tertentu.
- Parameter:
counter_num -- Indeks penghitung.
event_id -- Pengenal event yang didefinisikan arsitektur.
- Camera.read_profile() list[dict] | None¶
Kembalikan rekaman profil per fungsi yang dikumpulkan sejak reset terakhir. Setiap rekaman adalah dict dengan
address,caller,call_count,min_ticks,max_ticks,total_ticks,total_cycles, dan tupleeventsyang berukuran sesuaipmu_eventcntkamera.- Kembali:
Daftar dict rekaman, atau
Nonejika channel profil tidak tersedia atau belum ada data yang dikumpulkan.
13.3.1.6.9. Subklassing dan internal channel¶
Metode yang didokumentasikan di atas mencakup setiap penggunaan umum dari paket ini. Beberapa pola -- menangani event sisi kamera yang ingin direaksi host, mengunci channel untuk pertukaran multi-langkah, berkomunikasi dengan channel yang membawa data berbentuk sebagai pengganti byte stream, atau mengendalikan perintah kontrol khusus channel -- memerlukan metode yang disimpan Camera dengan awalan garis bawah. Nama-nama ini bersifat privat secara konvensi (Python tidak mengubah namanya), dan aplikasi yang membutuhkannya diharapkan untuk membuat subkelas Camera atau memanggil metode secara langsung.
Subklassing untuk bereaksi terhadap event. Setiap event yang dikirim kamera tiba melalui Camera._handle_event(). Membuat subkelas Camera dan menimpa metode ini adalah cara aplikasi bereaksi terhadap event yang diangkat skrip sisi kamera; halaman Kejadian memandu pola lengkapnya.
- Camera._handle_event(channel_id: int, event: int) None¶
Kirimkan satu event dari kamera. Dipanggil oleh lapisan transport setiap kali paket event tiba. Timpa dalam subkelas untuk menambahkan penanganan khusus aplikasi; panggil
super()._handle_event(...)untuk mempertahankan perilaku default (penyegaran daftar channel padaCHANNEL_REGISTERED, pelacakan frame-ready pada channelstream, logging mulai / berhenti channelstdin).- Parameter:
channel_id --
0untuk event sistem, sebaliknya ID channel yang terdaftar.event -- Pengenal event; nilai berasal dari enum
EventTypeuntuk event sistem dan dari apa pun yang dipilih backend channel sisi kamera untuk event channel.
Subkelas yang menambahkan metode berbicara protokolnya sendiri harus menghiasi metode tersebut dengan retry_if_failed() agar mewarisi perilaku resync-dan-coba-ulang yang sama yang dimiliki setiap metode yang dikirimkan di halaman ini.
- static Camera.retry_if_failed(func)¶
Dekorator. Membungkus metode instance sehingga mencoba ulang sekali ketika transport memunculkan
ResyncException. Setiap metode yang memanggil_send_cmd_wait_resp()(secara langsung atau melalui salah satu wrapper_channel_*) harus membawa dekorator ini:class MyCamera(Camera): @Camera.retry_if_failed def my_custom_command(self, payload): return self._send_cmd_wait_resp(Opcode.MY_CMD, 0, payload)
Penguncian channel memastikan status channel tidak berubah di antara dua operasi terkait (misalnya _channel_size() diikuti oleh _channel_read(), pada channel yang terus menambahkan data). read_frame() dan read_profile() menggunakan ini secara internal; aplikasi yang mengendalikan channel khusus dengan akses multi-langkah melakukan hal yang sama.
- Camera._channel_lock(channel_id: int) bool¶
Dapatkan kunci eksklusif pada channel. Operasi host lainnya pada channel yang sama diblokir hingga kunci dilepaskan.
- Parameter:
channel_id -- ID channel numerik, biasanya diselesaikan dengan
get_channel().- Kembali:
Trueketika kunci diberikan.
- Camera._channel_unlock(channel_id: int) bool¶
Lepaskan kunci yang sebelumnya diambil dengan
_channel_lock(). Selalu dipasangkan dengan panggilan kunci; gunakantry/finallyuntuk memastikan pelepasan kunci terjadi bahkan ketika pembacaan di antaranya memunculkan pengecualian.- Parameter:
channel_id -- ID channel numerik, biasanya diselesaikan dengan
get_channel().
Channel berbentuk membawa rekaman terstruktur daripada byte stream datar. Channel profiler adalah contoh yang dikirimkan: bentuknya adalah (record_count, record_size) dan host yang ingin mengetahui berapa banyak rekaman yang menunggu membaca bentuknya daripada ukuran byte.
- Camera._channel_shape(channel_id: int) tuple[int, ...]¶
Baca deskriptor bentuk dari sebuah channel.
- Parameter:
channel_id -- ID channel numerik, biasanya diselesaikan dengan
get_channel().- Kembali:
Tuple dari integer 32-bit tidak bertanda yang mendeskripsikan tata letak channel. Maknanya bersifat khusus channel.
Perintah kontrol khusus channel -- mulai, berhenti, reset, konfigurasi -- menggunakan satu opcode (CHANNEL_IOCTL) dengan nomor perintah khusus channel dan payload struct.pack opsional. Metode yang dikirimkan seperti stop(), exec(), dan streaming() adalah pembungkus tipis di sekitar panggilan _channel_ioctl() terhadap channel stdin dan stream; channel sisi kamera khusus yang mendefinisikan menu ioctlnya sendiri dikendalikan dengan cara yang sama.
- Camera._channel_ioctl(channel_id: int, cmd: int, fmt: str | None = None, *args) bytes | None¶
Keluarkan perintah ioctl pada sebuah channel.
- Parameter:
channel_id -- ID channel numerik, biasanya diselesaikan dengan
get_channel().cmd -- Nomor perintah yang didefinisikan oleh backend channel sisi kamera.
fmt -- String format
structopsional untuk tuple argumen. TeruskanNoneuntuk ioctl yang tidak menerima argumen.args -- Nilai yang cocok dengan
fmt.
- Kembali:
Payload apa pun yang dikembalikan channel, atau
None.
Varian byte-stream berdasarkan ID dari metode channel publik melewati pencarian nama-ke-ID dan menerima offset byte eksplisit -- berguna untuk membaca potongan dari tengah buffer besar (misalnya rekaman channel profile).
- Camera._channel_size(channel_id: int) int¶
- Parameter:
channel_id -- ID channel numerik, biasanya diselesaikan dengan
get_channel().- Kembali:
Byte yang saat ini tersedia pada channel.
- Camera._channel_read(channel_id: int, offset: int, length: int) bytes¶
Baca
lengthbyte mulai darioffset. Pembacaan multi-paket dirakit ulang secara otomatis.- Parameter:
channel_id -- ID channel numerik, biasanya diselesaikan dengan
get_channel().offset -- Offset byte untuk mulai membaca.
length -- Jumlah byte yang akan dibaca.
- Camera._channel_write(channel_id: int, data: bytes, offset: int = 0) None¶
Tulis
datapadaoffsetyang diberikan. Penulisan multi-paket dibagi ke beberapa paket secara otomatis.- Parameter:
channel_id -- ID channel numerik, biasanya diselesaikan dengan
get_channel().data -- Payload berupa bytes untuk ditulis.
offset -- Offset byte untuk mulai menulis.
Primitif protokol adalah level terendah yang diekspos kelas -- entri kirim-perintah-mentah, ambil-daftar-channel-mentah, dan resinkronisasi-manual yang menjadi landasan semua hal di atas. Aplikasi menggunakannya ketika mengirim opcode yang belum dibungkus kelas, atau ketika mengimplementasikan pemulihan khusus dalam subkelas.
- Camera._send_cmd_wait_resp(opcode: int, channel: int = 0, data: bytes = b'') bytes | None¶
Kirim perintah protokol dan tunggu respons kamera. Primitif yang menjadi landasan setiap metode lain di bagian ini.
- Parameter:
opcode -- Nomor perintah. Enum
Opcodeyang dikirimkan mencantumkan kode yang dikirimkan firmware, tetapi parameternya hanyalah integer -- build firmware khusus dapat mendefinisikan dan merespons kodenya sendiri.channel -- ID channel, atau
0untuk perintah sistem.data -- Payload khusus perintah.
- Kembali:
Payload respons, atau
Noneuntuk perintah sepertiOpcode.SYS_RESETdanOpcode.SYS_BOOTyang memutus koneksi.
- Camera._channel_list() dict¶
Ambil daftar channel saat ini dari kamera tanpa menyentuh kamus
channels_by_iddanchannels_by_nameyang di-cache yang diisi olehupdate_channels(). Berguna untuk subkelas yang ingin memeriksa status channel kamera secara langsung.- Kembali:
Dict yang memetakan ID channel ke
{'name': str, 'flags': int}.
- Camera._resync() None¶
Jalankan ulang handshake protokol dari awal. Dipanggil secara otomatis oleh
connect()pada koneksi awal dan oleh setiap metode publik yang menangkapOMVExceptiondari transport. Aplikasi yang mengimplementasikan loop pemulihan sendiri dalam subkelas dapat memanggil ini secara langsung setelah menangani kesalahan yang mendasarinya.
13.3.1.6.10. Pengecualian¶
- exception openmv.OMVException¶
Kelas dasar untuk setiap kesalahan tingkat protokol. Tiga subkelas di bawah ini semuanya mewarisi darinya, sehingga satu
except OMVExceptionmencakup seluruh permukaan kesalahan.
- exception openmv.TimeoutException¶
Kamera tidak merespons dalam batas waktu yang dikonfigurasi. Subkelas dari
OMVException.
- exception openmv.ChecksumException¶
CRC sebuah paket tidak cocok. Dimunculkan setelah protokol menghabiskan anggaran percobaan ulangnya. Subkelas dari
OMVException.
- exception openmv.SequenceException¶
Paket tiba dengan nomor urut yang tidak terduga setelah percobaan ulang. Subkelas dari
OMVException.