Site Capture Workflow

Process drone photos and site photography into 3D environments.

Workflow Overview

Site Capture
Drone Photos
Ground Photos
360 Photos
RAPS Upload
Create Photoscene
Upload Images
RC Processing
Aerial Mode
Point Cloud Generation
Mesh Reconstruction
Outputs
Orthophoto
3D Mesh
Point Cloud
DSM/DTM

CLI Approach

Step 1: Create Aerial Photoscene

# Create site capture photoscene
SCENE=$(raps rc photoscene create \
  --name "Site Survey $(date +%Y-%m-%d)" \
  --type "aerial" \
  --output json)
SCENE_ID=$(echo "$SCENE" | jq -r '.id')
echo "Created photoscene: $SCENE_ID"

Step 2: Upload Drone Photos

# Batch upload drone photos
find ./drone-photos -name "*.jpg" | while read photo; do
  raps rc photoscene upload "$SCENE_ID" "$photo"
  echo "Uploaded: $(basename "$photo")"
done

# Or with parallel upload
find ./drone-photos -name "*.jpg" -print0 | \
  xargs -0 -P 4 -I {} raps rc photoscene upload "$SCENE_ID" {}

Step 3: Process with Aerial Settings

# Start processing with high quality
raps rc photoscene process "$SCENE_ID" --quality high

# For large sites, use draft first
# raps rc photoscene process "$SCENE_ID" --quality draft

Step 4: Monitor Progress

while true; do
  RESPONSE=$(raps rc photoscene status "$SCENE_ID" --output json)
  STATUS=$(echo "$RESPONSE" | jq -r '.status')
  PROGRESS=$(echo "$RESPONSE" | jq -r '.progress // 0')

  echo "Status: $STATUS - Progress: $PROGRESS%"

  [ "$STATUS" = "done" ] && break
  [ "$STATUS" = "failed" ] && { echo "Processing failed"; exit 1; }

  sleep 60
done

Step 5: Download All Outputs

mkdir -p ./site-output

# Download orthophoto
raps rc photoscene download "$SCENE_ID" --format ortho --output ./site-output/

# Download 3D mesh
raps rc photoscene download "$SCENE_ID" --format obj --output ./site-output/

# Download point cloud
raps rc photoscene download "$SCENE_ID" --format rcm --output ./site-output/

# List all available formats
raps rc photoscene download "$SCENE_ID" --list

CI/CD Pipeline

# .github/workflows/site-capture.yml
name: Site Capture Processing

on:
  workflow_dispatch:
    inputs:
      site_name:
        description: 'Site name for the survey'
        required: true
      photos_path:
        description: 'Path to drone photos'
        required: true
      quality:
        description: 'Processing quality'
        default: 'high'
        type: choice
        options:
          - draft
          - medium
          - high

