{"id":28383075,"url":"https://github.com/opendronemap/rscalibration","last_synced_at":"2025-06-25T07:30:37.966Z","repository":{"id":38995860,"uuid":"495865471","full_name":"OpenDroneMap/RSCalibration","owner":"OpenDroneMap","description":"Docs and scripts to estimate a camera's rolling shutter readout time","archived":false,"fork":false,"pushed_at":"2022-12-05T16:28:22.000Z","size":55,"stargazers_count":8,"open_issues_count":0,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-06-21T21:34:31.735Z","etag":null,"topics":["estimation","readout","rolling","shutter"],"latest_commit_sha":null,"homepage":"https://opendronemap.github.io/RSCalibration/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/OpenDroneMap.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-05-24T14:43:51.000Z","updated_at":"2024-12-20T20:26:24.000Z","dependencies_parsed_at":"2023-01-24T06:00:45.534Z","dependency_job_id":null,"html_url":"https://github.com/OpenDroneMap/RSCalibration","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/OpenDroneMap/RSCalibration","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenDroneMap%2FRSCalibration","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenDroneMap%2FRSCalibration/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenDroneMap%2FRSCalibration/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenDroneMap%2FRSCalibration/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/OpenDroneMap","download_url":"https://codeload.github.com/OpenDroneMap/RSCalibration/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/OpenDroneMap%2FRSCalibration/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261826860,"owners_count":23215657,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["estimation","readout","rolling","shutter"],"created_at":"2025-05-30T05:11:48.972Z","updated_at":"2025-06-25T07:30:37.960Z","avatar_url":"https://github.com/OpenDroneMap.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RSCalibration\n\nThis repository documents practical methods to estimate [rolling shutter](https://en.wikipedia.org/wiki/Rolling_shutter) readout times.\n\nSoftware such as [ODM](https://github.com/OpenDroneMap/ODM) can compensate for the rolling shutter effect when a set of photos is captured in motion, but knowledge of the sensor readout time is necessary to perform this correction.\n\nWe present below an inexpensive method to build a reader device using an Arduino:\n\n![image](https://user-images.githubusercontent.com/1951843/174381801-bb0e3c9f-6aa4-43dd-bf72-7c10b16fa231.png)\n\n![image](https://user-images.githubusercontent.com/1951843/174392415-d2aee736-ed5a-4c93-83ca-0ac3eb5f9425.png)\n\nThe idea is to blink an LED at ~2khz, capture a photo using a fast shutter speed and count the number of lines in the result. Each line will represent ~1ms of time, thus the total readout time will be close to: `number of lines ~= readout time (ms)`.\n\n## Required hardware\n\nMost of these items can be found on eBay, or electronics retailers like Sparkfun.\n\n - [x] 1x Arduino-compatible board\n - [x] 1x 80Ω (or less) resistor\n - [x] 1x LED\n - [x] 1x breadboard (not strictly required, but makes wiring easier)\n - [x] 2x 22AWG jump wires (not strictly required, but makes wiring easier)\n\n## Schematics\n\n![image](https://user-images.githubusercontent.com/1951843/174392464-3da5045b-e83d-4d80-a1fd-efc9d8023ff9.png)\n\n## Code\n\nYou can upload the following code to the Arduino board and change the `ledPin` variable if needed. Choose a digital output pin:\n\n - [blink.ino](https://github.com/OpenDroneMap/RSCalibration/blob/main/blink.ino)\n\n## Procedure\n\n\u003e **Warning**  \n\u003e For cameras with non-Global Mechanical Shutters please try to force Electronic Shutter mode to ensure accurate readings.\n\n1. Turn on the Arduino device\n2. Place the camera on a stable surface close to the LED\n3. Take a picture of the LED using the **fastest shutter speed setting available**\n4. Examine the picture and count the total number of lines (both dark and colored lines). For example, the picture below has ~25 lines and the estimated readout time is thus `25ms`:\n\n![image](https://user-images.githubusercontent.com/1951843/174392533-429943a6-82b2-4948-9637-3cb35fd21707.png)\n\n## No-Tinker Solution\n\n### Required Hardware\n\n - [x] Raspberry Pi Pico (RP2040)-compatible board\n ![image](https://user-images.githubusercontent.com/19295950/175455634-6be7e3cd-9abe-4260-8af0-7bab0909fb67.png)\n \n### Schematics\n\nYou will only need to connect your RP2040 board to your computer for programming using whatever cable/interface your board has (microUSB, Type-C, etc)\n\n### Code\n\nYou can upload the following MicroPython code to the RP2040-compatible board using Thonny:  \n - [main.py](https://github.com/OpenDroneMap/RSCalibration/blob/main/main.py)\n\n```python\nfrom machine import Pin, Timer\nled = Pin(25, Pin.OUT)\ntimer = Timer()\n\ndef blink(timer):\n    led.toggle()\n\ntimer.init(freq=1000, mode=Timer.PERIODIC, callback=blink)\n```\n\n![image](https://user-images.githubusercontent.com/19295950/175456447-7df30e7e-4034-43b4-8cb1-95d51fa1c1a4.png)\n\n1. Plug in your RP2040-compatible board while holding the Bootsel button. It will show up as a removable-storage drive\n2. Set Thonny to use the MicroPython Interpreter under Options -\u003e Interpreter\n3. Upload the latest MicroPython firmware to the RP2040-compatible board\n4. After the board reboots, open main.py with Thonny and save it to the RP2040-compatible board as main.py\n\n### Procedure\n\n1. Same data collection procedure as above\n\n## Contribute to ODM\n\nYou can use the form at https://opendronemap.github.io/RSCalibration/ to contribute to [ODM's database of rolling shutter readout times](https://github.com/OpenDroneMap/ODM/blob/master/opendm/rollingshutter.py).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopendronemap%2Frscalibration","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopendronemap%2Frscalibration","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopendronemap%2Frscalibration/lists"}