Skip to main content

ZeroMQ client/server bridge for franky

Project description

zero-franky

Use franky from a non-realtime machine through a ZeroMQ protocol.

flowchart LR
    subgraph Client["client process"]
        App["user code"]
        LocalFranky["local franky construction objects"]
        Proxy["zero-franky Robot proxy"]
    end

    subgraph Server["robot host process"]
        Rpc["ZeroMQ RPC server"]
        Builder["motion/policy builders"]
        Session["tracker session policy loop"]
        Handle["franky reference handle"]
        RemoteFranky["real franky Robot"]
        Pub["ZeroMQ state publisher"]
    end

    Robot["Franka robot"]

    App --> LocalFranky
    LocalFranky --> Proxy
    App --> Proxy
    Proxy -- "RPC: msgpack motion payloads" --> Rpc
    Proxy -- "RPC: import ref or cloudpickle policy" --> Rpc
    Rpc --> Builder
    Builder --> RemoteFranky
    Builder --> Session
    Session -- "local update loop" --> Handle
    Handle --> RemoteFranky
    RemoteFranky <--> Robot
    RemoteFranky --> Pub
    Pub -- "SUB: robot.state" --> App

Usage

zero-franky keeps the client-side construction style familiar:

from zero_franky import setup_zero_franky
from zero_franky import Robot
from franky import Affine, CartesianMotion, ReferenceType

setup_zero_franky("server-ip", 18812)

robot = Robot("192.168.100.1")
motion = CartesianMotion(Affine([0.2, 0.0, 0.0]), ReferenceType.Relative)
robot.move(motion, asynchronous=True)
robot.join_motion()

Robot is a proxy, and real local franky objects like Affine, CartesianMotion, and JointMotion are encoded into plain msgpack payloads. The server reconstructs corresponding real franky objects next to the robot.

Server

On the robot host:

zero-franky-server

By default this binds RPC on tcp://0.0.0.0:18812, state PUB on tcp://0.0.0.0:18813, and tracker updates on tcp://0.0.0.0:18814.

Common overrides:

zero-franky-server --host 192.168.1.20 --port 18812
zero-franky-server --port 19000 --no-pub

The equivalent Python entry point is:

from zero_franky.zmq_server import ZmqRobotServer

ZmqRobotServer(
    bind="tcp://0.0.0.0:18812",
    pub_bind="tcp://0.0.0.0:18813",
    tracker_bind="tcp://0.0.0.0:18814",
).serve_forever()

Implemented protocol

  • robot.create
  • robot.recover_from_errors
  • robot.move
  • robot.join_motion
  • robot.poll_motion
  • robot.stop
  • robot.get_last_teleop_state
  • robot.start_joint_tracker
  • robot.start_cartesian_tracker
  • tracker.status
  • tracker.stop
  • tracker.set_joint_reference
  • tracker.set_cartesian_reference

Supported motion payloads cover position, velocity, waypoint, stop, and fixed impedance motions. Tracker motions are exposed through tracker sessions rather than serialized as ordinary motion objects.

Telemetry

When the server has a pub_bind, RobotManager registers a motion callback and publishes snapshots on robot.state.

setup_zero_franky("server-ip", 18812)
subscriber = robot.state_subscriber()
topic, state = subscriber.recv()

Tracker Sessions

Tracker sessions are for JointImpedanceTrackingMotion and CartesianImpedanceTrackingMotion. They keep the impedance motion and reference handle on the robot host, then run a Python policy loop beside that handle. This avoids trying to servo over ZeroMQ while still letting client code define the policy.

There are two policy transports:

  • import: send module + qualname; the server imports the policy. Use this for stable policies installed on the robot host.
  • cloudpickle: serialize the function and send it over RPC. Use this for exploratory work on a trusted control network.

The built-in hold policies are importable:

from zero_franky.tracker_policies import hold_current_joint

session = robot.start_joint_impedance_session(
    hold_current_joint,
    stiffness=[10.0] * 7,
    damping=[6.0] * 7,
)

Or it can be shipped with cloudpickle for exploratory work:

def hold_here(context):
    q = list(context.robot.current_joint_positions)

    def step(_context):
        return {"position": q, "velocity": [0.0] * 7}

    return step

session = robot.start_joint_impedance_session(
    hold_here,
    policy_transport="cloudpickle",
    stiffness=[10.0] * 7,
)

cloudpickle policy transport executes client-provided Python on the robot host. Use it only on a trusted control network.

Cartesian sessions use the same policy shape and return an Affine target:

from zero_franky.tracker_policies import hold_current_cartesian

session = robot.start_cartesian_impedance_session(
    hold_current_cartesian,
    translational_stiffness=250.0,
    rotational_stiffness=25.0,
)

The policy function receives a context with franky, robot, elapsed, iterations, and stop(). A factory may return a step function, or the policy may act directly as the step function. Joint steps return {"position": q, "velocity": dq, "torque_feedforward": tau}. Cartesian steps return {"target": affine, "target_twist": twist}.

Sessions return a small proxy:

status = session.status()
session.set_joint_reference(q, velocity=dq)
session.stop()

set_joint_reference and set_cartesian_reference are mainly useful for operator overrides or lower-rate supervision. High-rate behavior should live inside the remote policy loop.

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

zero_franky-0.1.0.tar.gz (16.5 kB view details)

Uploaded Source

Built Distribution

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

zero_franky-0.1.0-py3-none-any.whl (18.1 kB view details)

Uploaded Python 3

File details

Details for the file zero_franky-0.1.0.tar.gz.

File metadata

  • Download URL: zero_franky-0.1.0.tar.gz
  • Upload date:
  • Size: 16.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for zero_franky-0.1.0.tar.gz
Algorithm Hash digest
SHA256 69794148680ca408ba7fb404b4298e69653f4785f6b10a5f77fd6c6cbaece0fa
MD5 a09f02bfe7ee26796f5e47a07eabc542
BLAKE2b-256 300b39acf535ef9037c2fa194ba59810d2b3c82557e5081c2e16411460845dc7

See more details on using hashes here.

Provenance

The following attestation bundles were made for zero_franky-0.1.0.tar.gz:

Publisher: publish.yml on nickswalker/zero-franky

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

File details

Details for the file zero_franky-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: zero_franky-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 18.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for zero_franky-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1703e4d4280e4e0ecf4b691b8c538e2732b94e301bc8a8e50e182053ab8c753b
MD5 abfa5bffe697783bed6d2c86b1d6f10a
BLAKE2b-256 abe46f7b5b44468a831b59853aa95b379e29f125444a1b90b637b192fc3cd598

See more details on using hashes here.

Provenance

The following attestation bundles were made for zero_franky-0.1.0-py3-none-any.whl:

Publisher: publish.yml on nickswalker/zero-franky

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