Building practical AI
Deepak Kumar Tiwari

Deepak Kumar Tiwari

Technology & AI Leader · Building practical systems

Multimodal inspection / Guide 83

Solar Panel Drone Inspection Starts With Module Registration

Build solar panel drone inspection packets that separate RGB observations from thermal measurements and validate module registration, coverage, and capture timing.

Illustrative engineering guide. Examples are not client deployments, production-ready integrations, or evidence of measured results. Validate the design with your domain and security owners.

Reference workflow: Flight evidence manifest; Module candidate map; Specialist sensor pairing; Registration validation; Human maintenance review.
Reference workflow. Steps identify responsibilities, not necessarily separate agents. Branches and recovery paths are explained below. Open full-size diagram.

A hypothetical solar farm receives a drone mosaic with three bright rectangles and a confident report of “overheating modules.” The uploaded image is RGB, not radiometric thermal data. Worse, the mosaic was registered against last year’s row layout, so its candidate locations point to neighboring modules. The report is wrong twice: it invents a measurement modality and associates the observation with the wrong physical asset.

A useful inspection system should produce a module-specific review packet, not an automatic electrical diagnosis. RGB can support a visible-appearance candidate, such as unusual reflectance or surface obstruction. It cannot establish temperature, electrical integrity, hidden cell damage, or a repair decision. If a workflow needs temperature measurements, it must obtain and validate an appropriate specialist sensor product separately.

Define the Module Before the Anomaly

The evidence manifest needs farm, block, row, module identifier, layout revision, flight identifier, camera identifier, and original frame digests. Store capture time in UTC and preserve source frame timestamps when mosaicking multiple images. A mosaic production timestamp is not the time every module was observed; changing cloud or operating conditions can make that distinction operationally important.

Use source image coordinates in pixels from the upper-left corner. For the site map, use a documented projected coordinate reference system in meters and a versioned module footprint layer. If latitude and longitude are retained, label their angular units explicitly. A number called “x” must never ambiguously mean longitude, mosaic column, or row-local distance.

GDAL’s geotransform tutorial defines the affine mapping from pixel and line positions into georeferenced coordinates. It also distinguishes pixel corners from centers. That half-pixel distinction can matter near module boundaries. A valid transform describes a mapping; it does not prove that the mapped module is the correct one or that the mosaic has acceptable registration residuals.

Separate Sensor Pairing From Interpretation

The candidate extractor should output a polygon, source frames, and a neutral appearance label. The measurement stage pairs that polygon with independent thermal data only when module identity, timing, and sensor registration support the association. Do not recolor an RGB image with a heat palette and treat the resulting colors as temperatures. Presentation choices do not create a measurement channel.

For thermal measurements, retain calibration status, temperature units, relevant environmental and acquisition metadata, and the measurement method’s stated limitations. A numeric reading can still be unreliable. Reflection, acquisition geometry, and sensor assumptions require qualified interpretation; the harness should carry uncertainty rather than substitute a confident adjective for it. The example below stops before deciding whether any temperature difference is abnormal.

Model the original images, the mosaic activity, and the pairing result as different records. The W3C PROV overview provides this entities-and-activities vocabulary. It makes a practical review question answerable: which original captures support this module’s observation, and which processing revision assigned the module label?

Reproduce a False Modality Upgrade

This self-contained Python fixture tests the HARNESS with synthetic metadata, not a trained vision model, drone, thermal camera, or real inspection performance. It performs no media processing or engine API calls. All timing and registration limits are illustrative local policy values rather than solar inspection standards.

from math import isfinite

rgb = dict(module="R4-M8", layout=6, media="synthetic-rgb-4",
           captured_s=100, frame="site-grid-m", modality="RGB",
           registration_m=0.05, covered=True)
thermal = dict(module="R4-M8", layout=6, media="synthetic-ir-9",
               captured_s=103, frame="site-grid-m", modality="radiometric",
               registration_m=0.06, covered=True, calibration="cal-v2")

def pair(a, b):
    for m in (a, b):
        if (m["module"], m["layout"], m["frame"]) != ("R4-M8", 6, "site-grid-m"):
            return "abstain:identity"
        if not m["covered"] or not m["media"]:
            return "abstain:coverage"
        if not isfinite(m["registration_m"]) or not 0 <= m["registration_m"] <= 0.1:
            return "abstain:registration"
    if (not all(isfinite(m["captured_s"]) for m in (a, b))
            or abs(a["captured_s"] - b["captured_s"]) > 5):
        return "abstain:time-pair"
    if b["modality"] != "radiometric" or not b.get("calibration"):
        return "appearance-only"
    return "paired-for-human-review"

