[network] # Direct OmniSocket KCP input. No robot-side ZMQ receiving proxy is used. transport = "omnisocket" omnisocket_server = "175.178.116.187:14049" omnisocket_peer_id = "tg3-009027fa8190-robot" omnisocket_expected_sender = "tg3-009027fa8190-iarm" omnisocket_max_packet_age_ms = 300.0 # The deployed OmniSocket receiver does not exchange a Hub heartbeat while idle. # Re-register periodically with make-before-break so a Hub restart cannot leave # a false connected state and healthy refreshes never create a routing gap. # Active traffic resets this timer and is never interrupted by this refresh. omnisocket_idle_session_refresh_s = 30.0 # The native session can remain blocked on an old connection after the public # Hub disappears. An active session that receives no business frame for this # interval exits so systemd creates a completely fresh session. omnisocket_restart_after_stale_s = 2.0 # Retained only as a direct-LAN fallback when transport is changed to "zmq". iarm_endpoint = "tcp://192.168.5.14:5003" expected_iarm_id = "IArm009027FA8190" expected_iarm_type = "TS1P" minimum_arm_frequency_hz = 30.0 [ros] command_topic = "/encoder_identical_joint" rl_state_topic = "/hric/robot/rl_state" arm_state_topic = "/freq_change/arm_status" home_service = "/tg3_local_teleop/return_home" cancel_home_service = "/tg3_local_teleop/cancel_home" publish_rate_hz = 50.0 [robot] required_state = "HBWALK" required_status = "running" state_timeout_s = 1.0 arm_state_timeout_s = 0.25 [control] # OmniSocket start/stop is timed on EAI before any business frame is sent. # This value remains for the direct-ZMQ fallback latch. auto_home_on_stop = true start_stop_hold_seconds = 3.0 max_slew_rad_s = 1.0 # This custom margin is checked only when teleoperation starts. It is not # checked while collecting/following. Vendor limit protection is unchanged. joint_limit_margin_rad = 0.03 # Joint order: left 11..17, then right 21..27. Values are the TG3.0 limits # from the supplied 26.04.x SDK document, expressed in radians. joint_lower_rad = [ -2.8449, -0.1920, -2.8449, -2.5482, -2.8449, -1.3265, -1.3265, -2.8449, -3.3336, -2.8449, -2.5482, -2.8449, -1.3265, -1.3265, ] joint_upper_rad = [ 2.8449, 3.3336, 2.8449, 0.1920, 2.8449, 1.3265, 1.3265, 2.8449, 0.1920, 2.8449, 0.1920, 2.8449, 1.3265, 1.3265, ] [locomotion] # The two original immediate bindings are independent: right C + left-stick # vertical controls translation; left Z + right-stick horizontal controls # in-place yaw. Both act on the next 50 Hz tick, with no second hold. enabled = true command_topic = "/hric/robot/cmd_vel" # This bridge never publishes FSM commands. The robot must already report # HBWALK/running through the existing safety gate before velocity is allowed. # Match the TG3 secondary-development TwistStamped example. frame_id = "pelvis" hold_seconds = 0.0 joystick_deadzone = 0.2 joystick_expo = 2.0 # Turning is linear after the deadzone so medium right-stick travel is not # suppressed by the quadratic forward-motion curve. The official yaw cap is # unchanged. yaw_joystick_expo = 1.0 # TianGong secondary-development /cmd_vel limits for full/half-body walking: # linear.x [-0.8, +1.0] m/s and angular.z [-0.8, +0.8] rad/s. max_forward_m_s = 1.0 max_reverse_m_s = 0.8 max_angular_rad_s = 0.8 forward_axis_sign = 1.0 yaw_axis_sign = -1.0 zero_burst_frames = 10 [hands] # TianGong 3.0 on this robot uses BrainCo Revo2 hands. Commands are published # only while the same physical 3-second teleoperation latch is armed. enabled = true left_command_topic = "/left_hand/set_motor_multi" right_command_topic = "/right_hand/set_motor_multi" left_status_topic = "/left_hand/motor_status" right_status_topic = "/right_hand/motor_status" status_timeout_s = 0.25 # Vendor robot_tele_server uses mode 5 and an 800 ms expected duration. mode = 5 duration_ms = 800 position_min = 1 position_max = 1000 # Commissioning limit: no commanded motor may change faster than 400/1000 of # its full stroke per second. The driver keeps its own current/stall protection. slew_units_per_s = 400.0 invert_scalar = false # Scalar hand.position=0 is the robot's measured default-open pose. The closed # endpoint is the conservative BrainCoRevo2 "normal" grasp from the installed # xTELE GestureController. # Order: thumb bend, thumb rotation, index, middle, ring, little. open_normalized = [0.4, 0.4, 0.05, 0.05, 0.05, 0.05] closed_normalized = [0.9, 0.5, 0.45, 0.52, 0.52, 0.45] # Right B owns a robot-side, release-guarded pointing gesture while a teleop # session is armed. Both activation and deactivation require one continuous # 1-second hold, separated by at least 0.5 seconds of stable release. A new # session is always release-locked. The pose is xTELE GestureController's # BrainCoRevo2 gesture 2 ("single index finger"), state 0, in motor order: # thumb bend, thumb rotation, index, middle, ring, little. right_b_point_gesture_enabled = true right_b_point_gesture_hold_seconds = 1.0 right_b_point_gesture_release_seconds = 0.5 right_b_point_pose_normalized = [0.2, 0.688, 0.0, 0.98, 0.98, 0.98] [home] # Deliberately slower than manual teleoperation. This Home pose was captured # from the robot's real arm feedback on 2026-08-06. Joint order is 11..17, # followed by 21..27; values are radians. Home is not the motor-zero pose. slew_rad_s = 0.25 joint_goal_rad = [ 0.1842578799, 0.1234146282, 0.0396494754, -0.4828015864, -0.0024294013, 0.0065013529, -0.0040423824, 0.1721130311, -0.1383204311, -0.0142812012, -0.3408825397, 0.0026911981, 0.0039934102, -0.0030838961, ] # Abort if the commanded trajectory gets more than ~4.6 degrees ahead of # measured robot motion. max_tracking_error_rad = 0.08 command_tolerance_rad = 0.005 actual_tolerance_rad = 0.03 settle_s = 1.0 timeout_s = 30.0