Files
2026-08-09 15:56:20 +08:00

4.0 KiB

OmniSocketGo_robot_ros

Linux-only C11 implementation of the UDP/KCP transport stack from OmniSocketGo.

This subtree is intentionally standalone. The Go code stays in place as the behavior reference, while the C implementation builds its own binaries under c/bin/.

Build

make -j$(nproc)

Build outputs:

  • ./bin/udpserver
  • ./bin/udppeer
  • ./bin/udpping
  • ./bin/udprelay
  • ./bin/kcpserver
  • ./bin/kcppeer
  • ./bin/kcpping

Python extension build:

make python-ext
make python-install

Run On Different Machines

Server D runs the KCP hub on 0.0.0.0:10909:

./bin/kcpserver -listen 0.0.0.0:10909 \
  -telemetry-peer peer-a-telemetry \
  -telemetry-interval 1000ms \
  -kcp-session-stats-log logs/d-kcp-stats.jsonl \
  -kcp-session-stats-interval 1000ms

For multi-hour runs, keep -latency-log and -kcp-ts-debug-log off unless you are collecting a short repro trace.

Relay C runs a raw UDP forwarder to D:

./bin/kcpserver -mode=relay -listen 0.0.0.0:10909 -relay-remote 172.21.32.15:10909

Peer A dials D through relay C:

./bin/kcppeer -id peer-a -server 172.21.32.15:10909 -relay-via 106.55.173.235:10909 \
  -inbox-dir inbox/a \
  -latency-log logs/a-latency.jsonl \
  -kcp-ts-debug-log logs/a-kcp-ts.jsonl \
  -kcp-session-stats-log logs/a-kcp-stats.jsonl

Peer B dials D directly:

./bin/kcppeer -id peer-b -server 81.70.156.140:10909 \
  -inbox-dir inbox/b \
  -latency-log logs/b-latency.jsonl \
  -kcp-ts-debug-log logs/b-kcp-ts.jsonl \
  -kcp-session-stats-log logs/b-kcp-stats.jsonl

Optional ping / echo tools:

./bin/kcpping -id peer-a -server 106.55.173.235:10909 -echo
./bin/kcpping -id peer-b -server 81.70.156.140:10909 -to peer-a -count 20 -interval 100ms
./bin/udpserver -listen 0.0.0.0:9001
./bin/udppeer -id peer-a -server 127.0.0.1:9001
./bin/udpping -id pinger -server 127.0.0.1:9001 -to peer-a -count 20

Python control/video demos use two KCP sessions:

  • peer-a-ctrl <-> peer-b-ctrl for small binary control packets
  • peer-b-video -> peer-a-video for larger binary video frames

Example demo entry points:

  • udp_keyboard_sender.py
  • udp_xbox_sender.py
  • udp_fsm_controller.py
  • omnisocket_video_sender.py
  • omnisocket_video_receiver.py
  • scripts/kcp_control_benchmark.py

Python recv_into() note:

  • The writable buffer must be large enough for the full incoming payload.
  • If the buffer is too small, recv_into() reports the required size but the current frame has already been consumed and is lost.
  • For the video demo, keep video_receiver.buffer_bytes >= video_sender.frame_bytes.

Interactive Commands

udppeer and kcppeer support the same interactive shell:

help
text peer-b hello
text peer-a hi
file peer-a /tmp/test125.bin
quit

Notes

  • The C project targets Linux only.
  • It preserves the Go wire format for UDP datagrams and KCP stream frames.
  • It now supports binary payload messages in addition to text, file, register, and error.
  • Python Session.recv_into() is a zero-copy receive helper for already-sized buffers; it does not retain oversized frames for a retry.
  • It keeps runtime JSONL logging, UDP TX timestamp debug, KCP packet debug, and KCP session stats.
  • Offline latencysummary and HTML chart generation are intentionally not migrated.
  • No automated C tests are included in this subtree; validation is expected to happen on Linux via make and manual smoke tests.

ROS 2 robot camera mode

OmniSocketGo_robot_ros adds a ROS 2-native robot camera path. The Orbbec driver/proc_manager owns /dev/video*; omnisocket_camera_bridge subscribes to the RGB topics and exposes latest-frame shared-memory slots to b_side_omnid. The C daemon keeps the existing MJPEG/KCP wire format and never opens V4L2 in the default mode. See:

  • docs/ROS2_CAMERA_FORWARDING.md for build, startup, switching, and service ownership;
  • docs/ROS_CAMERA_INTERFACES.md for the RGB/depth/CameraInfo/metadata topics;
  • ros2/README.md for building the bridge package.