Skip to main content

Easy teleoperate tools for robotic devices control with VR headset

Project description

Easy Teleoperate Tools

EasyTeleop 是一个基于VR设备控制机械臂的遥操作工具集。该工具集支持多种设备的集成,包括RealMan机械臂、VR头显和RealSense摄像头,并提供接口进行设备管理和遥操作控制。

本项目已发布到PYPI,可以使用 pip 安装:pip install easyteleop

功能特性

  • 多设备管理:支持机械臂、VR头显和摄像头设备的统一管理
  • 遥操作组:可配置不同的遥操作组,灵活组合设备
  • 实时状态监控:实时显示设备连接状态和运行情况
  • 数据采集:支持遥操作过程中的数据采集和存储
  • WebRTC视频流传输:支持低延迟视频流传输
  • 可视化:提供姿态可视化功能
  • qpSWIFT优化:集成qpSWIFT二次规划求解器,用于机器人逆运动学求解

系统架构

本系统采用模块化架构,包含以下几个主要组件:

组件 (Components)

  • DataCollect: 数据采集模块
  • TeleopMiddleware: 遥操作中间件
  • Visualizer: 可视化模块
  • WebRTC: WebRTC视频流支持
  • VRPacketAnalyzer: VR数据包分析器
  • Interpolation: 插值算法
  • HandVisualizer: 手部可视化模块

设备模块 (Device)

详细使用参考设备模块文档

  • BaseDevice: 设备基类
  • Camera: 摄像头设备(RealSenseCamera, TestCamera等)
  • Robot: 机械臂设备(RealMan, TestRobot等)
  • Hand: 手部设备(Revo2OnRealMan等)
  • VR: VR设备(VRSocket, TestVR等)

遥操作组 (TeleopGroup)

详细使用参考遥操组模块文档

  • BaseTeleopGroup: 遥操作组基类
  • SingleArmWithTriggerTeleopGroup: 单臂触发遥操作组
  • TwoArmWithTriggerTeleopGroup: 双臂触发遥操作组

安装指南

环境要求

  • Python 3.10+
  • Windows/Linux/macOS(建议官方 Python 或 Conda)
  • 可选:uv 包管理器(更快的 pip 替代品)

克隆仓库(包含子模块)

由于项目使用了 Git 子模块(qp-tools),需要特殊处理来完整克隆仓库:

# 方法1:克隆时初始化子模块
git clone --recurse-submodules https://github.com/Chain-Pray/EasyTeleop.git

# 方法2:克隆后手动初始化和更新子模块
git clone https://github.com/Chain-Pray/EasyTeleop.git
cd EasyTeleop
git submodule init
git submodule update

安装方式

正式安装(推荐)

从 PyPI 安装(wheel 已内置 qpSWIFT 扩展,开箱即用)

pip install easyteleop

开发者安装(本地源码 + 编译内置 qpSWIFT)

需要本地 C/C++ 构建环境:

  • Windows:Visual Studio Build Tools(含"使用 C++ 的桌面开发"组件)
  • Linux:gcc/clang 与基础构建工具
  • macOS:Xcode Command Line Tools

使用 uv(推荐):

pip install uv  # 如未安装
uv pip install -e .

或使用 pip:

pip install -e .

注意:仅执行 uv sync 只会安装第三方依赖,不会安装(编译)本包本身;必须安装本包才会编译 qpSWIFT 扩展。

安装完成后验证:

python -c "import EasyTeleop, qpSWIFT; print('OK')"

从源码构建 Wheel(用于分发)

uv build            # 生成 sdist 与 wheel
# 或仅生成 wheel:
uv build --wheel

构建好的 wheel 中已内置编译完成的 qpSWIFT 扩展(与当前平台/解释器匹配)。

主要依赖

  • aiortc: WebRTC支持
  • opencv-python: 图像处理
  • pyrealsense2: RealSense摄像头支持
  • robotic-arm: 机械臂控制库
  • numpy, scipy: 科学计算
  • matplotlib: 数据可视化
  • qpSWIFT: 二次规划求解器(已随包集成并在安装时编译/或随 wheel 分发)

使用方法

简单遥操

run文件夹下提供了多种测试脚本,用于不同场景的遥操作:

数据后处理(PostProcess)

