Robot Skill Hub by Superfast Robotics

Inverted-pendulum discrete LQR feedback

Inverted-pendulum discrete LQR feedback. Parameterized bounded JSON adapter; numerical operation, no hardware execution.

pythonrobotics-pendulum-lqr | Record version: 1.0.0

Record JSON | Markdown recipe | Complete search index

Fetch and prepare

curl -fsSL https://hub.superfastrobotics.com/skills/pythonrobotics-pendulum-lqr/skill.json
curl -fsSL https://hub.superfastrobotics.com/skills/pythonrobotics-pendulum-lqr/README.md
python /PATH_TO_SKILL/scripts/rsh.py inspect pythonrobotics-pendulum-lqr --json
python /PATH_TO_SKILL/scripts/rsh.py prepare pythonrobotics-pendulum-lqr --project ./experiment --expected-source-commit cdd0cc888802b584c2d654ca85e3c5460973487d --expected-record-version 1.0.0 --plan --json

Inspect the requirements, then remove --plan to prepare a project. Preparation verifies the archive SHA256 and preserves exact source pins. --install-deps explicitly installs dependencies. Run the returned simulation command separately.

Environment

Runtime
pythonrobotics cdd0cc888802
Robot
mathematical-model
Controller
json-contract-v1
Observation
explicit-json-input
OS / architecture
windows / x86_64
Python
>=3.10,<3.11

Compatibility status: hub_verified

Runtime
pythonrobotics cdd0cc888802
Robot
mathematical-model
Controller
json-contract-v1
Observation
explicit-json-input
OS / architecture
linux / x86_64
Python
>=3.10,<3.11

Compatibility status: hub_verified

All inputs and outputs follow interface v1. Simulation adapters query exact synthetic simulator state; no perception or physical sensor compatibility.

Requirements

No display. Matplotlib Agg for numerical imports; PyBullet DIRECT for simulation.

Packages: contourpy==1.3.2, cycler==0.12.1, fonttools==4.65.0, kiwisolver==1.5.1, matplotlib==3.9.4, numpy==1.26.4, packaging==26.3, pillow==12.3.0, pyparsing==3.3.3, python-dateutil==2.9.0.post0, scipy==1.13.1, six==1.17.0

Runtime dependency versions are pinned for the supported Python 3.10 x86_64 CPU environments and checked against execution receipts. Platform-specific wheel hashes are not represented as a universal artifact lock; prepare captures pip freeze.

External API keys: none.

Invocation

Executable interface

{
  "version": "1",
  "kind": "controller",
  "abstraction_level": 1,
  "execution_domain": "computation",
  "language": "python",
  "input_transport": "json_file_or_inline",
  "output_transport": "json_stdout",
  "conventions": {
    "linear_unit": "m",
    "angular_unit": "rad",
    "time_unit": "s",
    "coordinate_frame": "cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]",
    "joint_order": "not_used",
    "quaternion_order": "not_used"
  },
  "input_schema": {
    "type": "object",
    "required": [
      "state",
      "state_cost_diagonal",
      "force_cost"
    ],
    "additionalProperties": false,
    "properties": {
      "state": {
        "type": "array",
        "minItems": 4,
        "maxItems": 4,
        "items": {
          "type": "number",
          "minimum": -2,
          "maximum": 2
        },
        "x-unit": "mixed",
        "x-frame": "cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]",
        "x-order": [
          "x_m",
          "velocity_m_s",
          "theta_rad",
          "omega_rad_s"
        ],
        "description": "state; units=mixed; frame=cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]; component order=x_m,velocity_m_s,theta_rad,omega_rad_s"
      },
      "state_cost_diagonal": {
        "type": "array",
        "minItems": 4,
        "maxItems": 4,
        "items": {
          "type": "number",
          "minimum": 0.1,
          "maximum": 100
        },
        "x-unit": "positive_state_cost_weights",
        "x-frame": "cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]",
        "description": "Explicit positive state costs; unlike the upstream demo default, cart position is included."
      },
      "force_cost": {
        "type": "number",
        "minimum": 0.1,
        "maximum": 100,
        "x-unit": "positive_control_cost_weight",
        "x-frame": "cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]"
      }
    }
  },
  "output_schema": {
    "type": "object",
    "required": [
      "force_n",
      "gain",
      "closed_loop_spectral_radius"
    ],
    "additionalProperties": false,
    "properties": {
      "force_n": {
        "type": "number",
        "minimum": -10000,
        "maximum": 10000,
        "x-unit": "N",
        "x-frame": "cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]",
        "description": "force_n; units=N; frame=cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]"
      },
      "gain": {
        "type": "array",
        "minItems": 4,
        "maxItems": 4,
        "items": {
          "type": "number",
          "minimum": -10000,
          "maximum": 10000
        },
        "x-unit": "mixed",
        "x-frame": "cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]",
        "description": "State-feedback gain components multiply [cart position, cart velocity, pendulum angle, angular velocity].",
        "x-order": [
          "N/m",
          "N/(m/s)",
          "N/rad",
          "N/(rad/s)"
        ]
      },
      "closed_loop_spectral_radius": {
        "type": "number",
        "minimum": 0,
        "maximum": 100,
        "x-unit": "dimensionless",
        "x-frame": "cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]",
        "description": "closed_loop_spectral_radius; units=dimensionless; frame=cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]"
      }
    }
  },
  "preconditions": [
    "Inputs use the declared units and frame; no implicit transforms.",
    "This exact numerical/simulation model is not a physical robot configuration.",
    "Explicit positive Q/R costs apply to the pinned cart-pendulum linear model; this is not a nonlinear simulation or hardware controller."
  ],
  "postconditions": [
    "All declared checks must pass and all outputs must be finite.",
    "Success applies only to this operation and model, not higher-level task completion."
  ],
  "failure_codes": [
    "invalid_input_or_environment",
    "execution_failed",
    "task_failed"
  ],
  "composition": {
    "depends_on": [],
    "automatic_frame_conversion": false,
    "automatic_hardware_execution": false
  },
  "output_selector": "outputs",
  "origin_reference_ids": [],
  "origin_relationship": "adapted_from; inspect declared model and inputs, not original robot compatibility"
}

