mirror of
https://github.com/legop3/MultiRoombaRover.git
synced 2026-09-16 01:21:20 -04:00
ugh
This commit is contained in:
@@ -56,7 +56,7 @@ cd ~/MultiRoombaRover
|
|||||||
sudo ./pi/install_roverd.sh
|
sudo ./pi/install_roverd.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
Then point each rover's `/etc/roverd.yaml` at `ws://<server>:8080/rover`, set `name` to the rover’s ID, and (optionally) override `media.publishUrl` if your control server isn’t `192.168.0.86`. The new WHIP publisher service (`whip-publisher.service`) uses GStreamer (`gst-launch-1.0 libcamerasrc ! ... ! whipclientsink`) to encode the Pi camera to H264 and publish straight into the server’s mediaMTX instance at `http://<server>:8889/whip/<name>`. Install `libcamera-apps` plus `gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libcamera` on each Pi so the pipeline is available. Use the “Restart Camera” button if you enable media management so roverd can bounce the publisher service remotely.
|
Then point each rover's `/etc/roverd.yaml` at `ws://<server>:8080/rover`, set `name` to the rover’s ID, and (optionally) override `media.publishUrl` if your control server isn’t `192.168.0.86`. The WHIP publisher service (`whip-publisher.service`) captures the Pi camera with `rpicam-vid`/`libcamera-vid`, pipes the raw H264 into the bundled `ffmpeg-whip`, and publishes straight into the server’s mediaMTX instance at `http://<server>:8889/whip/<name>`. Install `libcamera-apps` on each Pi; the installer will download the patched ffmpeg build automatically. Use the “Restart Camera” button if you enable media management so roverd can bounce the publisher service remotely.
|
||||||
Heads-up: the BRC pulser now uses libgpiod; make sure the `roverd` service account is in the `gpio` group (or otherwise allowed to access `/dev/gpiochip*`) and set `brc.gpioChip` if your hardware exposes a different chip name.
|
Heads-up: the BRC pulser now uses libgpiod; make sure the `roverd` service account is in the `gpio` group (or otherwise allowed to access `/dev/gpiochip*`) and set `brc.gpioChip` if your hardware exposes a different chip name.
|
||||||
|
|
||||||
## Fedora server deployment
|
## Fedora server deployment
|
||||||
|
|||||||
+8
-10
@@ -32,14 +32,11 @@ Run the resulting `dist/roverd-dummy` on any machine; it will connect to the ser
|
|||||||
|
|
||||||
## Automated installation (recommended)
|
## Automated installation (recommended)
|
||||||
|
|
||||||
Make sure the Pi has GStreamer 1.22+ plus the libcamera + bad plugin sets (Bookworm ships them):
|
Install the Raspberry Pi camera helpers (Bookworm ships them):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
sudo apt update
|
sudo apt update
|
||||||
sudo apt install libcamera-apps \
|
sudo apt install libcamera-apps
|
||||||
gstreamer1.0-tools gstreamer1.0-plugins-good \
|
|
||||||
gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly \
|
|
||||||
gstreamer1.0-libcamera
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Once the binary (and repo) are on the Pi, run the helper script from the repo root:
|
Once the binary (and repo) are on the Pi, run the helper script from the repo root:
|
||||||
@@ -92,13 +89,14 @@ If you set `media.manage: true` in `/etc/roverd.yaml`, make sure the `roverd` se
|
|||||||
The `whip-publisher.service` unit runs `/usr/local/bin/whip-publisher`, a small shell wrapper that launches:
|
The `whip-publisher.service` unit runs `/usr/local/bin/whip-publisher`, a small shell wrapper that launches:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
gst-launch-1.0 libcamerasrc ! video/x-raw,width=WIDTH,height=HEIGHT,framerate=FPS/1 \
|
rpicam-vid (or libcamera-vid) --inline --timeout 0 --width=WIDTH --height=HEIGHT \
|
||||||
! videoconvert ! x264enc tune=zerolatency bitrate=BITRATE_KB key-int-max=FPS \
|
--framerate=FPS --bitrate=BITRATE --codec h264 --profile baseline --output - \
|
||||||
! h264parse config-interval=1 ! whipclientsink signaller::whip-endpoint=$WHIP_URL
|
| ffmpeg-whip -hide_banner -loglevel warning -fflags nobuffer \
|
||||||
|
-f h264 -i pipe:0 -c:v copy -an -f whip $WHIP_URL
|
||||||
```
|
```
|
||||||
|
|
||||||
roverd writes `/var/lib/roverd/whip.env` on startup (and whenever you restart the service) so the publisher inherits the correct `WHIP_URL`, resolution, FPS, and bitrate. Tweak those knobs under `media.videoWidth`, `media.videoHeight`, `media.videoFps`, and `media.videoBitrate` in `/etc/roverd.yaml` if you need different camera settings.
|
The installer downloads `ffmpeg-whip` (a WHIP-enabled FFmpeg build) and drops it at `/usr/local/bin/ffmpeg-whip`, along with its private libraries under `/usr/local/lib/ffmpeg-whip`. roverd writes `/var/lib/roverd/whip.env` on startup (and whenever you restart the service) so the publisher inherits the correct `WHIP_URL`, resolution, FPS, and bitrate. Tweak those knobs under `media.videoWidth`, `media.videoHeight`, `media.videoFps`, and `media.videoBitrate` in `/etc/roverd.yaml` if you need different camera settings.
|
||||||
Use `sudo systemctl status whip-publisher` to watch the pipeline logs; the unit auto-restarts whenever the network drops or GStreamer exits.
|
Use `sudo systemctl status whip-publisher` to watch the pipeline logs; the unit auto-restarts whenever the network drops or FFmpeg exits.
|
||||||
|
|
||||||
## Server + UI
|
## Server + UI
|
||||||
|
|
||||||
|
|||||||
+39
-19
@@ -18,31 +18,51 @@ VIDEO_HEIGHT="${VIDEO_HEIGHT:-720}"
|
|||||||
VIDEO_FPS="${VIDEO_FPS:-30}"
|
VIDEO_FPS="${VIDEO_FPS:-30}"
|
||||||
VIDEO_BITRATE="${VIDEO_BITRATE:-3000000}"
|
VIDEO_BITRATE="${VIDEO_BITRATE:-3000000}"
|
||||||
|
|
||||||
GST_BIN="${GST_BIN:-/usr/bin/gst-launch-1.0}"
|
if [[ -n "${LIBCAMERA_BIN:-}" ]]; then
|
||||||
|
LIBCAMERA_BIN_PATH="$LIBCAMERA_BIN"
|
||||||
if [[ ! -x "$GST_BIN" ]]; then
|
elif command -v rpicam-vid >/dev/null 2>&1; then
|
||||||
if command -v gst-launch-1.0 >/dev/null 2>&1; then
|
LIBCAMERA_BIN_PATH="$(command -v rpicam-vid)"
|
||||||
GST_BIN="$(command -v gst-launch-1.0)"
|
elif command -v libcamera-vid >/dev/null 2>&1; then
|
||||||
|
LIBCAMERA_BIN_PATH="$(command -v libcamera-vid)"
|
||||||
else
|
else
|
||||||
echo "gst-launch-1.0 not found; install gstreamer1.0-tools and plugins." >&2
|
echo "Neither rpicam-vid nor libcamera-vid found; install libcamera-apps." >&2
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${FFMPEG_BIN:-}" ]]; then
|
||||||
|
FFMPEG_BIN_PATH="$FFMPEG_BIN"
|
||||||
|
elif command -v ffmpeg-whip >/dev/null 2>&1; then
|
||||||
|
FFMPEG_BIN_PATH="$(command -v ffmpeg-whip)"
|
||||||
|
elif command -v ffmpeg >/dev/null 2>&1; then
|
||||||
|
FFMPEG_BIN_PATH="$(command -v ffmpeg)"
|
||||||
|
else
|
||||||
|
echo "ffmpeg not found; install it or run the installer to fetch ffmpeg-whip." >&2
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
run_pipeline() {
|
run_pipeline() {
|
||||||
local bitrate_kbps=$((VIDEO_BITRATE / 1000))
|
"${LIBCAMERA_BIN_PATH}" \
|
||||||
if [[ "$bitrate_kbps" -le 0 ]]; then
|
--inline \
|
||||||
bitrate_kbps=3000
|
--timeout 0 \
|
||||||
fi
|
--width "${VIDEO_WIDTH}" \
|
||||||
"${GST_BIN}" -e \
|
--height "${VIDEO_HEIGHT}" \
|
||||||
libcamerasrc \
|
--framerate "${VIDEO_FPS}" \
|
||||||
! "video/x-raw,width=${VIDEO_WIDTH},height=${VIDEO_HEIGHT},framerate=${VIDEO_FPS}/1" \
|
--bitrate "${VIDEO_BITRATE}" \
|
||||||
! queue \
|
--codec h264 \
|
||||||
! videoconvert \
|
--profile baseline \
|
||||||
! x264enc speed-preset=ultrafast tune=zerolatency bitrate="${bitrate_kbps}" key-int-max="${VIDEO_FPS}" byte-stream=true \
|
--denoise cdn_off \
|
||||||
! "video/x-h264,profile=baseline" \
|
--nopreview \
|
||||||
! h264parse config-interval=1 \
|
--output - \
|
||||||
! whipclientsink signaller::whip-endpoint="${WHIP_URL}"
|
| "${FFMPEG_BIN_PATH}" \
|
||||||
|
-hide_banner \
|
||||||
|
-loglevel warning \
|
||||||
|
-fflags nobuffer \
|
||||||
|
-f h264 \
|
||||||
|
-i pipe:0 \
|
||||||
|
-c:v copy \
|
||||||
|
-an \
|
||||||
|
-f whip \
|
||||||
|
"${WHIP_URL}"
|
||||||
}
|
}
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
|
|||||||
+46
-15
@@ -6,6 +6,10 @@ set -euo pipefail
|
|||||||
|
|
||||||
BINARY_SRC="dist/roverd"
|
BINARY_SRC="dist/roverd"
|
||||||
CONFIG_SRC="pi/roverd/roverd.sample.yaml"
|
CONFIG_SRC="pi/roverd/roverd.sample.yaml"
|
||||||
|
FFMPEG_WHIP_VERSION="0.0.0"
|
||||||
|
FFMPEG_WHIP_BASE_URL="https://github.com/steel-dev/ffmpeg-whip/releases/download/v${FFMPEG_WHIP_VERSION}"
|
||||||
|
FFMPEG_WHIP_DIR="/usr/local/lib/ffmpeg-whip"
|
||||||
|
FFMPEG_WHIP_BIN="/usr/local/bin/ffmpeg-whip"
|
||||||
|
|
||||||
usage() {
|
usage() {
|
||||||
cat <<'USAGE'
|
cat <<'USAGE'
|
||||||
@@ -62,6 +66,11 @@ if [[ ! -f "$CONFIG_SRC" ]]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if ! command -v curl >/dev/null 2>&1; then
|
||||||
|
echo "curl is required by this installer" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
ensure_user() {
|
ensure_user() {
|
||||||
local user="$1"
|
local user="$1"
|
||||||
local groups="${2:-}"
|
local groups="${2:-}"
|
||||||
@@ -80,23 +89,43 @@ log() {
|
|||||||
echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] $*"
|
echo "[$(date -u +%Y-%m-%dT%H:%M:%SZ)] $*"
|
||||||
}
|
}
|
||||||
|
|
||||||
if ! command -v gst-launch-1.0 >/dev/null 2>&1; then
|
if ! command -v rpicam-vid >/dev/null 2>&1 && ! command -v libcamera-vid >/dev/null 2>&1; then
|
||||||
log "WARNING: gst-launch-1.0 not found; install GStreamer (sudo apt install gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-libcamera)."
|
log "WARNING: neither rpicam-vid nor libcamera-vid found in PATH; install libcamera-apps."
|
||||||
else
|
|
||||||
if command -v gst-inspect-1.0 >/dev/null 2>&1; then
|
|
||||||
if ! gst-inspect-1.0 whipclientsink >/dev/null 2>&1; then
|
|
||||||
log "WARNING: whipclientsink element missing; install gstreamer1.0-plugins-bad (1.22+)."
|
|
||||||
fi
|
|
||||||
if ! gst-inspect-1.0 libcamerasrc >/dev/null 2>&1; then
|
|
||||||
log "WARNING: libcamerasrc plugin missing; install gstreamer1.0-libcamera."
|
|
||||||
fi
|
|
||||||
if ! gst-inspect-1.0 x264enc >/dev/null 2>&1; then
|
|
||||||
log "WARNING: x264enc element missing; install gstreamer1.0-plugins-ugly."
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
log "WARNING: gst-inspect-1.0 not found; unable to verify GStreamer plugins."
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
install_ffmpeg_whip() {
|
||||||
|
local arch asset tmp
|
||||||
|
arch="$(uname -m)"
|
||||||
|
case "$arch" in
|
||||||
|
aarch64)
|
||||||
|
asset="ffmpeg-whip-linux-arm64.tar.gz"
|
||||||
|
;;
|
||||||
|
x86_64|amd64)
|
||||||
|
asset="ffmpeg-whip-linux-amd64.tar.gz"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
log "WARNING: ffmpeg-whip binary not available for architecture ${arch}; ensure a WHIP-capable ffmpeg is installed manually."
|
||||||
|
return
|
||||||
|
esac
|
||||||
|
tmp="$(mktemp -d)"
|
||||||
|
log "Downloading ffmpeg-whip ${FFMPEG_WHIP_VERSION} (${asset})"
|
||||||
|
if ! curl -fsSL "${FFMPEG_WHIP_BASE_URL}/${asset}" -o "${tmp}/${asset}"; then
|
||||||
|
rm -rf "$tmp"
|
||||||
|
echo "Failed to download ffmpeg-whip from ${FFMPEG_WHIP_BASE_URL}/${asset}" >&2
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
rm -rf "${FFMPEG_WHIP_DIR}"
|
||||||
|
install -d "${FFMPEG_WHIP_DIR}"
|
||||||
|
tar -xzf "${tmp}/${asset}" -C "${FFMPEG_WHIP_DIR}" --strip-components=1
|
||||||
|
rm -rf "$tmp"
|
||||||
|
cat > "${FFMPEG_WHIP_BIN}" <<'EOF'
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
export LD_LIBRARY_PATH=/usr/local/lib/ffmpeg-whip/lib:${LD_LIBRARY_PATH}
|
||||||
|
exec /usr/local/lib/ffmpeg-whip/bin/ffmpeg "$@"
|
||||||
|
EOF
|
||||||
|
chmod 0755 "${FFMPEG_WHIP_BIN}"
|
||||||
|
log "Installed ${FFMPEG_WHIP_BIN}"
|
||||||
|
}
|
||||||
|
|
||||||
ensure_user roverd "dialout,gpio,video,render"
|
ensure_user roverd "dialout,gpio,video,render"
|
||||||
install -o roverd -g roverd -m 0755 "$BINARY_SRC" /usr/local/bin/roverd
|
install -o roverd -g roverd -m 0755 "$BINARY_SRC" /usr/local/bin/roverd
|
||||||
@@ -115,6 +144,8 @@ fi
|
|||||||
install -m 0644 pi/systemd/roverd.service /etc/systemd/system/roverd.service
|
install -m 0644 pi/systemd/roverd.service /etc/systemd/system/roverd.service
|
||||||
log "Installed roverd systemd unit"
|
log "Installed roverd systemd unit"
|
||||||
|
|
||||||
|
install_ffmpeg_whip
|
||||||
|
|
||||||
# Install WHIP publisher assets
|
# Install WHIP publisher assets
|
||||||
install -D -o root -g root -m 0755 pi/bin/whip-publisher.sh /usr/local/bin/whip-publisher
|
install -D -o root -g root -m 0755 pi/bin/whip-publisher.sh /usr/local/bin/whip-publisher
|
||||||
install -m 0644 pi/systemd/whip-publisher.service /etc/systemd/system/whip-publisher.service
|
install -m 0644 pi/systemd/whip-publisher.service /etc/systemd/system/whip-publisher.service
|
||||||
|
|||||||
Reference in New Issue
Block a user