Skip to content

双网卡主机使用PICO进行数据采集时仿真无反应 #130

@0mrrabbit0

Description

@0mrrabbit0

问题描述

在双网卡(有线 + 无线)主机上使用 PICO 手柄通过 AIDEA Vision App 进行遥操作数据采集时,仿真画面完全无反应,机器人不动。PICO App 显示已连接,但仿真端无任何动作输出。

环境信息

  • 主机:双网卡(有线网卡 + 无线网卡),分属不同子网
  • PICO 通过 Wi-Fi 连接到无线网段
  • Docker 容器使用 --network=host 模式

根因分析

问题涉及两个层面:

1. teleop.pyhost_ip 获取逻辑

teleop.py 原代码:

self.host_ip = self.get_local_ip()  # hostname -I 返回第一个 IP(有线网卡)
if self.host_ip == None:
    self.host_ip = args.host_ip

get_local_ip() 调用 hostname -I 获取主机 IP,在双网卡环境下返回的是第一个网卡的 IP(通常是有线网卡),而非 PICO 所在的无线网段 IP。并且命令行参数 --host_ip 只在 get_local_ip() 返回 None 时才生效,导致手动指定 IP 无效。

2. VRServer 绑定特定 IP 无法接收跨网卡数据

vr_server.pysock.bind((host, port)) 绑定了有线网卡 IP,而 PICO 数据从无线网卡进入,绑定有线 IP 的 socket 无法接收到来自无线网卡的 UDP 数据包。

诊断过程

  1. 宿主机 tcpdump 确认 PICO 数据已到达无线网卡:

    sudo tcpdump -i wlo1 udp port 8080 -c 5
    # 能抓到来自 PICO 的 UDP 数据
  2. 容器内绑定有线网卡 IP 无法收到数据:

    sock.bind(('<有线网卡IP>', 8080))  # 无法接收无线网卡的数据
  3. 容器内绑定 0.0.0.0 可以收到数据:

    sock.bind(('0.0.0.0', 8080))  # 可以接收所有网卡的数据

解决方案

修改 1:source/teleop/teleop.py — 优先使用命令行参数

# 修改前
self.host_ip = self.get_local_ip()
if self.host_ip == None:
    print("======>Can't get host_ip!!!! Please enter the ip address manually !!!")
    self.host_ip = args.host_ip

# 修改后
if args.host_ip:
    self.host_ip = args.host_ip
else:
    self.host_ip = self.get_local_ip()
    if self.host_ip == None:
        print("======>Can't get host_ip!!!! Please enter the ip address manually !!!")

修改 2:scripts/autoteleop.sh — 传入 0.0.0.0 作为绑定地址

# 修改 teleop.py 的启动命令,添加 --host_ip 0.0.0.0
python3 ./source/teleop/teleop.py --host_ip 0.0.0.0

建议

建议将 VRServer 的默认绑定地址改为 0.0.0.0,或在 teleop.py 中将 --host_ip 的默认值改为 0.0.0.0,以兼容多网卡环境。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions