基于SSH通过Windows PC控制Jetson AGX多摄像头同步采集的问题
解决Windows SSH连接Jetson AGX多摄像头采集的两个问题
1. 建立SSH连接后发送摄像头采集命令的方法
方法一:直接在SSH命令中嵌入采集指令
无需先打开终端再手动输入,直接通过SSH一次性执行目标命令,Python中可借助subprocess库实现:
import subprocess # 替换为你的Jetson用户名、IP地址,以及对应摄像头的采集命令 cmd = "ssh your-jetson-user@jetson-ip 'v4l2-ctl -d /dev/video0 --set-fmt-video=pixelformat=XR24 --stream-mmap --stream-count=1 --stream-to=img0.raw'" subprocess.run(cmd, shell=True)
该方式会在SSH连接建立后自动执行采集命令,完成后默认断开连接。
方法二:保持SSH连接并交互发送命令
若需要维持终端连接、动态发送命令,可使用pexpect库(需提前安装:pip install pexpect):
import pexpect # 启动SSH连接 ssh_process = pexpect.spawn('ssh your-jetson-user@jetson-ip') # 处理密码验证(若使用密钥登录可跳过此步骤) ssh_process.expect('password:') ssh_process.sendline('your-jetson-password') # 等待命令行提示符出现 ssh_process.expect('your-jetson-user@jetson-agx:~$') # 发送采集命令 ssh_process.sendline('v4l2-ctl -d /dev/video0 --set-fmt-video=pixelformat=XR24 --stream-mmap --stream-count=1 --stream-to=img0.raw') # 等待命令执行完成,再次出现提示符 ssh_process.expect('your-jetson-user@jetson-agx:~$') # 按需关闭连接 ssh_process.sendline('exit')
2. 先打开终端再分别发送命令实现同步采集
完全可以实现,核心是保证三个采集命令的触发时间差尽可能小,以下是两种可靠方案:
方案一:Python多线程同步触发
利用threading库同时启动三个线程,每个线程负责一个摄像头的SSH命令发送:
import subprocess import threading def capture_camera(cam_id): # 构造对应摄像头的采集命令 cmd = f"ssh your-jetson-user@jetson-ip 'v4l2-ctl -d /dev/video{cam_id} --set-fmt-video=pixelformat=XR24 --stream-mmap --stream-count=1 --stream-to=img{cam_id}.raw'" subprocess.run(cmd, shell=True) # 创建并启动三个线程,对应video0、video1、video2 threads = [] for cam in range(3): t = threading.Thread(target=capture_camera, args=(cam,)) threads.append(t) t.start() # 等待所有采集任务完成 for t in threads: t.join()
方案二:Jetson本地同步脚本触发
在Jetson上创建一个同步采集脚本sync_capture.sh:
#!/bin/bash # 同时启动三个采集命令,后台运行后等待全部完成 v4l2-ctl -d /dev/video0 --set-fmt-video=pixelformat=XR24 --stream-mmap --stream-count=1 --stream-to=img0.raw & v4l2-ctl -d /dev/video1 --set-fmt-video=pixelformat=XR24 --stream-mmap --stream-count=1 --stream-to=img1.raw & v4l2-ctl -d /dev/video2 --set-fmt-video=pixelformat=XR24 --stream-mmap --stream-count=1 --stream-to=img2.raw & wait
给脚本添加执行权限:chmod +x sync_capture.sh,之后在Windows端通过SSH执行该脚本即可:
import subprocess cmd = "ssh your-jetson-user@jetson-ip './sync_capture.sh'" subprocess.run(cmd, shell=True)
该方案同步精度更高,避免了SSH网络延迟带来的命令触发差异。
内容的提问来源于stack exchange,提问作者Aleks-CST
相关产品推荐
相关产品推荐

