13.1.14. 타사 저장소#

IDE는 OpenMV의 자체 보드, 펌웨어, 예제, 기계 학습 모델 및 편집기 스텁을 제공하지만 다른 회사의 동일한 종류의 콘텐츠(파트너가 만든 보드, 여기에서 실행되는 펌웨어, 이에 맞춰 조정된 예제 및 모델, 펌웨어가 추가하는 API에 대한 코드 완성)도 로드할 수 있습니다. third-party repositories으로 도착합니다. IDE가 자체 콘텐츠와 병합하고 최신 상태로 유지하는 콘텐츠 폴더입니다.

이 페이지에는 두 명의 독자가 있습니다. 대부분은 다른 사람이 게시한 저장소를 설치하고 관리하는 사람을 위한 것입니다. 마지막 섹션인 authoring a repository는 벤더가 섹션을 구축하는 데 사용됩니다.

13.1.14.1. 타사 저장소 페이지#

모든 것은 편집 → 기본 설정 → OpenMV → 타사 저장소에서 관리됩니다. 표에는 설치된 모든 저장소와 각 저장소의 표시 이름, 짧은 ID(Built-in 또는 User인지 여부), 각 저장소가 제공하는 각 종류의 콘텐츠(펌웨어, 예제, 모델, 스텁)의 설치된 버전 및 업데이트 소스 URL이 나열됩니다.

Built-in은 드라이버 패키지가 프로그램에 파일을 추가하는 방식으로 공급업체가 제공한 설치 프로그램에 의해 저장소가 응용 프로그램의 자체 디렉터리에 배치되었음을 의미합니다. User은 URL에서 직접 설치했음을 의미합니다. 유일한 실질적인 차이점은 IDE에서 내장 저장소를 제거할 수 없다는 것입니다. 저장소에 있는 모든 것을 제거하면 제거되므로 제거 버튼이 비활성화됩니다.

13.1.14.2. 저장소 설치#

URL에서 설치는 공급업체가 게시하는 작은 매니페스트 파일인 저장소의 config.json 주소를 요청하고 해당 주소가 가리키는 모든 것을 설치합니다. 공급업체에서 제공한 URL을 붙여넣으세요. IDE는 매니페스트를 다운로드하고 나열된 펌웨어, 예제, 모델 및 스텁을 가져오고 각 다운로드를 확인합니다. 리포지토리 설치, 제거 및 업데이트는 모두 다시 시작한 후에 적용되므로 IDE는 설치가 완료되면 다시 시작하도록 제안합니다.

공급업체는 리포지토리를 애플리케이션 디렉토리에 직접 배치하는 설치 프로그램으로 배포할 수도 있습니다. 이 경우 페이지를 처음 열 때 단순히 Built-in 행으로 표시되며 설치할 것이 없습니다.

13.1.14.3. 저장소를 최신 상태로 유지#

업데이트 URL을 전달하는 저장소는 IDE가 시작될 때마다 확인됩니다. 최신 콘텐츠가 제공되면 IDE는 각 저장소와 관련 버전 목록을 표시하고 이를 설치하도록 제안합니다. 이 모든 것이 단일 프롬프트로 이루어집니다. 업데이트 확인은 요청 시 동일한 확인을 실행합니다.

13.1.14.4. 우선순위 및 재정의#

리포지토리는 순서가 지정된 목록으로, 맨 위에 우선순위가 가장 높으며 위로 이동 및 아래로 이동은 선택한 항목의 순서를 다시 지정합니다. 순서는 두 소스가 same 항목(동일한 USB 식별자가 있는 보드, 동일한 이름의 예제, 모델 또는 스텁)을 제공하는 경우에만 중요합니다. 그런 일이 발생하면 더 높은 항목이 승리하고 모든 저장소가 OpenMV의 내장 콘텐츠보다 우선합니다. 이는 의도적인 것입니다. 공급업체가 OpenMV 보드의 USB 식별자를 공유하는 보드에 자체 펌웨어를 공급하고, IDE가 제공하는 기본 펌웨어를 교체하거나, 기본 예제를 해당 하드웨어용으로 작성된 펌웨어로 바꾸는 방법입니다.

재정의는 익숙한 이름의 기능을 자동으로 변경하므로 페이지에서는 이름을 숨기지 않습니다. 재정의 경고 패널에는 적용되는 모든 재정의(어떤 저장소의 보드, 예제, 모델 또는 스텁이 어느 것을 재정의하는지)가 나열되며 저장소가 처음 표시될 때 동일한 목록이 메시지로 한 번 나타납니다. 보드, 예제 또는 모델이 OpenMV 문서에 설명된 대로 작동하지 않는 경우 이 패널을 가장 먼저 살펴보세요.

13.1.14.5. 저장소가 제공하는 것#

네 가지 종류의 콘텐츠가 각각 IDE의 일반적인 위치에 표시되므로 저장소가 설치되면 새로 배울 것이 없습니다.

  • Boards and firmware. 리포지토리 보드는 OpenMV 보드와 똑같이 동작합니다. 연결 시 인식되고, 상태 표시줄에 해당 유형이 표시되며, 최신 개발 릴리스 설치 경로를 포함하여 IDE를 통해 펌웨어가 업데이트됩니다. 펌웨어 업데이트 및 복구을 참조하세요.

  • Examples. 저장소의 예는 카테고리 트리에 병합된 파일 → 예에 표시됩니다. 공급업체가 OpenMV 카테고리와 동일한 이름을 붙인 카테고리의 예는 OpenMV 카테고리와 나란히 배치되고 새 카테고리는 자체 하위 메뉴가 됩니다. 다른 예와 마찬가지로 지원하는 보드로 필터링됩니다. 스크립트, 예제, 그리고 documents 폴더을 참조하세요.

  • Models. 저장소의 모델은 Model Zoo에 표시되며, 공급업체 자체 설명과 함께 동일한 방식으로 브라우저 트리에 병합됩니다.

  • Stubs. 저장소는 .pyi 스텁 파일을 제공할 수 있으므로 editor는 펌웨어에 추가된 기능에 대한 완성, 서명 및 문서를 제공합니다. 이는 공급업체의 사용자 정의 API에 대해 OpenMV 자체 모듈에서 얻는 것과 동일한 완성입니다.

13.1.14.6. 저장소 작성#

저장소는 공급업체 이름을 딴 폴더로, config.json 매니페스트와 저장소가 제공하는 각 콘텐츠 종류에 대한 하위 폴더를 포함합니다.

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

폴더 이름은 저장소 ID입니다. 문자로 시작하는 소문자, 숫자, -_입니다. 모든 부품 폴더는 선택 사항입니다. 가지고 있는 것만 배송하세요. 각 부품 폴더 옆에는 IDE가 최신 업데이트 시기를 결정하는 데 사용하는 단일 버전 문자열(1.2.0)이 포함된 <part>.version 파일이 있습니다.

13.1.14.6.1. 매니페스트#

config.json은 저장소의 이름을 지정하고 각 부분에 대해 다운로드 가능한 아카이브를 가리킵니다.

{
  "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은 폴더 이름과 일치해야 합니다. configUrl은 동일한 파일이 호스팅되는 주소입니다. IDE는 업데이트를 확인하기 위해 이를 다시 가져오므로 업데이트되지 않는 저장소에 대해서만 생략합니다. 각 부품에는 release 채널이 있으며, 펌웨어에는 최신 개발 릴리스 설치에 사용되는 development 채널도 있을 수 있습니다. 릴리스 version 값은 숫자로 비교되므로 더 높은 값이 업데이트로 제공됩니다. 개발 버전은 변경 사항에 대해서만 비교됩니다. sha256은 선택 사항이지만 존재하는 경우 확인됩니다.

url.zip을 가리킵니다(zip만 해당). 아카이브는 정확히 one top-level folder를 보유하고 IDE는 해당 폴더의 contents을 일부로 설치하므로 펌웨어 아카이브는 다음과 같이 패키지됩니다.

acme-fw-1.2.0.zip
  acme-firmware/           one wrapping folder; its name does not matter
    settings.json
    ACME_CAM1/
      firmware.bin
      romfs0.img

앞서 표시된 firmware/ 폴더에 압축을 풉니다. 예제, 모델 및 스텁 아카이브는 동일한 방식으로 패키징됩니다. 즉, examples/, models/ 또는 stubs/ 내부에 있는 항목을 포함하는 하나의 래핑 폴더입니다. 래핑 폴더의 이름은 무시됩니다. 중요한 것은 정확히 하나가 있다는 것입니다. 래핑 폴더 없이 아카이브 루트에 파일을 압축하거나 두 개 이상의 폴더에 래핑하면 설치되지 않습니다. 가장 간단한 방법은 폴더 자체를 압축하는 것입니다. 내용을 선택하는 대신 acme-firmware을 선택하고 압축합니다.

13.1.14.6.2. 보드, 예제, 모델 및 스텁#

firmware/settings.json은 IDE가 제공하는 펌웨어와 동일한 보드 설명 형식을 사용합니다. 각 보드에 boards 항목을 추가하세요. 몇 가지 규칙은 타사 보드에만 적용됩니다. boardFirmwareFolder는 고유해야 하며(바이너리가 있는 폴더의 이름을 지정하기 때문에 OpenMV 또는 다른 공급업체에서는 아직 사용되지 않음), 각 보드는 자체 firmware_version(연결 시 업데이트 프롬프트를 구동하는 요소)를 가지고 있어야 하며, 보드는 boardFirmwareFolderAlias를 OpenMV 보드의 펌웨어 폴더 이름으로 설정하여 해당 보드의 기본 예제 및 모델을 상속할 수 있습니다. OpenMV와 펌웨어 호환되는 보드입니다. OpenMV 부트로더 식별자 재사용이 예상됩니다(서명된 Windows 드라이버 포함). 내장 보드와 충돌하는 앱 식별자는 재정의 경고 패널에서 보고하는 해당 보드를 재정의합니다.

예는 OpenMV(01-Getting-Started)와 같이 번호가 매겨진 범주 폴더에 들어갑니다. OpenMV와 동일한 이름을 지정한 카테고리가 여기에 인터리브되고 새 이름이 자체 메뉴 섹션이 됩니다. 모델은 .tflite 및 일치하는 .txt 클래스 레이블을 포함하는 폴더로, index.html(및 선택적 이미지)는 Model Zoo에서 옆에 표시되는 설명인 폴더 아래에 그룹화됩니다. examples/index.csvmodels/index.csv는 OpenMV의 자체 예제 및 모델에서 사용하는 것과 동일한 보드 및 센서 필터 파일이며, 예제 및 모델 경로와 일치하고 어느 것이 어떤 보드에 대해 표시되는지 결정합니다. 스텁은 일반적인 .pyi 파일입니다. IDE는 OpenMV와 함께 해결되도록 해당 폴더를 언어 서버에 전달하고 기존 모듈의 이름을 딴 스텁(csi.pyi)이 해당 모듈의 완성을 재정의합니다.

13.1.14.6.3. 게시 및 업데이트#

게시하려면 안정적인 URL에서 config.json 및 참조하는 아카이브를 호스팅하고 사용자에게 설치할 config.json URL을 제공하세요. HTTPS를 통해 일반 파일을 제공하는 곳은 웹 서버, 객체 저장소, 코드 호스트 등 어디에서나 작동합니다. 업데이트를 제공하려면 새 아카이브를 업로드하고 호스팅된 config.json에서 영향을 받은 version 값을 추가한 후 다음에 각 사용자의 IDE가 실행될 때 업데이트를 제공합니다. 설치 프로그램을 통해 저장소를 설치한 사용자는 설치된 config.jsonconfigUrl이 있는 한 동일한 방식으로 업데이트를 받습니다.

13.1.14.6.4. GitHub에서 호스팅#

GitHub는 편리한 호스트이며 IDE는 자체 리소스를 가져오는 것과 동일한 방식으로 GitHub에서 가져옵니다. 배치할 부분은 매니페스트와 아카이브의 두 가지입니다.

config.json을 저장소에 보관하고 사용자에게 raw URL(파일을 표시하는 GitHub 페이지가 아닌 파일이 직접 제공되는 주소)을 제공합니다. 파일의 Raw 버튼에 표시됩니다. 그것은 형태를 가지고 있습니다

https://raw.githubusercontent.com/<user>/<repo>/<branch>/config.json

해당 원시 URL은 사용자가 URL에서 설치에 붙여넣는 것과 매니페스트의 자체 configUrl에 입력한 것이므로 IDE가 업데이트를 확인하기 위해 다시 가져옵니다. 브랜치(main)를 가리키면 새 커밋을 푸시하면 변경 사항이 게시됩니다. 대신 태그를 가리키면 사용자가 고정 버전으로 고정됩니다.

.zip 아카이브를 커밋하는 대신 release assets로 호스팅합니다. 릴리스는 바이너리 다운로드용으로 빌드되므로 수 메가바이트 펌웨어 번들은 저장소 기록이 아닌 해당 아카이브에 속합니다. 각 아카이브를 GitHub 릴리스에 연결하고 다음 형식의 다운로드 URL을 사용합니다.

https://github.com/<user>/<repo>/releases/download/<tag>/acme-fw-1.2.0.zip

매니페스트의 url 필드에 각각 아카이브의 sha256이 있습니다. 그런 다음 업데이트를 배송합니다. 새 아카이브를 릴리스에 첨부하고 config.json를 편집하여 해당 아카이브를 가리키고 버전을 추가한 다음 커밋합니다. IDE는 다음 실행 시 변경 사항을 선택합니다. 원시 파일은 푸시 후 몇 분 내에 새로 고쳐지는 캐시를 통해 제공됩니다.