====== FPV Camera ====== The FPV Camera serves a video stream as the first person view (FPV) of the Robot. This makes it possible to see the position of the Robot and anything in its way. ===== Hardware ===== A 3d Printed mount for the Bosch40x40 profile was made to stick a polie on it so that the camera gets a better view. The camera is set in a case which was designed with a litte roof to prevent raindrops on the lense. {{:projects:farmrobot:img_2648.jpg?400|}} [picture of 40x40 clip with pole and camera case(n/a)] The following hardware is used for capturing and broadcasting the video stream: * Raspberry Pi 4B (8GB) by element14 * element14 Raspberry Pi CSI camera v.2 NoIR * USB-C cable * Heatsinks * Fan * Case * SD-Card ===== Software ===== The SD-Card has been flashed with an Ubuntu 20.10 arm64-raspi OS. The Pi is configured with the following user: * user name: pi * password: farmrobot Its connectable via ethernet or build in wifi module. An initial update has been run: ''sudo apt update && sudo apt upgrade'' Also some config changes have been made: ''sudo nano /boot/firmware/config.txt [gpu_mem=512 ; start_x=1]'' ==== Setup ==== sudo apt install v4l-utils sudo apt install ffmpeg sudo apt install openssh-server sudo ufw allow ssh ssh pi@farmrobot === ffmpeg stream === Bash script ''stream.sh'': ffmpeg -f v4l2 -input_format h264 -video_size 852x480 -framerate 5 -i /dev/video0> -c:v h264 -preset veryfast -b:v 500k -maxrate 500k -bufsize 10k \ -pix_fmt yuv420p -g 10 \ -f flv "rtmp://ingest_server/streamkey" ==== Optional v4l2m2m encoder on arm 64 bit OS ==== Using v4l2m2m encoder to have arm64 hardware support to efficiently encode a efficient h.265 stream which is sent via rtmp to a server which reencodes to hls to view video stream in a browser. Building ffmpeg from source for the newest release and support for v4l_m2m hardware encoding on 64 bit arm. ''cd/home/pi/ mkdir -p ~/ffmpeg_sources ~/ffmpeg_build ~/bin'' (installing to /home/pi/bin/ to avoid conflicts with the system package folder) According to [[https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu]] a lot of dependancies have to be installed beforehand: sudo apt-get update -qq && sudo apt-get -y install \ autoconf \ automake \ build-essential \ cmake \ git-core \ libass-dev \ libfreetype6-dev \ libgnutls28-dev \ libsdl2-dev \ libtool \ libva-dev \ libvdpau-dev \ libvorbis-dev \ libxcb1-dev \ libxcb-shm0-dev \ libxcb-xfixes0-dev \ meson \ ninja-build \ pkg-config \ texinfo \ wget \ yasm \ zlib1g-dev \ libunistring-dev installing libaries, chosing wich are needed: NASM (An assembler used by some libraries.) cd ~/ffmpeg_sources && wget https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.bz2 && tar xjvf nasm-2.15.05.tar.bz2 && cd nasm-2.15.05 && ./autogen.sh && PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" && make -j 4 && make install libx264 (H.264 video encoder, fallback) cd ~/ffmpeg_sources && git -C x264 pull 2> /dev/null || git clone --depth 1 https://code.videolan.org/videolan/x264.git && cd x264 && PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --bindir="$HOME/bin" --enable-static --enable-pic && PATH="$HOME/bin:$PATH" make -j 4 && make install libx265 (H.265/HEVC video encoder) sudo apt-get install libnuma-dev && cd ~/ffmpeg_sources && git -C x265_git pull 2> /dev/null || git clone https://bitbucket.org/multicoreware/x265_git && cd x265_git/build/linux && PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED=off ../../source && PATH="$HOME/bin:$PATH" make -j 4 && make install libvpx (VP8/VP9 video encoder/decoder, another efficient video encoder, needs testing) cd ~/ffmpeg_sources && git -C libvpx pull 2> /dev/null || git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git && cd libvpx && PATH="$HOME/bin:$PATH" ./configure --prefix="$HOME/ffmpeg_build" --disable-examples --disable-unit-tests --enable-vp9-highbitdepth --as=yasm && PATH="$HOME/bin:$PATH" make -j 4 && make install libaom (AV1 video encoder/decoder) cd ~/ffmpeg_sources && git -C aom pull 2> /dev/null || git clone --depth 1 https://aomedia.googlesource.com/aom && mkdir -p aom_build && cd aom_build && PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DENABLE_SHARED=off -DENABLE_NASM=on ../aom && PATH="$HOME/bin:$PATH" make -j 4 && make install libsvtav (AV1 video encoder/decoder) cd ~/ffmpeg_sources && git -C SVT-AV1 pull 2> /dev/null || git clone https://gitlab.com/AOMediaCodec/SVT-AV1.git && mkdir -p SVT-AV1/build && cd SVT-AV1/build && PATH="$HOME/bin:$PATH" cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="$HOME/ffmpeg_build" -DCMAKE_BUILD_TYPE=Release -DBUILD_DEC=OFF -DBUILD_SHARED_LIBS=OFF .. && PATH="$HOME/bin:$PATH" make -j 4 && make install libdav1d (AV1 decoder, much faster than the one provided by libaom Users whose distributions don't provide a recent enough version of meson (0.49.0 or newer) will need to install a more up-to-date version. This is easily done via the Python Package Index: ''sudo apt-get install python3-pip && pip3 install --user meson'' cd ~/ffmpeg_sources && git -C dav1d pull 2> /dev/null || git clone --depth 1 https://code.videolan.org/videolan/dav1d.git && mkdir -p dav1d/build && cd dav1d/build && meson setup -Denable_tools=false -Denable_tests=false --default-library=static .. --prefix "$HOME/ffmpeg_build" --bindir="$HOME/bin" --libdir="$HOME/ffmpeg_build/lib" && ninja && ninja install Audio libaries are probably needed for building, especially libfdk_aac for vpx libfdk-aac (AAC audio encoder) cd ~/ffmpeg_sources && git -C fdk-aac pull 2> /dev/null || git clone --depth 1 https://github.com/mstorsjo/fdk-aac && cd fdk-aac && autoreconf -fiv && ./configure --prefix="$HOME/ffmpeg_build" --disable-shared && make -j 4 && make install libmp3lame libopus Building FFmpeg cd ~/ffmpeg_sources && wget -O ffmpeg-snapshot.tar.bz2 https://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 && tar xjvf ffmpeg-snapshot.tar.bz2 && cd ffmpeg && PATH="$HOME/bin:$PATH" PKG_CONFIG_PATH="$HOME/ffmpeg_build/lib/pkgconfig" ./configure --prefix="$HOME/ffmpeg_build" --pkg-config-flags="--static" --extra-cflags="-I$HOME/ffmpeg_build/include" --extra-ldflags="-L$HOME/ffmpeg_build/lib" --extra-libs="-lpthread -lm" --bindir="$HOME/bin" --enable-gpl --arch=aarch64 --enable-gnutls --enable-libaom --enable-libsvtav1 --enable-libdav1d --enable-libvpx --enable-libx264 --enable-libx265 --enable-nonfree && PATH="$HOME/bin:$PATH" make -j 4 && make install && hash -r source ~/.profile ===== Authors ===== * Jonas Geßmann, Environment & Energy, jonas.gessmann@protonmail.com \\ * Nicolas Wiehe