{"id":22111369,"url":"https://github.com/hebirobotics/robot-config","last_synced_at":"2026-03-19T21:46:17.762Z","repository":{"id":220722917,"uuid":"575466211","full_name":"HebiRobotics/robot-config","owner":"HebiRobotics","description":"Storage for robot configuration files","archived":false,"fork":false,"pushed_at":"2025-03-17T15:50:57.000Z","size":151,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-03-17T16:44:33.264Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HebiRobotics.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-12-07T15:19:53.000Z","updated_at":"2025-03-17T15:51:02.000Z","dependencies_parsed_at":"2024-03-05T15:27:21.543Z","dependency_job_id":"c552f3c2-78e6-4fb1-be1f-16a7c11ce2ad","html_url":"https://github.com/HebiRobotics/robot-config","commit_stats":null,"previous_names":["hebirobotics/robot-config"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HebiRobotics%2Frobot-config","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HebiRobotics%2Frobot-config/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HebiRobotics%2Frobot-config/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HebiRobotics%2Frobot-config/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HebiRobotics","download_url":"https://codeload.github.com/HebiRobotics/robot-config/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245209804,"owners_count":20578108,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-01T10:40:00.010Z","updated_at":"2026-01-05T06:41:00.488Z","avatar_url":"https://github.com/HebiRobotics.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"= HEBI Robot Config\n:toc:\nDocumentation/examples for HEBI robot configuration files\n\n== Overview\nThe HEBI robot config file format is designed to store configuration information about a system in a human-readable, run-time modifiable, cross-API format. By moving information from the code files to text files, the code should become shorter and more general and easier to port to different languages.\n\n== Format\nThe robot config files are yaml files that contain the following information:\n\n. Names + families of the actuators\n. Path to an associated HRDF file\n. Path to any associated gains files\n. Feedback frequency for the connection to the robot\n. Command lifetime for the connection to the robot\n. Parameters for any arm plugins that are to be used\n. Custom user properties\n. Information about waypoints and paths (future work)\n\nComments can be added in the YAML file using the `#` character.\n\n=== Version\n\nThe `version` property refers to the version of the file. The current version is `1.1`; changes between versions are listed in the CHANGELOG.adoc file.\n\n=== Names and Families (required)\nBoth `names` and `families` fields must be present and must either be a singular string or a list of strings. If a single family is provided, it is assigned to all modules within its group. For example:\n\n[source,yaml]\n----\nversion: 1.1\nfamilies: \"Arm\"\nnames: [\"J1_base\", \"J2_shoulder\", \"J3_elbow\", \"J4_wrist1\", \"J5_wrist2\", \"J6_wrist3\"]\n----\n\nNote that YAML strings do not need to be enclosed in quotation marks.\n\n=== HRDF file (optional)\nThe HRDF file is parsed as needed but is assumed relative to the directory of the configuration file. Example:\n\n[source,yaml]\n----\nhrdf: \"hrdf/A-2580-06.hrdf\"\n----\n\n=== Gains files (optional)\nThe gains filenames are retrievable at run time through a loaded RobotConfig object. The gain files are parsed as needed but are assumed relative to the configuration file. Gains use the `default` key if none is provided. Example:\n\n[source,yaml]\n----\ngains:\n  default: \"gains/A-2580-06.xml\"\n  soft: \"gains/A-2580-06-soft.xml\"\n----\nor\n\n[source,yaml]\n----\ngains:\n  hard: \"gains/A-2580-06.xml\"\n  soft: \"gains/A-2580-06-soft.xml\"\n----\nor\n\n[source,yaml]\n----\ngains: \"gains/A-2580-06.xml\"\n----\n\n(Note -- the second example has no default gains, and the third example stores the `gains` file with the `default` key)\n\n=== Feedback Frequency (optional)\nFeedback frequency is used to set the underlying group's feedback frequency.  If not provided, the default frequency is used.  The units are [Hz]\n\n[source,yaml]\n----\nfeedback_frequency: 200\n----\n\n=== Command Lifetime (optional)\nCommand lifetime is used to set the underlying group's default command lifetime (how long a command sent to the group is active for).  If not provided, the default lifetime is used.  The units are [s]\n\n[source,yaml]\n----\ncommand_lifetime: 1\n----\n\n=== Plugins (optional)\nThe `plugins` list allows for storing `Arm` plugin configurations. Each listed plugin is parsed when a loaded `RobotConfig` object is used to create an `Arm` object, and as such only the parameter types will be validated when creating the `RobotConfig` object. Each plugin requires at least a `type` and a `name` parameter, and it is recommended to always set a `ramp_time` (defaults to zero). Plugins can be disabled by setting `enabled` to false, and may have an arbitrary number of additional parameters.\n\n* The `type` field for each plugin is used to determine which plugin to use (see the list below for supported types). If this plugin type is not supported by an API, there should be an error when creating the `Arm` object using the `RobotConfig` object.\n\n* The `name` field can be used as a key for retrieving a specific plugin at run time.\n\n* The `ramp_time` field defines the time in seconds that it should take to scale the effect. The default `0` signifies no scaling and may result in sudden accelerations and jerks.\n\n* The `enabled` field controls whether a plugin is enabled at start. Keeping a plugin disabled has the same effect as commenting it out.\n\nThe order of the plugins in the yaml file dictates how they are ordered when creating an `Arm` object.\n\nThe remaining items in each plugin depend on the plugin itself, and are evaluated when creating the plugin at the time the `Arm` object is created. In general, plugins can have the following parameter types:\n\n. A float\n. A string\n. A bool (see the `gains_in_end_effector_frame` item below)\n. A list of floats (see the `kp` and `kd` items below)\n. A list of strings\n. A list of bools\n\nBelow is a list of the currently supported plugins.\n\n[options=\"header\"]\n|===\n|Type |Required Fields |Optional Fields |Description\n\n|All Plugins\n| `type` +\n`name`\n| `ramp_time=0` +\n`enabled=true`\n|Fields that are used across all plugins below. See definitions above and the examples below for more detail.\n\n|`GravityCompensationEffort`\n|\n| `imu_feedback_index=0` +\n`imu_frame_index=0` +\n`imu_rotation_offset=identity`\n|Adds efforts to compensate for gravity. All frames are zero-indexed.\n\n|`DynamicsCompensationEffort`\n|\n|\n|Adds efforts to compensate for joint accelerations. The masses are determined from the robot model.\n\n|`EffortOffset`\n| `offset` +\n|\n|Adds efforts to compensate for static offsets due to hardware configurations such as a mechanical spring assist.\n\n|`ImpedanceController`\n| `gains_in_end_effector_frame` +\n`kp` +\n`kd`\n| `ki=zeros` +\n`i_clamp=zeros`\n|Adds efforts to result in the desired end-effector impedances.\n\n|`DoubledJoint`\n| `group_family` +\n`group_name` +\n`index`\n| `mirror=true` +\n|Copies actuator commands to assist with a second actuator. This simplifies working with double shoulder configurations while treating an arm as a serial chain.\n\n|===\n\nExamples:\n\n[source,yaml]\n----\nplugins:\n  - type: GravityCompensationEffort\n    name: gravComp\n    imu_feedback_index: 0 # index of the device within a group. Defaults to zero\n    imu_frame_index: 0 # frame index that should be transformed. Defaults to zero\n    imu_rotation_offset: [1, 0, 0, 0, 1, 0, 0, 0, 1] # row major 3x3 rot matrix, eye 3 default\n    enabled: true\n\n  - type: DynamicsCompensationEffort\n    name: dynamicsComp\n    ramp_time: 5\n    enabled: true\n\n  - name: 'impedanceController'\n    type: ImpedanceController\n    gains_in_end_effector_frame: true\n    # HOLD POSITION AND ROTATION - BUT ALLOW MOTION ALONG/AROUND Z-AXIS\n    kp: [500, 500, 100, 0,  10, 0]  # (N/m) or (Nm/rad)\n    kd: [ 10,  10,   1, 0, 0.1, 0]  # (N/(m/sec)) or (Nm/(rad/sec))\n\n  # Kits with a gas spring need to add a shoulder compensation torque.\n  # It should be around -7 Nm for most kits, but it may need to be tuned\n  # for your specific setup.\n  - type: EffortOffset\n    name: gasSpringCompensation\n    ramp_time: 0\n    enabled: false\n    offset: [0, -7, 0, 0, 0, 0]\n\n  # The naming convention for the `DoubledJoint` plugin would be to add an \"A/B\" indication to the modules immediately after the `J#` component.   # So, if your arm consists of:\n  # `[\"J1_base\", \"J2_shoulder\", \"J3_elbow\"]`, you would change replace the 2nd entry in the base set of names with `J2A_shoulder`, and then the    # plugin config would be:\n  - type: DoubledJoint\n    group_family: J2B_shoulder\n    group_name: Arm\n    index: 1\n    mirror: true\n----\n\n=== User data entries\nThe optional `user_data` field may contain `key:value` data that gets stored in a \"user data\" parameter map. The keys must be alphanumeric with optional underscores and do not start with a number. Depending on the API, the values may be exposed as strings or as dynamic types. Example:\n\n[source,yaml]\n----\nuser_data:\n  robot_display_name: \"Friendly Bot\"\n  max_power: \"25.9\"\n  scale: 0.9\n  enable_logging: true\n----\n\n=== Paths and waypoints:\nTBD\n\n=== Other entries\nAny entry that is not `names`, `families`, `hrdf`, `gains`, 'feedback_frequency', 'command_lifetime', `plugins`, or `user_data` results in an error.\n\n== Full examples\nPlease check this repository for full examples of a variety of HEBI kits.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhebirobotics%2Frobot-config","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhebirobotics%2Frobot-config","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhebirobotics%2Frobot-config/lists"}