数据采集脚本会把每次遥操作会话拆分保存在 datasets/temp/<session_id> 中(包含 metadata.jsonframes/arm_#/ 等目录)。run/run_postprocess.py 会读取这些原始文件并生成可用于训练/回放的 HDF5 文件。

  1. 确保采集好的会话位于 datasets/temp(或者使用 --temp_dir 指定其他路径)。
  2. 执行后处理脚本:
    # 只处理指定会话
    uv run run/run_postprocess.py --session demo_001
    
    # 批量处理所有会话并指定输出目录
    uv run run/run_postprocess.py --temp_dir datasets/temp --output_dir datasets/hdf5
    
  3. 每个会话会生成一个同名的 .hdf5 文件(默认输出到 datasets/hdf5)。

脚本支持以下常用参数:

  • --temp_dir:原始数据所在目录,默认为 datasets/temp
  • --output_dir:HDF5 输出目录,默认为 datasets/hdf5
  • --session:可以一次传入一个或多个会话 ID;不传则处理全部
  • --pattern:使用通配符过滤会话(例如 demo_*),可与 --latest 组合
  • --latest:只处理过滤结果中最近修改的一个会话
  • --list:仅列出筛选后的会话并退出
  • --skip_existing:跳过已经存在同名 .hdf5 的会话
  • --dry_run:仅打印会被处理的会话,不真正生成文件

运行过程中会完成:

  • 读取 frames/camera_0 的时间戳并将其作为所有模态的主时间轴;
  • 对双臂的 pose/joint/end_effector CSV 数据自动推断维度并做线性插值;
  • 将缺失帧替换为 224×224 的黑色占位图,确保 HDF5 结构稳定;
  • 写入 metadata/info 分组并统计帧数、摄像头数等信息,便于下游检索。

可以使用 uv run run/view_hdf5.py --path datasets/hdf5/<session>.hdf5 快速检查后处理结果和插值情况。更多流程细节、输入规范与排查技巧详见 PostProcess 数据后处理指南

启动服务

运行测试脚本:

# 在项目根目录下
uv run run/run_test.py

自定义遥操作脚本

创建自己的遥操作脚本通常包括以下步骤:

  1. 导入所需的设备和组件:
from EasyTeleop.Components import TeleopMiddleware
from EasyTeleop.Device.VR import VRSocket
from EasyTeleop.Device.Robot import RealMan
  1. 初始化设备实例:
# 初始化VR设备
vrsocket = VRSocket({"ip": '192.168.0.127', "port": 12345})

# 初始化机械臂设备
l_arm = RealMan({"ip": "192.168.0.18", "port": 8080})
r_arm = RealMan({"ip": "192.168.0.19", "port": 8080})
  1. 创建中间件并注册事件回调:
teleop = TeleopMiddleware()

# 注册VR事件回调
teleop.on("leftGripTurnDown", l_arm.start_control)
teleop.on("leftGripTurnUp", l_arm.stop_control)
teleop.on("leftPosRot", l_arm.add_pose_data)

# 注册VR数据处理回调
vrsocket.on("message", teleop.handle_socket_data)
  1. 启动所有设备和服务:
l_arm.start()
r_arm.start()
vrsocket.start()
  1. 添加主循环以监控设备状态:
devices = [l_arm, r_arm, vrsocket]
while True:
    connect_states = [device.get_conn_status() for device in devices]
    print(f"设备连接状态: {connect_states}")
    time.sleep(1)

WebRTC视频流传输

要使用WebRTC功能,需要:

  1. 初始化摄像头设备:
from EasyTeleop.Device.Camera import RealSenseCamera
camera = RealSenseCamera({"serial": "相机序列号", "target_fps": 30})
  1. 创建流跟踪器和WebRTC客户端:
from EasyTeleop.Components.WebRTC import CameraDeviceStreamTrack, UnityWebRTC
tracker = CameraDeviceStreamTrack()
client = UnityWebRTC(connection_id="LeftEye", signaling_url="你的信令服务器地址", tracker=tracker)
  1. 注册帧回调函数:
def frame_callback(frame):
    tracker.put_frame(frame)

camera.on("frame", frame_callback)
  1. 启动异步连接:
async def main():
    await client.connect()

asyncio.run(main())

项目结构

.
├── run/                    # 运行脚本
│   ├── run_test.py         # 测试脚本示例
│   └── ...                 # 其他运行脚本
├── src/
│   └── EasyTeleop/
│       ├── Components/     # 核心组件模块
│       │   ├── DataCollect.py      # 数据采集模块
│       │   ├── TeleopMiddleware.py # 遥操作中间件
│       │   ├── WebRTC.py           # WebRTC支持
│       │   ├── VRPacketAnalyzer.py # VR数据包分析器
│       │   ├── Interpolation.py    # 插值算法
│       │   ├── Visualizer.py       # 可视化模块
│       │   ├── HandVisualizer.py   # 手部可视化模块
│       │   └── __init__.py
│       ├── Device/         # 设备相关模块
│       │   ├── BaseDevice.py       # 设备基类
│       │   ├── Camera/             # 摄像头设备
│       │   │   ├── BaseCamera.py
│       │   │   ├── RealSenseCamera.py
│       │   │   ├── TestCamera.py
│       │   │   └── __init__.py
│       │   ├── Robot/              # 机械臂设备
│       │   │   ├── BaseRobot.py
│       │   │   ├── RealMan.py
│       │   │   ├── TestRobot.py
│       │   │   └── __init__.py
│       │   ├── Hand/               # 手部设备
│       │   │   ├── BaseHand.py
│       │   │   ├── Revo2OnRealMan.py
│       │   │   └── __init__.py
│       │   ├── VR/                 # VR设备
│       │   │   ├── BaseVR.py
│       │   │   ├── TestVR.py
│       │   │   ├── VRSocket.py
│       │   │   └── __init__.py
│       │   └── __init__.py
│       ├── TeleopGroup/    # 遥操作组管理
│       │   ├── BaseTeleopGroup.py
│       │   ├── SingleArmWithTriggerTeleopGroup.py
│       │   ├── TwoArmWithTriggerTeleopGroup.py
│       │   └── __init__.py
│       └── __init__.py
├── test/                   # 测试文件
├── docs/                   # 文档
└── pyproject.toml          # 项目配置文件

开发指南

添加新设备类型

要添加一个新的设备类型,需要遵循以下步骤:

  1. 在相应的设备类别目录下创建新设备类(如在Device/Robot中创建新类):
from EasyTeleop.Device.BaseDevice import BaseDevice

class MyNewRobot(BaseDevice):
    name = "My New Robot"
    description = "A new robot device for teleoperation"
    need_config = {
        "ip": "str",
        "port": "int"
    }
    
    def set_config(self, config):
        # 验证并设置配置
        super().set_config(config)
        self.ip = config.get("ip")
        self.port = config.get("port")
        return True

    def _connect_device(self):
        # 实现设备连接逻辑
        # 返回True表示连接成功
        return True

    def _disconnect_device(self):
        # 实现设备断开连接逻辑
        # 返回True表示断开成功
        return True

    def _main(self):
        # 实现设备主循环逻辑
        # 这个方法会在独立线程中循环调用
        pass
  1. 确保新设备类继承自相应的基类(如BaseDevice或特定设备类型的基类)

  2. 实现必要的接口方法:

  3. 定义设备所需的配置字段(need_config静态字段)

  4. 在设备类中可以使用事件系统与系统其他部分通信:

# 触发事件
self.emit("status_change", {"status": "running"})

# 注册事件回调
@device.on("frame")
def handle_frame(frame):
    # 处理帧数据
    pass

扩展遥操作功能

要扩展遥操作功能,可以通过以下方式:

  1. TeleopMiddleware中添加新的事件处理:
# 添加新的事件类型
self._events["newFeature"] = self._default_callback

# 或者直接注册回调函数
teleop.on("newFeature", callback_function)
  1. 创建新的遥操作组来组织设备:
from EasyTeleop.TeleopGroup.BaseTeleopGroup import BaseTeleopGroup

class MyTeleopGroup(BaseTeleopGroup):
    name = "My Teleop Group"
    description = "A custom teleoperation group"
    need_config = ["left_arm", "right_arm", "vr"]

    def start(self):
        # 实现启动逻辑
        self.running = True
        return True

    def stop(self):
        # 实现停止逻辑
        self.running = False
        return True

事件驱动架构

系统采用事件驱动架构,设备和组件之间通过事件进行通信:

  1. 设备通过emit方法触发事件:
self.emit("frame", frame_data)
  1. 其他组件通过on方法注册事件回调:
device.on("frame", callback_function)
  1. 支持装饰器语法注册回调:
@device.on("frame")
def process_frame(frame):
    # 处理帧数据
    pass

多线程和并发处理

所有设备都在独立线程中运行,确保不会阻塞主线程:

  1. 设备的主循环在_main_loop方法中实现
  2. _main方法在独立线程中循环调用
  3. 事件回调在独立线程中执行,避免阻塞设备主循环

构建和发布

使用uv构建分发包:

uv build

配置好API密钥然后上传PYPI

uv publish

或者使用传统方法构建并发布

python -m build
python -m twine upload dist/*

GitHub Actions自动化构建与发布

本项目使用GitHub Actions实现自动化构建和发布流程,每当创建新的Release时会自动触发。

构建流程

  1. 多平台wheel构建:使用cibuildwheel为以下平台构建wheel包:

    • Ubuntu (Linux)
    • Windows
    • (macOS暂时存在编译问题)
  2. 源码分发包构建:在Ubuntu环境下构建源码分发包(sdist)

  3. 发布到PyPI:使用Trusted Publishing将构建产物发布到PyPI

工作流配置

工作流文件位于.github/workflows/python-publish.yml,包含以下关键配置:

  • 构建Python 3.10、3.11和3.12的wheel包
  • 跳过32位架构和PyPy实现
  • Linux平台仅构建x86_64架构
  • 使用PyPI Trusted Publishing进行安全发布

发布新版本

要发布新版本,请按以下步骤操作:

  1. 更新pyproject.toml中的版本号:

    [project]
    version = "x.x.x"
    
  2. 提交更改并推送:

    git add pyproject.toml
    git commit -m "Bump version to x.x.x"
    git push
    
  3. 在GitHub上创建并发布新的Release:

    • 转到Releases
    • 点击"Draft a new release"
    • 创建新的tag(格式:vX.X.X)
    • 填写Release标题和说明
    • 点击"Publish release"
  4. GitHub Actions将自动触发构建和发布流程,构建完成后包将自动上传到PyPI

注意事项

  1. 所有设备的主循环都需要放在多线程中运行
  2. 设备控制逻辑不能阻塞主线程
  3. 设备状态有三种:未连接(0)、已连接(1)、断开连接(2)
  4. 系统支持自动重连机制

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

easyteleop-0.2.4.tar.gz (146.6 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

easyteleop-0.2.4-cp312-cp312-win_amd64.whl (114.5 kB view details)

Uploaded CPython 3.12Windows x86-64

easyteleop-0.2.4-cp312-cp312-musllinux_1_2_x86_64.whl (184.2 kB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

easyteleop-0.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (185.1 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

easyteleop-0.2.4-cp311-cp311-win_amd64.whl (114.5 kB view details)

Uploaded CPython 3.11Windows x86-64

easyteleop-0.2.4-cp311-cp311-musllinux_1_2_x86_64.whl (183.5 kB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

easyteleop-0.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (184.5 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

easyteleop-0.2.4-cp310-cp310-win_amd64.whl (114.5 kB view details)

Uploaded CPython 3.10Windows x86-64

easyteleop-0.2.4-cp310-cp310-musllinux_1_2_x86_64.whl (182.3 kB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

easyteleop-0.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (183.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

File details

Details for the file easyteleop-0.2.4.tar.gz.

File metadata

  • Download URL: easyteleop-0.2.4.tar.gz
  • Upload date:
  • Size: 146.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for easyteleop-0.2.4.tar.gz
Algorithm Hash digest
SHA256 b207a3e1040475304dc925a08995471c4f054ad9f2fd82601aaeee5d9f3848b6
MD5 8a1433a33c8034855ecf332de004a62c
BLAKE2b-256 43ac842b9382d829853476187f10260c287260df22f4fd173afde546b131aa41

See more details on using hashes here.

Provenance

The following attestation bundles were made for easyteleop-0.2.4.tar.gz:

Publisher: python-publish.yml on SZUEAILab/EasyTeleop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easyteleop-0.2.4-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: easyteleop-0.2.4-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 114.5 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for easyteleop-0.2.4-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 44d67068cf2cea1a313089653c1c309c32a8a0ee9c3596fec2b9787a7f598403
MD5 5198ac29187a818b7ba3d20b2d68d41d
BLAKE2b-256 ecac79b3e9a0a01c2801094cbbdd4a3fb7dabee8e9ed5732f229331a0130d678

See more details on using hashes here.

Provenance

The following attestation bundles were made for easyteleop-0.2.4-cp312-cp312-win_amd64.whl:

Publisher: python-publish.yml on SZUEAILab/EasyTeleop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easyteleop-0.2.4-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for easyteleop-0.2.4-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b829e8e2e8d8c77df450993b59b5776b824bed4d7f8ba6a686160710696f4baa
MD5 a322c7326249060dac58278813f9ae44
BLAKE2b-256 c2263bed6e53a927392b5617d72e33b9f58ca56344d58cff898a6904a9bffea6

See more details on using hashes here.

Provenance

The following attestation bundles were made for easyteleop-0.2.4-cp312-cp312-musllinux_1_2_x86_64.whl:

Publisher: python-publish.yml on SZUEAILab/EasyTeleop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easyteleop-0.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for easyteleop-0.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d6f5fd3b433ff624a9f21a31197c1aecde460caeda669a3f0ee28db241563334
MD5 2b1f4e520b9e1d08112e160c58136a0c
BLAKE2b-256 21d4d15a9dbafe4bb407ff17d6f4c8ec672a6727cf9b26fcd535c6be6f95704c

See more details on using hashes here.

Provenance

The following attestation bundles were made for easyteleop-0.2.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on SZUEAILab/EasyTeleop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easyteleop-0.2.4-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: easyteleop-0.2.4-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 114.5 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for easyteleop-0.2.4-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 16fc11b0d92f9533aaff7aaa568693186cda4bef28bd7dd6fab002277c0e2e4d
MD5 a12039a92dccc9f7411d45cad3ac7bc8
BLAKE2b-256 f521f5c3fcf797a383617abc23908bdb976d1f64bea25740c6232c315591c820

See more details on using hashes here.

Provenance

The following attestation bundles were made for easyteleop-0.2.4-cp311-cp311-win_amd64.whl:

Publisher: python-publish.yml on SZUEAILab/EasyTeleop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easyteleop-0.2.4-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for easyteleop-0.2.4-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 043662c056a1eae013a2019b77489577ffc9b0ef2755c83afb7cd57b06e973b8
MD5 385084ac4f94e9f8707b8ffbf7b15a2b
BLAKE2b-256 b193a6ce275686de0433474b59e16c4e33305ce9443b97bce44fc47a0271ed5e

See more details on using hashes here.

Provenance

The following attestation bundles were made for easyteleop-0.2.4-cp311-cp311-musllinux_1_2_x86_64.whl:

Publisher: python-publish.yml on SZUEAILab/EasyTeleop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easyteleop-0.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for easyteleop-0.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 392b1d3f50f591fd541ad828f9ca06babcf4538342acdbf92e78780ac9bc8d3c
MD5 6e50e987138e49d3624832a242f993a3
BLAKE2b-256 a67ecb1c2d9c651c36fa9905455615ae83a1db9c5cc131a57c4c59c403bfee6d

See more details on using hashes here.

Provenance

The following attestation bundles were made for easyteleop-0.2.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on SZUEAILab/EasyTeleop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easyteleop-0.2.4-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: easyteleop-0.2.4-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 114.5 kB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for easyteleop-0.2.4-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3054ffec20378594d8212e3b9316cb1b8cb2142cd87ba5c5034b10d0bdaaab6d
MD5 0032af2fbafb890e6e9cf190cfef5803
BLAKE2b-256 d789ebc1825b5d3e9ca934e10a7ca38c4647673663f49b2e39dbe701325f3553

See more details on using hashes here.

Provenance

The following attestation bundles were made for easyteleop-0.2.4-cp310-cp310-win_amd64.whl:

Publisher: python-publish.yml on SZUEAILab/EasyTeleop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easyteleop-0.2.4-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for easyteleop-0.2.4-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 7aaf9a19cdc25032fc3de859532a0e33ce92a1b91b2a20cf97770e0140be5f23
MD5 f2d7a6b75eeb3eb014bbbd2ebcbe3a5a
BLAKE2b-256 2cc0f9ec76eb7c62c4067d972bc3e4303ab4847db7dd7e42c078c716fd66cb65

See more details on using hashes here.

Provenance

The following attestation bundles were made for easyteleop-0.2.4-cp310-cp310-musllinux_1_2_x86_64.whl:

Publisher: python-publish.yml on SZUEAILab/EasyTeleop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file easyteleop-0.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for easyteleop-0.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2d0740ecb11223e69361afc1081a3b33421c2c3dac128b45c23fa1742e959d35
MD5 fb4305dc3fb6ded871254b1cfd5b3618
BLAKE2b-256 89b4853b53ade82e6f02a8927cd5df715e428bbac3aaa161e19dd76e6bcdc478

See more details on using hashes here.

Provenance

The following attestation bundles were made for easyteleop-0.2.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on SZUEAILab/EasyTeleop

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page