assert pair(rgb, rgb) == "appearance-only"
assert pair(rgb, thermal) == "paired-for-human-review"
assert pair(rgb, dict(thermal, module="R4-M9")) == "abstain:identity"
assert pair(rgb, dict(thermal, captured_s=109)) == "abstain:time-pair"
assert pair(rgb, dict(thermal, covered=False)) == "abstain:coverage"
for invalid in (float("nan"), float("inf"), float("-inf")):
    assert pair(dict(rgb, captured_s=invalid), thermal) == "abstain:time-pair"
    assert pair(rgb, dict(thermal, captured_s=invalid)) == "abstain:time-pair"
    assert pair(dict(rgb, captured_s=invalid), dict(thermal, captured_s=invalid)) == "abstain:time-pair"
assert pair(rgb, dict(thermal, captured_s=105)) == "paired-for-human-review"
assert pair(rgb, dict(thermal, captured_s=95)) == "paired-for-human-review"
print("solar pairing harness: synthetic assertions passed")

The first assertion prevents an RGB record from masquerading as a thermal measurement. Both capture timestamps must be finite before the pairing window is evaluated; NaN or infinity means unknown timing. The accepted pair merely permits a reviewer to inspect both sources together. It neither validates the truth of the declared calibration record nor establishes a hotspot. Production code must resolve calibration references from a trusted registry and verify the underlying measurement file, not trust arbitrary uploader strings.

Keep Coverage and Uncertainty Visible

Define coverage against the planned module inventory for the current layout revision. Report which modules have usable RGB observations, which have valid thermal pairs, and which are obscured or missing. Ten overlapping frames of the same module do not compensate for an unobserved row. Coverage should also record whether relevant portions of the module are hidden by glare or occlusion.

Registration uncertainty belongs beside the candidate footprint. If its location uncertainty crosses a module boundary, abstain from assigning a unique module and request human resolution. NIST’s guidance on combined uncertainty includes covariance and recognized systematic effects. A shared mosaic offset is not reduced by averaging many candidate locations from that same mosaic.

A deterministic pairing service is usually enough; adding agents to debate identical images increases cost without creating another sensor. Use a specialist measurement component only where it supplies a validated capability. The blade mapping exercise shows a related registration problem on a moving, curved asset rather than a fixed module grid.

Gate the Maintenance Handoff

Authorize farm and tenant access server-side. Flight filenames, visible labels, and embedded comments are untrusted evidence, never instructions to create urgent shutdown tasks. Keep originals immutable, retain access logs without unnecessary location detail, and restrict raw imagery downloads. Authentication, persistent approvals, transactions, calibration verification, and maintenance-provider behavior are omitted from the toy code.

A reviewer can approve a request for closer examination with both sensor references attached. Deduplicate that request by flight, module, observation, and policy revision. If creation times out, reconcile the work-order identifier before retrying. The workflow must not infer electrical intervention authority from a successful image upload. Utility response workflows cover the separate operational coordination boundary.

Acceptance Tests and Evaluation

  • Submit only RGB evidence; allow an appearance note but prohibit any temperature field derived from its colors.
  • Shift the mosaic by one module width; require registration review before exporting module-specific tickets.
  • Pair captures outside the allowed time window or with either timestamp nonfinite; preserve both sources while withholding the combined interpretation.
  • Omit a row from the flight; calculate missing coverage from the inventory rather than the uploaded image count.
  • Reuse a superseded layout revision; reject its module associations until explicitly migrated and reviewed.
  • Retry an approved ticket after a lost response; reconcile exactly one maintenance record.

Use a baseline of candidate captions without pairing gates. Measure wrong-module assignments divided by all adjudicated assignments, valid thermal pairs divided by all requested pairs, and unobserved modules divided by the planned inventory. Keep appearance-only cases in the denominator. Split evaluation by flight and site, since adjacent frames and shared registration errors are correlated.

Start with one block in shadow mode and require human review of every pairing. Record review time and recapture requests alongside association errors; these are proposed measurements, not achieved results. AI systems engineering should first make module identity and modality explicit. A modest packet that refuses invented heat is more useful than a colorful map of unsupported diagnoses.

Sources