Entrypoint: python run.py

{
  "argv": [
    "{python}",
    "{recipe_dir}/run.py",
    "--source-dir",
    "{source_dir}",
    "--example"
  ],
  "inputs": {
    "state": [
      0,
      0,
      0.1,
      0
    ],
    "state_cost_diagonal": [
      1.0,
      1.0,
      10.0,
      1.0
    ],
    "force_cost": 1.0
  },
  "outputs": {
    "format": "single JSON object on stdout",
    "payload_selector": "outputs",
    "schema": {
      "type": "object",
      "required": [
        "force_n",
        "gain",
        "closed_loop_spectral_radius"
      ],
      "additionalProperties": false,
      "properties": {
        "force_n": {
          "type": "number",
          "minimum": -10000,
          "maximum": 10000,
          "x-unit": "N",
          "x-frame": "cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]",
          "description": "force_n; units=N; frame=cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]"
        },
        "gain": {
          "type": "array",
          "minItems": 4,
          "maxItems": 4,
          "items": {
            "type": "number",
            "minimum": -10000,
            "maximum": 10000
          },
          "x-unit": "mixed",
          "x-frame": "cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]",
          "description": "State-feedback gain components multiply [cart position, cart velocity, pendulum angle, angular velocity].",
          "x-order": [
            "N/m",
            "N/(m/s)",
            "N/rad",
            "N/(rad/s)"
          ]
        },
        "closed_loop_spectral_radius": {
          "type": "number",
          "minimum": 0,
          "maximum": 100,
          "x-unit": "dimensionless",
          "x-frame": "cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]",
          "description": "closed_loop_spectral_radius; units=dimensionless; frame=cart_axis_and_upright_pendulum; state=[x_m,v_m_s,theta_rad,omega_rad_s]"
        }
      }
    }
  }
}

Success: Exit 0, status=task_complete, success=true, finite outputs satisfying interface.output_schema and all declared numerical/model checks. This is not a physical robot or general task-success claim.

Timeout: 30 seconds. Caller must terminate the separate adapter process after 30 seconds; adapters bound iterations/scene steps and close simulation clients.

Failure modes

Source and license

Repository
https://github.com/AtsushiSakai/PythonRobotics
Authors
Atsushi Sakai and PythonRobotics contributors
Commit
cdd0cc888802b584c2d654ca85e3c5460973487d
Archive SHA256
6d3ccf43be4ae770a9e8dffd463c2561665847df5b7ddf693b01130004dbcee5
License
MIT
Hub commit
39b06d7a6016edcea27e348e49ffd86f29ec1811

Evidence

Runtime: task_complete / task_complete

Three frozen positive cases passed against this exact adapter; see per-case receipts. This does not estimate general accuracy.

Reviewer: Hub maintainer runtime harness | 2026-10-19

Submitter reports and hub verification remain separate. Source review does not establish task success.