jobs:
  process-site:
    runs-on: ubuntu-latest
    timeout-minutes: 180
    steps:
      - uses: actions/checkout@v4

      - name: Install RAPS
        run: cargo install raps

      - name: Create photoscene
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
        run: |
          SCENE=$(raps rc photoscene create \
            --name "${{ inputs.site_name }}" \
            --type "aerial" \
            --output json)
          SCENE_ID=$(echo "$SCENE" | jq -r '.id')
          echo "SCENE_ID=$SCENE_ID" >> $GITHUB_ENV

      - name: Upload photos
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
        run: |
          COUNT=0
          for photo in ${{ inputs.photos_path }}/*.{jpg,jpeg,JPG,JPEG}; do
            [ -f "$photo" ] || continue
            raps rc photoscene upload "$SCENE_ID" "$photo"
            COUNT=$((COUNT + 1))
            echo "Uploaded: $COUNT"
          done
          echo "Total photos: $COUNT"

      - name: Process photoscene
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
        run: |
          raps rc photoscene process "$SCENE_ID" --quality ${{ inputs.quality }}

      - name: Wait for completion
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
        run: |
          MAX_WAIT=10800  # 3 hours
          ELAPSED=0

          while [ $ELAPSED -lt $MAX_WAIT ]; do
            STATUS=$(raps rc photoscene status "$SCENE_ID" --output json | jq -r '.status')
            PROGRESS=$(raps rc photoscene status "$SCENE_ID" --output json | jq -r '.progress // 0')

            echo "Status: $STATUS ($PROGRESS%)"

            [ "$STATUS" = "done" ] && break
            [ "$STATUS" = "failed" ] && exit 1

            sleep 120
            ELAPSED=$((ELAPSED + 120))
          done

      - name: Download results
        env:
          APS_CLIENT_ID: ${{ secrets.APS_CLIENT_ID }}
          APS_CLIENT_SECRET: ${{ secrets.APS_CLIENT_SECRET }}
        run: |
          mkdir -p ./site-capture-output

          # Download all formats
          raps rc photoscene download "$SCENE_ID" --format ortho --output ./site-capture-output/
          raps rc photoscene download "$SCENE_ID" --format obj --output ./site-capture-output/
          raps rc photoscene download "$SCENE_ID" --format rcm --output ./site-capture-output/

      - name: Upload results
        uses: actions/upload-artifact@v4
        with:
          name: site-capture-${{ inputs.site_name }}
          path: ./site-capture-output/

Pipeline Flow

Manual Trigger
site_name + photos_path
Setup
Create Aerial Photoscene
Upload
Upload Drone Photos
Processing
Start RC Processing
Wait for Completion
Download
Orthophoto
3D Mesh
Point Cloud

MCP Integration

Process Site Survey

User: "Process the drone photos from today's site survey"
User
AI Assistant
RAPS MCP
Reality Capture
UserAIProcess drone photos
AIMCPaps_rc_photoscene_create(name, type=“aerial”)
MCPRCCreate photoscene
RCMCPScene ID
AIAIFind drone photos
loopAIMCPaps_rc_photoscene_upload(scene_id, photo)
loopMCPRCUpload
AIUser245 photos uploaded
AIMCPaps_rc_photoscene_process(scene_id, quality=“high”)
MCPRCStart processing
AIUserProcessing started (est. 45 min)

AI Response:

Processing site survey from drone photos:

Photoscene: Site Survey 2024-02-15 Photos: 245 uploaded Coverage area: ~2.5 acres Quality: High

Status: Processing Progress: 23% Estimated time: 35 minutes remaining

I’ll notify you when it’s complete.

Check Results

User: "Is the site capture done? What outputs do we have?"

AI Response:

Site Survey 2024-02-15 processing complete!

Generated Outputs:

OutputFormatSizeResolution
OrthophotoGeoTIFF156 MB2.5 cm/px
3D MeshOBJ89 MB1.2M polygons
Point CloudRCM234 MB4.5M points

Quality Metrics:

  • Photo alignment: 243/245 (99%)
  • Coverage: 100%
  • Reconstruction quality: Excellent

Ready to download. Where would you like to save the files?


Best Practices

Drone Flight Planning

For best results:
- 70-80% front overlap
- 60-70% side overlap
- Consistent altitude (100-400 ft typical)
- Include oblique shots around edges
- Fly on overcast days (consistent lighting)

Photo Requirements

# Minimum recommended:
# - 50+ photos for small sites
# - 100-300 for medium sites
# - 300+ for large sites

# Check photo count before processing
PHOTO_COUNT=$(find ./drone-photos -name "*.jpg" | wc -l)
echo "Photo count: $PHOTO_COUNT"

if [ "$PHOTO_COUNT" -lt 50 ]; then
  echo "Warning: Low photo count may affect quality"
fi

Quality vs Speed Trade-off

# Draft: Quick preview (10-15 min)
raps rc photoscene process "$SCENE_ID" --quality draft

# Medium: Balanced (30-45 min)
raps rc photoscene process "$SCENE_ID" --quality medium

# High: Best quality (60+ min)
raps rc photoscene process "$SCENE_ID" --quality high