import sys
import time
from urllib.parse import urlsplit
import numpy as np
from PIL import Image
from reachy_mini import ReachyMini
def main() -> int:
if len(sys.argv) != 3:
print("usage: body_frame.py <out.png> <daemon-url>", file=sys.stderr)
return 64
out = sys.argv[1]
daemon = urlsplit(sys.argv[2])
if (
daemon.scheme != "http"
or daemon.hostname is None
or daemon.username is not None
or daemon.password is not None
or daemon.path not in ("", "/")
or daemon.query
or daemon.fragment
):
print("daemon URL must be an HTTP origin without credentials or a path", file=sys.stderr)
return 64
try:
port = daemon.port or 80
except ValueError as error:
print(f"invalid daemon port: {error}", file=sys.stderr)
return 64
host = daemon.hostname
connection_mode = (
"localhost_only"
if host.lower() in ("localhost", "127.0.0.1", "::1")
else "network"
)
with ReachyMini(
host=host,
port=port,
connection_mode=connection_mode,
spawn_daemon=False,
) as mini:
frame = None
deadline = time.monotonic() + 5.0
while time.monotonic() < deadline:
frame = mini.media.get_frame()
if frame is not None:
break
time.sleep(0.1)
if frame is None:
print("no frame available from daemon", file=sys.stderr)
return 2
rgb = np.ascontiguousarray(frame[:, :, ::-1])
Image.fromarray(rgb).save(out)
h, w = frame.shape[:2]
print(f"{w}x{h}")
return 0
if __name__ == "__main__":
sys.exit(main())