{
  "id": "ros2-joint-state-broadcaster",
  "name": "ros2_controllers joint-state broadcaster implementation",
  "summary": "Official C++ ros2_control plugin that claims no command interfaces, reads configured DOUBLE state interfaces and publishes JointState plus optional DynamicJointState ROS messages. Interface mapping, URDF filtering and incomplete readings have explicit source-defined behavior; runtime and hardware behavior remain untested.",
  "framework": "ros2-controllers",
  "kind": "community_skill",
  "artifact": {
    "kind": "code",
    "format": "cpp"
  },
  "compatibility": [
    {
      "runtime": "unknown",
      "runtime_version": "unknown",
      "robot": "unknown",
      "controller": "unknown",
      "observation": "unknown",
      "os": "unknown",
      "status": "unknown"
    }
  ],
  "capabilities": [
    "joint-state-broadcast",
    "joint-state-interface-read",
    "joint-state-publish",
    "dynamic-joint-state-publish",
    "controller-plugin"
  ],
  "aliases": [
    "ros2_control",
    "joint_state_broadcaster",
    "JointStateBroadcaster",
    "joint state broadcaster",
    "joint state broadcasting",
    "joint_states",
    "dynamic_joint_states",
    "sensor_msgs/JointState",
    "control_msgs/DynamicJointState"
  ],
  "robots": [
    "unspecified ros2_control system exposing joint state interfaces"
  ],
  "source": {
    "repository": "https://github.com/ros-controls/ros2_controllers",
    "commit": "8ce934536c6404750fb8aafc0b62b7d365049143",
    "path": "joint_state_broadcaster/src/joint_state_broadcaster.cpp",
    "url": "https://github.com/ros-controls/ros2_controllers/blob/8ce934536c6404750fb8aafc0b62b7d365049143/joint_state_broadcaster/src/joint_state_broadcaster.cpp",
    "sha256": "f0326808b19a0c89835e068b2974c92ff77c99610735c0c97d9056ef62fa26b4",
    "bytes": 15833,
    "authors": [
      "ros2_control development team",
      "Jordan Palacios",
      "Karsten Knese"
    ]
  },
  "license": {
    "spdx": "Apache-2.0",
    "url": "https://github.com/ros-controls/ros2_controllers/blob/8ce934536c6404750fb8aafc0b62b7d365049143/LICENSE",
    "verified": true,
    "scope": "Selected C++ source: Copyright 2021 ros2_control development team, Apache License 2.0. Package authors Jordan Palacios and Karsten Knese are preserved separately from the reviewed header notice (Copyright 2017 Open Source Robotics Foundation, Inc.). The complete pinned root Apache 2.0 license and matching package declaration were read. Preserve applicable copyright, license, modification and notice obligations. Review covers these selected texts, not all dependencies, generated code, binaries, hardware drivers or deployment."
  },
  "requirements": {
    "python": null,
    "packages": [
      "Complete pinned joint_state_broadcaster package, generated parameter header/YAML and a C++17 toolchain",
      "ament_cmake",
      "ros2_control_cmake",
      "backward_ros",
      "builtin_interfaces",
      "control_msgs",
      "controller_interface",
      "generate_parameter_library",
      "pluginlib",
      "rclcpp_lifecycle",
      "rclcpp",
      "realtime_tools",
      "sensor_msgs",
      "urdf",
      "hardware_interface",
      "std_msgs"
    ],
    "hardware": [],
    "system": [
      "Configured ros2_control controller manager/lifecycle host and DOUBLE joint state interfaces",
      "Matching joint/interface selections, topic namespace, frame and mapping parameters; robot description for optional URDF-based filtering"
    ],
    "notes": "command_interface_configuration returns NONE; the plugin reads loaned state interfaces and publishes ROS messages. Empty joints or interfaces selects all available state interfaces; otherwise the configured cross-product is requested. Non-DOUBLE interfaces are ignored. The selected source supports custom interface mapping, optional URDF filtering/order and configured extra joints initialized to zero. update attempts get_optional(0) once per DOUBLE interface and retains prior values on failed reads; never-read values can remain NaN. JointState carries position/velocity/effort; DynamicJointState is conditional. Unprefixed or ~/ topic names depend on use_local_topics. Complete source/header/package/CMake/plugin XML were read; parameter YAML/generated header and dependency implementations were not. Parameter defaults, timing, publication success, data freshness and physical compatibility were not tested. CMake >=3.16, C++17 and package 4.43.0 are declarations, not tested environment combinations. Optional BUILD_TESTING has additional declared dependencies."
  },
  "invocation": {
    "entrypoint": "pluginlib joint_state_broadcaster/JointStateBroadcaster (controller_interface::ControllerInterface)",
    "notes": "joint_state_plugin.xml registers type joint_state_broadcaster::JointStateBroadcaster, base controller_interface::ControllerInterface and shared library joint_state_broadcaster. This selected source exports that same pair with PLUGINLIB_EXPORT_CLASS; CMake builds that shared library and exports the XML. A configured controller manager invokes its lifecycle and update callbacks. This is not a standalone executable or Hub adapter. Loading it can expose hardware state through joint_states and optional dynamic_joint_states ROS topics; this source requests no command interface. Fetching the reference neither loads the plugin nor executes it."
  },
  "access": {
    "mode": "source_reference",
    "hub_prepare": false,
    "instructions": "Read the immutable source/header, complete license and package/CMake/plugin registration, then review the upstream parameter definitions and configured controller-manager host before integration. This source-only reference supplies no build, install or execution adapter.",
    "setup_url": "https://github.com/ros-controls/ros2_controllers/blob/8ce934536c6404750fb8aafc0b62b7d365049143/joint_state_broadcaster/CMakeLists.txt"
  },
  "evidence": {
    "level": "source_reviewed",
    "runtime_verification": "not_run",
    "checked_at": "2026-10-18",
    "inspection": "Complete selected C++ source, required class header, package XML, CMake and plugin XML read as inert text. Five new anonymous pinned raw GETs, all HTTP 200; every body matches the existing complete 768-entry official Git tree by path, byte count and Git blob SHA-1, with SHA-256 preserved. Existing canonical repository/commit/tree evidence and complete root Apache 2.0 license were rechecked offline and reused without refetch. No compilation, installation, plugin load, ROS/simulator/robot execution, compatibility measurement or automatic plugin-importer validation was performed."
  },
  "maintenance": {
    "record_version": "reviewed-20261018-f0326808b19a",
    "last_checked": "2026-10-18",
    "upstream_status": "source_pinned"
  }
}
