leader_arm_controller - dingdongdengdong/astra_ws GitHub Wiki

Code Flow Analysis: leader_arm_controller.py

Code Flow Diagram

flowchart TD
    A[Start: Import Modules] --> B[Class ArmController Definition]
    B --> C[__init__ Method: Serial Setup, Thread Start]
    C --> D[recv_thread: Serial Data Receive Loop]
    D -->|PONG| E[pong_cb Callback]
    D -->|FEEDBACK| F[State Update: Position, Velocity, Effort]
    F --> G[state_cb Callback]
    D --> H[Debug Data Handling]
    D --> I[Other Data: Ignored]
    B --> J[get_pos: Return Last State]
    B --> K[write: Serial Write]
    B --> L[set_pos: Position Command]
    B --> M[set_torque: Torque Command]
    B --> N[stop: Cleanup and Serial Close]
    B --> O[__del__: Destructor Calls stop]
    B --> P[to_si_unit / to_raw_unit: Data Conversion]

Detailed Code Flow Explanation

1. Module Imports and Logging

  • Imports standard libraries (serial, threading, numpy, struct, math, time, sys, logging).
  • Configures logging for the module.

2. ArmController Class Definition

  • Constants: Defines communication protocol constants and gripper gear ratio.
  • Static Methods:
    • to_si_unit(arr): Converts raw joint data to SI units, with special handling for the gripper.
    • to_raw_unit(arr): Converts SI units back to raw protocol format.

3. Initialization (__init__)

  • Opens a serial connection to the specified device.
  • Initializes state variables and threading locks.
  • Starts a background thread (recv_thread) for receiving data.
  • Waits for initial position data before proceeding.

4. Data Reception Thread (recv_thread)

  • Continuously reads from the serial port unless signaled to quit.
  • Handles three main data types:
    • PONG: Calls pong_cb callback with unpacked data.
    • FEEDBACK:
      • Converts raw data to SI units.
      • Computes velocity and effort.
      • Updates last known state.
      • Calls state_cb callback if set.
    • Debug Data: Handles ASCII debug output, calls debug_cb if set.
    • Other Data: Ignored or printed for debugging.

5. State Access and Command Methods

  • get_pos(): Returns the latest position, velocity, effort, and timestamp (thread-safe).
  • write(encoded_data): Sends encoded data to the serial port (thread-safe).
  • set_pos(pos): Clips position to joint limits, encodes, and sends position command.
  • set_torque(torque): Sends a torque command.
  • stop(): Signals thread to quit, sets torque to zero, flushes and closes serial port.
  • __del__(): Ensures cleanup by calling stop() on object destruction.

6. Data Conversion

  • to_si_unit and to_raw_unit handle conversion between protocol and SI units, including gripper calibration.

7. Thread Safety

  • Uses locks to ensure thread-safe access to shared state and serial writes.

8. Callbacks

  • Supports user-defined callbacks for state updates, pong responses, configuration, and debug data.

9. Control Flow

  • The main control flow is event-driven, based on serial data reception and user commands via method calls.