Files
hermes-bot/pi/robot.service
T
kyleandClaude Sonnet 5.5 d8db0a48f5 Run the whole robot from one launch file and one boot-time unit
hermes_bringup starts the face, camera, face detector and audio levels from one
launch file with their parameters in robot.yaml, each node its own respawned
process, the face first and the others after start_delay. robot.service runs it
at boot, so everything is ROS and the face is up whenever the robot is powered.
Reboot-tested: all services and nodes return by themselves, the face draws at
about 28 s on the boot clock, the mic gain survives, nothing throttles.

Cut the CPU: the camera runs at 15 fps (20% of a core, vs 40% at 30), and the
detector went from 131% to 40% by pinning OpenCV to one thread (its DNN burns 3-4x
its elapsed time across cores), decoding the JPEG at half size, and re-identifying
a tracked face at most once a second. The audio scope is published only while
someone is speaking or listening.

A standalone face unit that skipped `ros2 launch` saved only 3.7 s and was dropped:
the owner prefers everything in ROS and is fine with up to a minute. trim-boot.sh
disables the unused snapd and ModemManager.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AFN8nRRCiDiMN7ChBpHJhs
2026-10-05 00:10:09 -07:00

21 lines
763 B
Desktop File

[Unit]
Description=Robot (hermes_bringup): face, camera, face detection, audio levels
# Nothing here needs the user session: audio_state retries until the user's PipeWire is up.
After=local-fs.target robot-cpu-performance.service robot-firewall.service
[Service]
User=hermes
# lgpio (the display's GPIO backend) drops a notification pipe in its working directory, which must
# be writable: systemd's default, /, is not.
RuntimeDirectory=robot
WorkingDirectory=/run/robot
# audio_state reaches the user's PipeWire through this
Environment=XDG_RUNTIME_DIR=/run/user/1000
ExecStart=/bin/bash -c 'source /home/hermes/robot-env.sh && exec ros2 launch hermes_bringup robot.launch.py'
Restart=always
RestartSec=3
TimeoutStopSec=20
[Install]
WantedBy=multi-user.target