Initial commit. Working.

This commit is contained in:
James Bateman (hp-laptop)
2026-09-29 10:08:05 +01:00
commit 8e9d1e294c
10 changed files with 585 additions and 0 deletions
Executable
+138
View File
@@ -0,0 +1,138 @@
#!/usr/bin/env bash
#
# install.sh — get a legacy Point Grey / FLIR USB2 camera running on
# Ubuntu 24.04 / Linux Mint 22 using the FlyCapture2 SDK (v2.13.3.31).
#
# These cameras (USB vendor 1e10) predate the Spinnaker SDK and are only
# supported by FlyCapture2. On a modern release we install just the core
# runtime + development libraries, whose only real dependencies are
# libusb and libraw1394. We deliberately skip the GUI packages (FlyCap2,
# UpdatorGUI): they need GTK2-era libraries (libgtkmm-2.4, libglademm-2.4,
# libgtkglextmm) that no longer exist in Ubuntu 24.04. Instead we install
# the prebuilt command-line tool FlyCapture2Test, which links only the
# core library, plus the example source tree for building your own apps.
#
# Run: sudo ./install.sh
# Undo: sudo ./uninstall.sh
#
set -euo pipefail
GROUP="flirimaging"
USBFS_MB=1000
UDEV_RULES="/etc/udev/rules.d/40-flir.rules"
GRUB_FILE="/etc/default/grub"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SDK_DIR="${SDK_DIR:-$SCRIPT_DIR/sdk}"
# The user who should own the camera (the human running sudo, not root).
TARGET_USER="${SUDO_USER:-${USER:-}}"
log() { printf '\n\033[1;32m==>\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[warn]\033[0m %s\n' "$*" >&2; }
die() { printf '\033[1;31m[error]\033[0m %s\n' "$*" >&2; exit 1; }
[ "$(id -u)" -eq 0 ] || die "Run as root: sudo ./install.sh"
[ -n "$TARGET_USER" ] && [ "$TARGET_USER" != "root" ] || \
die "Could not determine the target user. Run with sudo from your normal account."
[ -d "$SDK_DIR" ] || die "SDK directory not found: $SDK_DIR"
# ---------------------------------------------------------------------------
log "1/7 Installing dependencies (libusb, libraw1394, build tools, OpenCV)"
apt-get update -qq
# libusb/libraw1394: core SDK. g++/libopencv-dev: to build the fc2view viewer.
apt-get install -y libusb-1.0-0 libraw1394-11 g++ libopencv-dev
# ---------------------------------------------------------------------------
log "2/7 Installing FlyCapture2 core libraries"
# Order matters: runtime before its -dev, C API after the C++ core.
dpkg -i "$SDK_DIR"/libflycapture-2.13.3.31_amd64.deb \
"$SDK_DIR"/libflycapture-2.13.3.31_amd64-dev.deb \
"$SDK_DIR"/libflycapture-c-2.13.3.31_amd64.deb \
"$SDK_DIR"/libflycapture-c-2.13.3.31_amd64-dev.deb
ldconfig
# ---------------------------------------------------------------------------
log "3/7 Installing the FlyCapture2Test command-line tool + example source"
# The prebuilt CLI binaries and the C/C++ example source live inside the
# flycap package, but that package's *dependencies* pull in dead GTK2 libs.
# So we extract the useful files without installing (dpkg) the package.
TMP_EXTRACT="$(mktemp -d)"
trap 'rm -rf "$TMP_EXTRACT"' EXIT
dpkg-deb -x "$SDK_DIR"/flycap-2.13.3.31_amd64.deb "$TMP_EXTRACT"
install -m 0755 "$TMP_EXTRACT/usr/bin/FlyCapture2Test" /usr/local/bin/FlyCapture2Test
install -m 0755 "$TMP_EXTRACT/usr/bin/FlyCapture2Test_C" /usr/local/bin/FlyCapture2Test_C
# Example source tree (build your own apps against the SDK).
rm -rf /usr/src/flycapture
cp -a "$TMP_EXTRACT/usr/src/flycapture" /usr/src/flycapture
# ---------------------------------------------------------------------------
log "4/7 Building the fc2view live viewer"
# Native OpenCV-based replacement for the vendor GUI (which needs dead GTK2
# libs). Best-effort: a failure here does not abort the core install.
if g++ "$SCRIPT_DIR/fc2view.cpp" \
-I/usr/include/flycapture $(pkg-config --cflags opencv4) \
$(pkg-config --libs opencv4) -lflycapture \
-o /usr/local/bin/fc2view; then
echo "Installed /usr/local/bin/fc2view"
else
warn "fc2view build failed; the CLI tools still work. Build it by hand later:"
warn " g++ fc2view.cpp -I/usr/include/flycapture \$(pkg-config --cflags --libs opencv4) -lflycapture -o fc2view"
fi
# ---------------------------------------------------------------------------
log "5/7 Configuring device permissions (udev rule + '$GROUP' group)"
groupadd -f "$GROUP"
usermod -aG "$GROUP" "$TARGET_USER"
# Point Grey / FLIR USB product IDs are 0x2000-0x2005 and 0x3xxx. Grant the
# group read/write on matching USB nodes. (Trimmed from FLIR's flycap2-conf;
# we drop the blanket "all USB devices" rule it shipped.)
{
for pid in 2000 2001 2002 2003 2004 2005 \
3000 3001 3004 3005 3006 3007 3008 300A 300B \
3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3300; do
echo "SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"1e10\", ATTRS{idProduct}==\"${pid}\", MODE=\"0664\", GROUP=\"${GROUP}\""
done
} > "$UDEV_RULES"
udevadm control --reload-rules
udevadm trigger
# ---------------------------------------------------------------------------
log "6/7 Raising the USBFS buffer limit to ${USBFS_MB} MB"
# Default is 16 MB, too small for camera frames -> grab failures / dropped
# images. Apply now for this boot, and persist via the kernel command line.
echo "$USBFS_MB" > /sys/module/usbcore/parameters/usbfs_memory_mb || \
warn "Could not set usbfs_memory_mb live; a reboot will apply the persistent setting."
if [ -f "$GRUB_FILE" ]; then
if grep -q "usbcore.usbfs_memory_mb" "$GRUB_FILE"; then
sed -i -E "s/usbcore\.usbfs_memory_mb=[0-9]+/usbcore.usbfs_memory_mb=${USBFS_MB}/" "$GRUB_FILE"
else
# Append inside the existing GRUB_CMDLINE_LINUX_DEFAULT="..." quotes.
sed -i -E "s/^(GRUB_CMDLINE_LINUX_DEFAULT=\")(.*)\"/\1\2 usbcore.usbfs_memory_mb=${USBFS_MB}\"/" "$GRUB_FILE"
fi
update-grub
else
warn "$GRUB_FILE not found; skipped persistent USBFS setting. Set usbcore.usbfs_memory_mb=${USBFS_MB} on your bootloader manually."
fi
# ---------------------------------------------------------------------------
log "7/7 Done"
cat <<EOF
FlyCapture2 core SDK installed.
Live viewer : fc2view (streams the camera; 's' saves a snapshot)
Test tool : FlyCapture2Test (lists cameras and grabs frames)
Headers : /usr/include/flycapture
Examples : /usr/src/flycapture/src
Two things need a fresh login/boot to take effect:
* group '$GROUP' membership for '$TARGET_USER' -> log out and back in
* the persistent USBFS limit -> applied live now, made
permanent on next reboot
Quick check (after re-login), with the camera plugged in:
FlyCapture2Test # confirms detection + grabs frames
fc2view # live window
EOF