├── .gitignore ├── README.md ├── advanced ├── commands │ ├── command_control_strategy_example.py │ ├── command_gains.py │ ├── command_led_example.py │ ├── command_persist_settings_example.py │ ├── command_position_example.py │ └── command_settings_example.py ├── demos │ ├── MAPS_control │ │ ├── MAPS_input_device_example.py │ │ ├── MAPS_input_device_w_gripper_example.py │ │ ├── MAPS_input_device_w_gripper_keyboard.py │ │ ├── README │ │ ├── gains │ │ │ ├── A-2303-01.xml │ │ │ ├── A-2303-06.xml │ │ │ ├── gripper_spool_gains.xml │ │ │ └── mirror_shoulder.xml │ │ ├── gripper_control.py │ │ ├── hrdf │ │ │ ├── 7DoF_arm.hrdf │ │ │ ├── A-2303-01.hrdf │ │ │ ├── A-2303-06.hrdf │ │ │ └── mapsArm_7DoF_standard.hrdf │ │ ├── kbhit.py │ │ └── keyboard_teach_repeat_w_gripper.py │ ├── master_slave_async_example.py │ ├── python_GUI.py │ ├── random-waypoints-and-trajectories.py │ ├── sweeping_arm_1.py │ └── sweeping_arm_2.py └── feedback │ └── io_feedback_example.py ├── basic ├── 01a_lookup.py ├── 01b_get_group_single_module.py ├── 01c_get_group_multiple_modules.py ├── 02a_feedback.py ├── 02b_feedback_w_logging.py ├── 02c_feedback_loading_log.py ├── 02d_feedback_background.py ├── 03a_command_position.py ├── 03b_command_velocity.py ├── 03c_command_effort.py ├── 03d_command_pos_vel.py ├── 03e_command_pos_vel_effort.py ├── 03f_command_vel_w_feedback.py ├── 04a_gains_position_kp.py ├── 04b_gains_saving_xml.py ├── 04c_gains_loading_xml.py ├── 05_trajectory.py ├── 06a_kinematics_setup.py ├── 06b_kinematics_fwd_kinematics.py ├── 06c_kinematics_inv_kinematics.py ├── 07a_robot_3_dof_arm.py ├── 07b_robot_6_dof_arm.py ├── gains │ ├── A-2085-03.xml │ ├── A-2085-06.xml │ └── example_gains.xml ├── hrdf │ ├── A-2085-03.hrdf │ └── A-2085-06.hrdf ├── io_board │ ├── 1a_lookup.py │ ├── 1b_newGroup_single_module.py │ ├── 1c_newGroup_multiple_modules.py │ └── 2a_feedback.py └── mobile_io │ ├── 1a_lookup.py │ ├── 1b_newGroup_single_module.py │ ├── 1c_newGroup_multiple_modules.py │ ├── 2a_feedback.py │ ├── 2b_feedback_io_w_logging.py │ ├── 2c_feedback_orientation.py │ ├── 2d_feedback_full_pose.py │ ├── 2e_feedback_pose_w_magnetometer.py │ └── 3a_feedback_io_and_mobile.py ├── kits ├── arms │ ├── ar_control_sm.py │ ├── config │ │ ├── A-2084-01.cfg.yaml │ │ ├── A-2084-01G.cfg.yaml │ │ ├── A-2085-03.cfg.yaml │ │ ├── A-2085-04.cfg.yaml │ │ ├── A-2085-05.cfg.yaml │ │ ├── A-2085-05G.cfg.yaml │ │ ├── A-2085-06.cfg.yaml │ │ ├── A-2085-06G.cfg.yaml │ │ ├── A-2099-07.cfg.yaml │ │ ├── A-2099-07G.cfg.yaml │ │ ├── A-2240-04.cfg.yaml │ │ ├── A-2240-05.cfg.yaml │ │ ├── A-2240-05G.cfg.yaml │ │ ├── A-2240-06.cfg.yaml │ │ ├── A-2240-06G.cfg.yaml │ │ ├── A-2302-01.cfg.yaml │ │ ├── A-2302-01G.cfg.yaml │ │ ├── A-2303-01.cfg.yaml │ │ ├── A-2303-01G.cfg.yaml │ │ ├── A-2580-04.cfg.yaml │ │ ├── A-2580-05.cfg.yaml │ │ ├── A-2580-05G.cfg.yaml │ │ ├── A-2580-06.cfg.yaml │ │ ├── A-2580-06G.cfg.yaml │ │ ├── A-2582-07.cfg.yaml │ │ ├── A-2582-07G.cfg.yaml │ │ ├── A-2590-01.cfg.yaml │ │ ├── A-2590-01G.cfg.yaml │ │ ├── ex_AR_kit.cfg.yaml │ │ ├── ex_AR_kit_w_gripper.cfg.yaml │ │ ├── ex_gravity_compensation.cfg.yaml │ │ ├── ex_gravity_compensation_toggle.cfg.yaml │ │ ├── ex_impedance_control_cartesian.cfg.yaml │ │ ├── ex_impedance_control_damping.cfg.yaml │ │ ├── ex_impedance_control_fixed.cfg.yaml │ │ ├── ex_impedance_control_gimbal.cfg.yaml │ │ ├── ex_mobile_io_control.cfg.yaml │ │ ├── ex_teach_repeat.cfg.yaml │ │ ├── ex_teach_repeat_w_gripper.cfg.yaml │ │ ├── gains │ │ │ ├── A-2080-01.xml │ │ │ ├── A-2084-01.xml │ │ │ ├── A-2085-03.xml │ │ │ ├── A-2085-04.xml │ │ │ ├── A-2085-05.xml │ │ │ ├── A-2085-06.xml │ │ │ ├── A-2099-07.xml │ │ │ ├── A-2240-04.xml │ │ │ ├── A-2240-05.xml │ │ │ ├── A-2240-06.xml │ │ │ ├── A-2255-01.xml │ │ │ ├── A-2302-01.xml │ │ │ ├── A-2303-01.xml │ │ │ ├── A-2580-04.xml │ │ │ ├── A-2580-05.xml │ │ │ ├── A-2580-06.xml │ │ │ ├── A-2582-07.xml │ │ │ ├── A-2590-01.xml │ │ │ ├── gripper_spool_gains.xml │ │ │ └── mirror_shoulder.xml │ │ ├── hrdf │ │ │ ├── A-2084-01.hrdf │ │ │ ├── A-2084-01G.hrdf │ │ │ ├── A-2085-03.hrdf │ │ │ ├── A-2085-04.hrdf │ │ │ ├── A-2085-05.hrdf │ │ │ ├── A-2085-05G.hrdf │ │ │ ├── A-2085-06.hrdf │ │ │ ├── A-2085-06G.hrdf │ │ │ ├── A-2099-07.hrdf │ │ │ ├── A-2099-07G.hrdf │ │ │ ├── A-2240-04.hrdf │ │ │ ├── A-2240-05.hrdf │ │ │ ├── A-2240-05G.hrdf │ │ │ ├── A-2240-06.hrdf │ │ │ ├── A-2240-06G.hrdf │ │ │ ├── A-2302-01.hrdf │ │ │ ├── A-2302-01G.hrdf │ │ │ ├── A-2303-01.hrdf │ │ │ ├── A-2303-01G.hrdf │ │ │ ├── A-2580-04.hrdf │ │ │ ├── A-2580-05.hrdf │ │ │ ├── A-2580-05G.hrdf │ │ │ ├── A-2580-06.hrdf │ │ │ ├── A-2580-06G.hrdf │ │ │ ├── A-2582-07.hrdf │ │ │ ├── A-2582-07G.hrdf │ │ │ ├── A-2590-01.hrdf │ │ │ └── A-2590-01G.hrdf │ │ └── layouts │ │ │ ├── ar_control_sm.json │ │ │ ├── ex_AR_kit.json │ │ │ ├── ex_AR_kit_w_gripper.json │ │ │ ├── ex_gravity_compensation_toggle.json │ │ │ ├── ex_impedance_control_cartesian.json │ │ │ ├── ex_impedance_control_damping.json │ │ │ ├── ex_impedance_control_fixed.json │ │ │ ├── ex_impedance_control_floor.json │ │ │ ├── ex_impedance_control_gimbal.json │ │ │ ├── ex_mobile_io_control.json │ │ │ ├── ex_teach_repeat.json │ │ │ ├── ex_teach_repeat_w_gripper.json │ │ │ └── joystick_control_sm.json │ ├── ex_AR_kit.py │ ├── ex_AR_kit_w_gripper.py │ ├── ex_gravity_compensation.py │ ├── ex_gravity_compensation_toggle.py │ ├── ex_impedance_control_cartesian.py │ ├── ex_impedance_control_damping.py │ ├── ex_impedance_control_fixed.py │ ├── ex_impedance_control_gimbal.py │ ├── ex_mobile_io_control.py │ ├── ex_teach_repeat.py │ ├── ex_teach_repeat_double_shoulder.py │ ├── ex_teach_repeat_gui.py │ ├── ex_teach_repeat_w_gripper.py │ ├── hebi_util.py │ ├── joystick_control_sm.py │ ├── plotting.py │ └── starter_example.py ├── bases │ ├── config │ │ ├── default │ │ │ └── A-2592-01.cfg.yaml │ │ ├── examples │ │ │ └── ex_holonomic_omni.cfg.yaml │ │ ├── gains │ │ │ └── A-2592-01.xml │ │ └── hrdf │ │ │ └── A-2592-01.hrdf │ └── ex_diff_drive_control.py ├── camera │ ├── camera.py │ ├── hrdf │ │ └── pan_tilt_mast.hrdf │ └── pan_tilt_mast.py ├── daisy │ ├── README.md │ ├── components │ │ ├── __init__.py │ │ ├── configuration.py │ │ ├── hexapod.py │ │ ├── joystick_interface.py │ │ ├── leg.py │ │ └── step.py │ ├── daisy.py │ ├── install │ │ ├── README.md │ │ ├── hebi-demo.service │ │ ├── hebi_demo_wait_for_connected │ │ ├── launch_demo │ │ └── service_install │ └── resources │ │ ├── gains18.xml │ │ ├── images │ │ ├── controller.png │ │ ├── daisy_coordinates.png │ │ ├── daisy_coordinates_small.png │ │ ├── daisy_labeled.png │ │ └── daisy_render.png │ │ ├── left.hrdf │ │ └── right.hrdf ├── igor2 │ ├── README.md │ ├── components │ │ ├── __init__.py │ │ ├── arm.py │ │ ├── body.py │ │ ├── chassis.py │ │ ├── configuration.py │ │ ├── igor.py │ │ ├── joystick_interface.py │ │ └── leg.py │ ├── hrdf │ │ ├── igor.hrdf │ │ ├── igorArm-Left.hrdf │ │ ├── igorArm-Right.hrdf │ │ ├── igorLeg.hrdf │ │ ├── tgor.hrdf │ │ ├── tgorArm-Left.hrdf │ │ ├── tgorArm-Right.hrdf │ │ ├── tgorChassis.hrdf │ │ └── tgorLeg.hrdf │ ├── igor2_demo.py │ ├── install │ │ ├── README.md │ │ ├── hebi-demo.service │ │ ├── hebi_demo_wait_for_connected │ │ ├── launch_demo │ │ └── service_install │ └── resources │ │ ├── igorGains.xml │ │ ├── igorGains_noCamera.xml │ │ ├── mobile_io_igor.png │ │ └── ps4_igor.png ├── state_machine_template.py └── tready │ ├── demo_selector.py │ ├── gains │ ├── A-2240-06.xml │ ├── gripper_spool_gains.xml │ ├── r-tready-gains.xml │ ├── smart-tready-gains.xml │ ├── tready-7dof-arm-gains.xml │ └── tready-arm-gains.xml │ ├── hrdf │ ├── R8-16_reverse.hrdf │ ├── Tready.hrdf │ ├── Tready_track.hrdf │ ├── tready-7dof-arm.hrdf │ ├── tready-arm-5DoF.hrdf │ ├── tready-arm-A2085-06G.hrdf │ ├── tready-arm-A2240-06G.hrdf │ └── tready-arm.hrdf │ ├── smart_tready_arm_io_control.py │ ├── smart_tready_control.py │ ├── tready.py │ ├── tready_arm_io_control.py │ ├── tready_arm_joystick_control.py │ ├── tready_leader_follower_control.py │ ├── tready_mast_demo.py │ └── tready_utils.py ├── lib ├── win_x64 │ └── SDL2.dll └── win_x86 │ └── SDL2.dll └── util ├── __init__.py ├── math_utils.py └── type_utils.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Virtual Env 2 | venv/ 3 | 4 | # PyCharm/JetBrains folders 5 | .idea/ 6 | 7 | # Byte compiled / optimized files 8 | __pycache__/ 9 | *.py[cod] 10 | *$py.class 11 | 12 | # Ignore hebilog files 13 | *.hebilog 14 | 15 | **/logs 16 | 17 | # Example gains output by some examples 18 | **/my_actuator_gains.xml 19 | 20 | # Ignore Mac added files 21 | .DS_Store 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # HEBI Python API Examples 2 | 3 | This repository contains examples to go with the [online documentation](http://docs.hebi.us/tools.html#python-api) that help to get started with the HEBI Robotics APIs for Python. 4 | 5 | ## Setup 6 | 7 | All examples require the `hebi-py` pip package in order to run. You can install it through pip (_i.e._, `pip install hebi-py`). 8 | 9 | It is expected that you have a `hebi-py` version of at least `2.2.0` for this repo. 10 | 11 | **Note that this revision does not support Python 2!** 12 | 13 | Additionally, some of the kits examples require the [PySDL2 Package](https://pypi.org/project/PySDL2/). You will need the `SDL2` shared library for this to work. For Windows, this library is included for you in this repository. 14 | 15 | ### Nightly API 16 | 17 | If you want access to the newest API, you can download one of our nightly builds by doing: 18 | 19 | `pip install http://docs.hebi.us/download/python/hebi-py-{version}.tar.gz` 20 | 21 | Visit http://docs.hebi.us/download/python to see which specific versions are available for download, as they may change. 22 | 23 | ## Basic Examples 24 | 25 | This folder contains examples that help you get started with the HEBI 26 | Robotics APIs for Python. There are separate examples for each of our different products: 27 | 28 | * X-Series Actuator 29 | * I/O Board 30 | * Mobile I/O 31 | 32 | The examples provided in each product work progressively through the following concepts: 33 | 34 | * Lookup / Groups 35 | * Feedback 36 | * Commands 37 | * Gains 38 | * Trajectories 39 | * Kinematics 40 | * Example - Robot Arm 41 | 42 | These API features and concepts are documented in more detail at: 43 | 44 | * http://docs.hebi.us/tools.html#python-api 45 | * http://docs.hebi.us/core_concepts.html 46 | 47 | ## Kits 48 | 49 | This folder contains example code for various preconfigured kits. Additional documentation is available in the corresponding kit directories. 50 | 51 | | Kit | Comment | 52 | |-----|---------| 53 | | [Arms](kits/arms) | A variety of arm configurations, from 4-DoF to 6-DoF. | 54 | | [Igor](kits/igor2) | A 2-wheel, 2-arm, dynamic balancing mobile robot | 55 | 56 | ## Advanced Examples 57 | 58 | This folder contains examples that show less commonly used concepts. 59 | -------------------------------------------------------------------------------- /advanced/commands/command_control_strategy_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | 5 | lookup = hebi.Lookup() 6 | group = lookup.get_group_from_names(['X5-4'], ['X5-0000']) 7 | 8 | if group is None: 9 | print('Group not found: Did you forget to set the module family and names above?') 10 | exit(1) 11 | 12 | command = hebi.GroupCommand(group.size) 13 | # Set the control strategy for all the modules 14 | command.control_strategy = 'Strategy2' 15 | 16 | if group.send_command_with_acknowledgement(command, 100): 17 | print('Got acknowledgement') 18 | else: 19 | print('Did not receive acknowledgement!') 20 | -------------------------------------------------------------------------------- /advanced/commands/command_gains.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | 5 | lookup = hebi.Lookup() 6 | group = lookup.get_group_from_names(['family'], ['base', 'shoulder', 'elbow']) 7 | 8 | if group is None: 9 | print('Group not found: Did you forget to set the module family and names above?') 10 | exit(1) 11 | 12 | command = hebi.GroupCommand(group.size) 13 | 14 | # Set gains. If this doesn't succeed, it may be because the number of modules 15 | # in the group doesn't match the number in the XML, or the file was corrupt. 16 | 17 | try: 18 | command.read_gains('gains.xml') 19 | print('Successfully read gains from file; now sending to module.') 20 | group.send_command(command) 21 | except: 22 | print('Could not read gains from file') 23 | -------------------------------------------------------------------------------- /advanced/commands/command_led_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | group = lookup.get_group_from_names(['family'], ['name']) 8 | 9 | if group is None: 10 | print('Group not found: Did you forget to set the module family and names above?') 11 | exit(1) 12 | 13 | # Set command lifetime to 100 ms 14 | group.command_lifetime = 100 15 | 16 | group_command = hebi.GroupCommand(group.size) 17 | 18 | # Set the LED red 19 | group_command.led.color = 'red' 20 | group.send_command(group_command) 21 | 22 | sleep(3) 23 | 24 | # Set the LED Blue, and then clear the command. 25 | # Note that this "clear" does not return the LED to module control, but 26 | # rather remove any LED command from the command object, so when this is sent 27 | # to the module the LED state won't be affected. 28 | group_command.led.color = 'blue' 29 | group_command.led.color = None 30 | group.send_command(group_command) 31 | 32 | sleep(3) 33 | 34 | # Set the LED to "module control" mode 35 | group_command.led.color = 'transparent' 36 | group.send_command(group_command) 37 | 38 | sleep(3) 39 | 40 | # Set the LED purple. Note that this override automatically sets the alpha 41 | # channel to "255" (e.g., arguments are RGB). 42 | group_command.led.color = hebi.Color(255, 0, 255) 43 | group.send_command(group_command) 44 | 45 | sleep(3) 46 | 47 | # Set the LED back to module control. 48 | group_command.led.color = 'transparent' 49 | group.send_command(group_command) 50 | -------------------------------------------------------------------------------- /advanced/commands/command_persist_settings_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | 5 | lookup = hebi.Lookup() 6 | group = lookup.get_group_from_names(['X5-4'], ['X5-0000']) 7 | 8 | if group is None: 9 | print('Group not found: Did you forget to set the module family and names above?') 10 | exit(1) 11 | 12 | # replace with 'raw_input' for python 2.7 13 | new_name = input('Enter a new name for this module:') 14 | 15 | command = hebi.GroupCommand(group.size) 16 | 17 | # Note that you **must** pass a list as the value here, as opposed to just a string. 18 | # This is intentional; some fields (e.g., "name" field) in a group command 19 | # cannot be set with a scalar value. 20 | # The reasoning behind this is to prevent a user from accidentally setting 21 | # all modules in a group the same name. 22 | # 23 | # If you try to set "name" with a scalar value (e.g., `"foo"` instead of `["foo"]`) 24 | # an exception will be raised, informing you that you cannot broadcast a 25 | # scalar value to this field in all modules of the group. 26 | command.name = [new_name] 27 | 28 | # Mark that settings should be persisted across reboots 29 | command.save_current_settings = True 30 | 31 | print('Setting and saving new module name. Restart and verify name has been reset.') 32 | 33 | if group.send_command_with_acknowledgement(command, 100): 34 | print('Got acknowledgement.') 35 | else: 36 | print('Did not receive acknowledgement!') 37 | -------------------------------------------------------------------------------- /advanced/commands/command_position_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | import numpy as np 5 | from time import sleep 6 | from math import sin 7 | 8 | lookup = hebi.Lookup() 9 | group = lookup.get_group_from_names(['X5-4'], ['X5-0000']) 10 | 11 | if group is None: 12 | print('Group not found: Did you forget to set the module family and names above?') 13 | exit(1) 14 | 15 | command = hebi.GroupCommand(group.size) 16 | 17 | # Send commands to the group in a loop. 18 | # Note that these packets may be dropped if network traffic is too high, so 19 | # be sure to close a feedback loop at the high level! 20 | period = 0.5 21 | t = 0.0 22 | 23 | positions = np.empty(group.size, dtype=np.float64) 24 | while t < 10.0: 25 | for module_index in range(0, group.size): 26 | positions[module_index] = sin((t * 0.5) + (module_index * 0.25)) 27 | 28 | command.position = positions 29 | group.send_command(command) 30 | sleep(period) 31 | t = t + period 32 | 33 | # For critical packets, we can verify that they were sent by requesting 34 | # confirmation from the group. If the acknowledgement function returns 35 | # 'True', it got positive confirmation. If it returns 'False', EITHER: 36 | # - the sent command was dropped 37 | # - the sent command was received by the group, but its response was either 38 | # dropped or the timeout period expired before receipt of the group. 39 | # Again, a high-level process should intelligently handle these conditions! 40 | # Note that this is a blocking call, and so for high-frequency applications, 41 | # send_command should be used instead. 42 | timeout_ms = 100 43 | 44 | while t < 10.0: 45 | for module_index in range(0, group.size): 46 | positions[module_index] = sin((t * 0.5) + (module_index * 0.25)) 47 | 48 | command.position = positions 49 | if group.send_command_with_acknowledgement(command): 50 | print('Got acknowledgement.') 51 | else: 52 | print('Did not receive acknowledgement!') 53 | 54 | sleep(period) 55 | t = t + period 56 | -------------------------------------------------------------------------------- /advanced/commands/command_settings_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | 5 | lookup = hebi.Lookup() 6 | group = lookup.get_group_from_names(['X5-4'], ['X5-0000']) 7 | 8 | if group is None: 9 | print('Group not found: Did you forget to set the module family and names above?') 10 | exit(1) 11 | 12 | command = hebi.GroupCommand(group.size) 13 | 14 | # Set the name for this module, based on its index within the group. 15 | # (Note - we do not save this value, so upon module reset this will be cleared) 16 | command.name = [str(entry) for entry in range(0, group.size)] 17 | 18 | if group.send_command_with_acknowledgement(command, 100): 19 | print('Got acknowledgement.') 20 | else: 21 | print('Did not receive acknowledgement!') 22 | -------------------------------------------------------------------------------- /advanced/demos/MAPS_control/README: -------------------------------------------------------------------------------- 1 | Code for controlling a non-standard HEBI arm configuration using MAPS as an input device. 2 | 3 | For an example of this behavior, see https://www.youtube.com/watch?v=UFk4PbyBYsw 4 | 5 | 6 | -------------------------------------------------------------------------------- /advanced/demos/MAPS_control/gains/gripper_spool_gains.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | 5 | 15 6 | 0 7 | 0 8 | 0 9 | 0 10 | 1 11 | 0 12 | -inf 13 | inf 14 | 1 15 | -20 16 | 20 17 | 1 18 | 1 19 | 20 | 21 | 0.05 22 | 0 23 | 0 24 | 1 25 | 0 26 | 0.25 27 | 0 28 | -1.502675 29 | 1.502675 30 | 1 31 | -1 32 | 1 33 | 0.75 34 | 1 35 | 36 | 37 | 0.25 38 | 0 39 | 0.001 40 | 1 41 | 0 42 | 0.25 43 | 0 44 | -20 45 | 20 46 | 1 47 | -1 48 | 1 49 | 0.9 50 | 0 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /advanced/demos/MAPS_control/gains/mirror_shoulder.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | 5 | 50 6 | 0 7 | 0 8 | 0 9 | 0 10 | 1 11 | 0 12 | -inf 13 | inf 14 | 1 15 | -40 16 | 40 17 | 1 18 | 1 19 | 20 | 21 | 0.1 22 | 0 23 | 0 24 | 1 25 | 0 26 | 0.25 27 | 0 28 | -1.790422 29 | 1.790422 30 | 1 31 | -1 32 | 1 33 | 0.5 34 | 1 35 | 36 | 37 | 0.3 38 | 0 39 | 0.0001 40 | 1 41 | 0 42 | 0.25 43 | 0 44 | -40 45 | 40 46 | 1 47 | -1 48 | 1 49 | 0.5 50 | 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /advanced/demos/MAPS_control/hrdf/7DoF_arm.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /advanced/demos/MAPS_control/hrdf/A-2303-01.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /advanced/demos/MAPS_control/hrdf/A-2303-06.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /advanced/demos/master_slave_async_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | sleep(2) 8 | 9 | master = lookup.get_group_from_names(['HEBI'], ['master']) 10 | slave = lookup.get_group_from_names(['HEBI'], ['slave']) 11 | 12 | if master is None: 13 | print('Master group not found: Did you forget to set the module family and names above?') 14 | exit(1) 15 | elif slave is None: 16 | print('Slave group not found: Did you forget to set the module family and names above?') 17 | exit(1) 18 | elif master.size != slave.size: 19 | print('Groups must be same size for master/slave control') 20 | exit(1) 21 | 22 | command = hebi.GroupCommand(slave.size) 23 | 24 | 25 | def feedback_handler(group_fbk): 26 | command.position = group_fbk.position 27 | slave.send_command(command) 28 | 29 | 30 | # Start feedback callbacks 31 | master.add_feedback_handler(feedback_handler) 32 | master.feedback_frequency = 200.0 33 | 34 | sleep(20) 35 | 36 | # Stop the async callback before returning and deleting objects. 37 | master.feedback_frequency = 0.0 38 | master.clear_feedback_handlers() 39 | -------------------------------------------------------------------------------- /advanced/demos/sweeping_arm_1.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | # Sweeping arm demo which moves in a direction until it encounters an obstruction (sensed by reading effort feedback) 4 | 5 | import hebi 6 | from time import sleep, time 7 | 8 | 9 | def is_obstructed(group_fbk, thresh, scale): 10 | effort = group_fbk.effort[0] 11 | return scale * effort > thresh 12 | 13 | 14 | lookup = hebi.Lookup() 15 | sleep(2) 16 | 17 | group = lookup.get_group_from_names(['HEBI'], ['X5-1']) 18 | cmd = hebi.GroupCommand(1) 19 | cmd.velocity = 1.5 20 | 21 | group.feedback_frequency = 100.0 22 | 23 | # Used to prevent a module from getting into a situation where noise from oscillating back and forth makes 24 | # the actuator bounce directions continuously 25 | global last_obstruction_time 26 | last_obstruction_time = 0.0 27 | OBSTRUCTION_DEAD_ZONE = 0.075 28 | 29 | 30 | def sweeping_handler(group_fbk): 31 | if is_obstructed(group_fbk, 0.8, cmd.velocity): 32 | now_time = time() 33 | 34 | global last_obstruction_time 35 | # To limit thrashing, only change directions outside of the deadzone period 36 | if (now_time - last_obstruction_time) > OBSTRUCTION_DEAD_ZONE: 37 | last_obstruction_time = time() 38 | cmd.velocity = -cmd.velocity 39 | 40 | # TODO: check if obstruction is detected 41 | group.send_command(cmd) 42 | 43 | 44 | group.add_feedback_handler(sweeping_handler) 45 | 46 | # Runs for a minute 47 | sleep(60.0) 48 | -------------------------------------------------------------------------------- /advanced/feedback/io_feedback_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | sleep(2) 8 | 9 | group = lookup.get_group_from_names(['HEBI'], ['IO_BOARD']) 10 | 11 | if group is None: 12 | print('Group not found: Did you forget to set the module family and names above?') 13 | exit(1) 14 | 15 | 16 | def print_bank(pin_bank, bank_label): 17 | for i in range(0, 8): 18 | pin = i + 1 19 | if (pin_bank.has_float(pin)): 20 | print('Pin {0} {1} float data: {2}'.format(bank_label, pin, pin_bank.get_float(pin))) 21 | if (pin_bank.has_int(pin)): 22 | print('Pin {0} {1} int data: {2}'.format(bank_label, pin, pin_bank.get_int(pin))) 23 | 24 | 25 | def feedback_handler(group_fbk): 26 | # Container to the IO feedback 27 | io = group_fbk.io 28 | print_bank(io.a, 'a') 29 | print_bank(io.b, 'b') 30 | print_bank(io.c, 'c') 31 | print_bank(io.d, 'd') 32 | print_bank(io.e, 'e') 33 | print_bank(io.f, 'f') 34 | 35 | 36 | group.add_feedback_handler(feedback_handler) 37 | group.feedback_frequency = 4.0 38 | 39 | # Wait 10 seconds 40 | sleep(10) 41 | 42 | group.feedback_frequency = 0.0 43 | group.clear_feedback_handlers() 44 | -------------------------------------------------------------------------------- /basic/01a_lookup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate, and then print out its contents 9 | sleep(2.0) 10 | 11 | for entry in lookup.entrylist: 12 | print(entry) 13 | 14 | print('NOTE:') 15 | print(' The listing above should show the information for all the modules') 16 | print(' on the local network. If this is empty make sure that the modules') 17 | print(' are connected, powered on, and that the status LEDs are displaying') 18 | print(' a green soft-fade.') 19 | -------------------------------------------------------------------------------- /basic/01b_get_group_single_module.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate 9 | sleep(2.0) 10 | 11 | family_name = "Test Family" 12 | module_name = "Test Actuator" 13 | 14 | group = lookup.get_group_from_names([family_name], [module_name]) 15 | 16 | if group is None: 17 | print('Group not found: Did you forget to set the module family and name above?') 18 | exit(1) 19 | 20 | print('Created group from module {0} | {1}.'.format(family_name, module_name)) 21 | -------------------------------------------------------------------------------- /basic/01c_get_group_multiple_modules.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate 9 | sleep(2.0) 10 | 11 | family_name = "Test Family" 12 | module_names = ["J3_elbow", "J2_shoulder", "J1_base"] 13 | 14 | group = lookup.get_group_from_names([family_name], module_names) 15 | 16 | if group is None: 17 | print('Group not found: Did you forget to set the module family and name above?') 18 | exit(1) 19 | 20 | print('Found group on network with {0} modules.'.format(group.size)) 21 | -------------------------------------------------------------------------------- /basic/02a_feedback.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep, time 5 | from matplotlib import pyplot as plt 6 | 7 | lookup = hebi.Lookup() 8 | 9 | # Wait 2 seconds for the module list to populate 10 | sleep(2.0) 11 | 12 | family_name = "Test Family" 13 | module_name = "Test Actuator" 14 | 15 | group = lookup.get_group_from_names([family_name], [module_name]) 16 | 17 | if group is None: 18 | print('Group not found: Did you forget to set the module family and name above?') 19 | exit(1) 20 | 21 | group.feedback_frequency = 50.0 22 | 23 | group_feedback = hebi.GroupFeedback(group.size) 24 | 25 | plt.ion() 26 | f = plt.figure() 27 | plt.title('Actuator Gyro Feedback') 28 | plt.xlabel('Axis') 29 | plt.ylabel('Angular Velocity (rad/sec)') 30 | plt.ylim([-15, 15]) 31 | plt.grid(True) 32 | # Start with 0 data first 33 | plt.bar([0, 1, 2], [0, 0, 0]) 34 | plt.draw() 35 | 36 | duration = 10.0 37 | start_time = time() 38 | end_time = start_time + duration 39 | current_time = start_time 40 | 41 | while current_time < end_time: 42 | if group.get_next_feedback(reuse_fbk=group_feedback) is None: 43 | print('Failed to get feedback') 44 | continue 45 | gyro = group_feedback.gyro[0] 46 | plt.bar([0, 1, 2], gyro) 47 | plt.pause(0.00001) 48 | 49 | current_time = time() 50 | -------------------------------------------------------------------------------- /basic/02b_feedback_w_logging.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep, time 5 | from matplotlib import pyplot as plt 6 | 7 | lookup = hebi.Lookup() 8 | 9 | # Wait 2 seconds for the module list to populate 10 | sleep(2.0) 11 | 12 | family_name = "Test Family" 13 | module_name = "Test Actuator" 14 | 15 | group = lookup.get_group_from_names([family_name], [module_name]) 16 | 17 | if group is None: 18 | print('Group not found: Did you forget to set the module family and name above?') 19 | exit(1) 20 | 21 | # Live Visualization 22 | # Starts logging in the background. Note that logging can be enabled at any time, and that it does not negatively 23 | # affect the performance of your running programs. 24 | group.start_log('dir', 'logs', mkdirs=True) 25 | 26 | print('Use Scope to command the module and make it move...') 27 | plt.ion() 28 | f = plt.figure() 29 | plt.ylim([-5, 5]) 30 | plt.title('Module Output Velocity') 31 | plt.ylabel('Angular Velocity (rad/sec)') 32 | plt.grid(True) 33 | 34 | duration = 10.0 35 | start_time = time() 36 | end_time = start_time + duration 37 | current_time = start_time 38 | 39 | while current_time < end_time: 40 | current_time = time() 41 | fbk = group.get_next_feedback() 42 | plt.bar(current_time, fbk.velocity) 43 | plt.pause(0.00001) 44 | 45 | print('All done!') 46 | 47 | # Stops background logging and converts the logged data into readable data that can be easily plotted. 48 | log = group.stop_log() 49 | 50 | # Offline Visualization 51 | if log is not None: 52 | # Plot the logged position feedback 53 | hebi.util.plot_logs(log, 'position', figure_spec=101) 54 | # Plot the logged velocity feedback 55 | hebi.util.plot_logs(log, 'velocity', figure_spec=102) 56 | -------------------------------------------------------------------------------- /basic/02c_feedback_loading_log.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | 5 | folder = './logs/' 6 | name = 'exampleLog.hebilog' 7 | 8 | log = hebi.util.load_log('{}/{}'.format(folder, name)) 9 | 10 | # Plot using some handy helper functions 11 | hebi.util.plot_logs(log, 'position', figure_spec=101) 12 | hebi.util.plot_logs(log, 'velocity', figure_spec=102) 13 | hebi.util.plot_logs(log, 'effort', figure_spec=103) 14 | -------------------------------------------------------------------------------- /basic/02d_feedback_background.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | from matplotlib import pyplot as plt 6 | 7 | lookup = hebi.Lookup() 8 | 9 | # Wait 2 seconds for the module list to populate 10 | sleep(2.0) 11 | 12 | family_name = "Test Family" 13 | module_name = "Test Actuator" 14 | 15 | group = lookup.get_group_from_names([family_name], [module_name]) 16 | 17 | if group is None: 18 | print('Group not found: Did you forget to set the module family and name above?') 19 | exit(1) 20 | 21 | # This is by default 100 Hz. Setting this to 5 Hz allows the console output to be reasonable. 22 | group.feedback_frequency = 5.0 23 | 24 | plt.ion() 25 | f = plt.figure() 26 | plt.title('Actuator Gyro Feedback') 27 | plt.xlabel('Axis') 28 | plt.ylabel('Angular Velocity (rad/sec)') 29 | plt.ylim([-15, 15]) 30 | plt.grid(True) 31 | # Start with 0 data first 32 | plt.bar([0, 1, 2], [0, 0, 0]) 33 | plt.draw() 34 | 35 | 36 | def feedback_handler(group_feedback): 37 | gyro = group_feedback.gyro[0] 38 | plt.bar([0, 1, 2], gyro) 39 | plt.pause(0.00001) 40 | 41 | 42 | group.add_feedback_handler(feedback_handler) 43 | 44 | # Wait for 10 seconds 45 | sleep(10.0) 46 | -------------------------------------------------------------------------------- /basic/03a_command_position.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from math import pi, sin 5 | from time import sleep, time 6 | 7 | lookup = hebi.Lookup() 8 | 9 | # Wait 2 seconds for the module list to populate 10 | sleep(2.0) 11 | 12 | family_name = "Test Family" 13 | module_name = "Test Actuator" 14 | 15 | group = lookup.get_group_from_names([family_name], [module_name]) 16 | 17 | if group is None: 18 | print('Group not found: Did you forget to set the module family and name above?') 19 | exit(1) 20 | 21 | group_command = hebi.GroupCommand(group.size) 22 | group_feedback = hebi.GroupFeedback(group.size) 23 | 24 | # Start logging in the background 25 | group.start_log('logs', mkdirs=True) 26 | 27 | freq_hz = 0.5 # [Hz] 28 | freq = freq_hz * 2.0 * pi # [rad / sec] 29 | amp = pi * 0.25 # [rad] (45 degrees) 30 | 31 | duration = 4 # [sec] 32 | start = time() 33 | t = time() - start 34 | 35 | while t < duration: 36 | # Even though we don't use the feedback, getting feedback conveniently 37 | # limits the loop rate to the feedback frequency 38 | group.get_next_feedback(reuse_fbk=group_feedback) 39 | t = time() - start 40 | 41 | group_command.position = amp * sin(freq * t) 42 | group.send_command(group_command) 43 | 44 | # Stop logging. `log_file` contains the contents of the file 45 | log_file = group.stop_log() 46 | 47 | if log_file is not None: 48 | hebi.util.plot_logs(log_file, 'position') 49 | -------------------------------------------------------------------------------- /basic/03b_command_velocity.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from math import pi, sin 5 | from time import sleep, time 6 | 7 | lookup = hebi.Lookup() 8 | 9 | # Wait 2 seconds for the module list to populate 10 | sleep(2.0) 11 | 12 | family_name = "Test Family" 13 | module_name = "Test Actuator" 14 | 15 | group = lookup.get_group_from_names([family_name], [module_name]) 16 | 17 | if group is None: 18 | print('Group not found: Did you forget to set the module family and name above?') 19 | exit(1) 20 | 21 | group_command = hebi.GroupCommand(group.size) 22 | group_feedback = hebi.GroupFeedback(group.size) 23 | 24 | # Start logging in the background 25 | group.start_log('logs', mkdirs=True) 26 | 27 | freq_hz = 0.5 # [Hz] 28 | freq = freq_hz * 2.0 * pi # [rad / sec] 29 | amp = 1.0 # [rad] 30 | 31 | duration = 4 # [sec] 32 | start = time() 33 | t = time() - start 34 | 35 | while t < duration: 36 | # Even though we don't use the feedback, getting feedback conveniently 37 | # limits the loop rate to the feedback frequency 38 | group.get_next_feedback(reuse_fbk=group_feedback) 39 | t = time() - start 40 | 41 | group_command.velocity = amp * sin(freq * t) 42 | group.send_command(group_command) 43 | 44 | # Stop logging. `log_file` contains the contents of the file 45 | log_file = group.stop_log() 46 | 47 | if log_file is not None: 48 | hebi.util.plot_logs(log_file, 'velocity') 49 | -------------------------------------------------------------------------------- /basic/03c_command_effort.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from math import pi, sin 5 | from time import sleep, time 6 | 7 | lookup = hebi.Lookup() 8 | 9 | # Wait 2 seconds for the module list to populate 10 | sleep(2.0) 11 | 12 | family_name = "Test Family" 13 | module_name = "Test Actuator" 14 | 15 | group = lookup.get_group_from_names([family_name], [module_name]) 16 | 17 | if group is None: 18 | print('Group not found: Did you forget to set the module family and name above?') 19 | exit(1) 20 | 21 | group_command = hebi.GroupCommand(group.size) 22 | group_feedback = hebi.GroupFeedback(group.size) 23 | 24 | # Start logging in the background 25 | group.start_log('logs', mkdirs=True) 26 | 27 | freq_hz = 0.5 # [Hz] 28 | freq = freq_hz * 2.0 * pi # [rad / sec] 29 | amp = 1.0 # [rad] 30 | 31 | duration = 10.0 # [sec] 32 | start = time() 33 | t = time() - start 34 | 35 | while t < duration: 36 | # Even though we don't use the feedback, getting feedback conveniently 37 | # limits the loop rate to the feedback frequency 38 | group.get_next_feedback(reuse_fbk=group_feedback) 39 | t = time() - start 40 | 41 | group_command.effort = amp * sin(freq * t) 42 | group.send_command(group_command) 43 | 44 | # Stop logging. `log_file` contains the contents of the file 45 | log_file = group.stop_log() 46 | 47 | if log_file is not None: 48 | hebi.util.plot_logs(log_file, 'effort') 49 | -------------------------------------------------------------------------------- /basic/03d_command_pos_vel.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from math import cos, pi, sin 5 | from time import sleep, time 6 | from matplotlib import pyplot as plt 7 | 8 | lookup = hebi.Lookup() 9 | 10 | # Wait 2 seconds for the module list to populate 11 | sleep(2.0) 12 | 13 | family_name = "Test Family" 14 | module_name = "Test Actuator" 15 | 16 | group = lookup.get_group_from_names([family_name], [module_name]) 17 | 18 | if group is None: 19 | print('Group not found: Did you forget to set the module family and name above?') 20 | exit(1) 21 | 22 | group_command = hebi.GroupCommand(group.size) 23 | group_feedback = hebi.GroupFeedback(group.size) 24 | 25 | # Start logging in the background 26 | group.start_log('logs', mkdirs=True) 27 | 28 | freq_hz = 0.5 # [Hz] 29 | freq = freq_hz * 2.0 * pi # [rad / sec] 30 | amp = pi * 0.25 # [rad] (45 degrees) 31 | 32 | duration = 4 # [sec] 33 | start = time() 34 | t = time() - start 35 | 36 | while t < duration: 37 | # Even though we don't use the feedback, getting feedback conveniently 38 | # limits the loop rate to the feedback frequency 39 | group.get_next_feedback(reuse_fbk=group_feedback) 40 | t = time() - start 41 | 42 | # Position command 43 | group_command.position = amp * sin(freq * t) 44 | # Velocity command (time derivative of position) 45 | group_command.velocity = freq * amp * cos(freq * t) 46 | group.send_command(group_command) 47 | 48 | # Stop logging. `log_file` contains the contents of the file 49 | log_file = group.stop_log() 50 | 51 | if log_file is not None: 52 | hebi.util.plot_logs(log_file, 'position') 53 | hebi.util.plot_logs(log_file, 'velocity') 54 | -------------------------------------------------------------------------------- /basic/03e_command_pos_vel_effort.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from math import cos, pi, sin 5 | from time import sleep, time 6 | from matplotlib import pyplot as plt 7 | 8 | lookup = hebi.Lookup() 9 | 10 | # Wait 2 seconds for the module list to populate 11 | sleep(2.0) 12 | 13 | family_name = "Test Family" 14 | module_name = "Test Actuator" 15 | 16 | group = lookup.get_group_from_names([family_name], [module_name]) 17 | 18 | if group is None: 19 | print('Group not found: Did you forget to set the module family and name above?') 20 | exit(1) 21 | 22 | group_command = hebi.GroupCommand(group.size) 23 | group_feedback = hebi.GroupFeedback(group.size) 24 | 25 | # Start logging in the background 26 | group.start_log('logs', mkdirs=True) 27 | 28 | freq_hz = 0.5 # [Hz] 29 | freq = freq_hz * 2.0 * pi # [rad / sec] 30 | amp = pi * 0.25 # [rad] (45 degrees) 31 | 32 | # Inertia parameters for converting acceleration to torque. This inertia value corresponds 33 | # to roughly a 300mm X5 link extending off the output. 34 | inertia = 0.01 # [kg * m^2] 35 | 36 | duration = 4 # [sec] 37 | start = time() 38 | t = time() - start 39 | 40 | while t < duration: 41 | # Even though we don't use the feedback, getting feedback conveniently 42 | # limits the loop rate to the feedback frequency 43 | group.get_next_feedback(reuse_fbk=group_feedback) 44 | t = time() - start 45 | 46 | # Position command 47 | group_command.position = amp * sin(freq * t) 48 | # Velocity command (time derivative of position) 49 | group_command.velocity = freq * amp * cos(freq * t) 50 | # Acceleration command (time derivative of velocity) 51 | accel = -freq * freq * amp * sin(freq * t) 52 | # Convert to torque 53 | group_command.effort = accel * inertia 54 | group.send_command(group_command) 55 | 56 | # Stop logging. `log_file` contains the contents of the file 57 | log_file = group.stop_log() 58 | 59 | if log_file is not None: 60 | hebi.util.plot_logs(log_file, 'position', figure_spec=101) 61 | hebi.util.plot_logs(log_file, 'velocity', figure_spec=102) 62 | hebi.util.plot_logs(log_file, 'effort', figure_spec=103) 63 | -------------------------------------------------------------------------------- /basic/03f_command_vel_w_feedback.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep, time 5 | from matplotlib import pyplot as plt 6 | 7 | lookup = hebi.Lookup() 8 | 9 | # Wait 2 seconds for the module list to populate 10 | sleep(2.0) 11 | 12 | family_name = "Test Family" 13 | module_name = "Test Actuator" 14 | 15 | group = lookup.get_group_from_names([family_name], [module_name]) 16 | 17 | if group is None: 18 | print('Group not found: Did you forget to set the module family and name above?') 19 | exit(1) 20 | 21 | group_command = hebi.GroupCommand(group.size) 22 | group_feedback = hebi.GroupFeedback(group.size) 23 | 24 | # Start logging in the background 25 | group.start_log('logs', mkdirs=True) 26 | 27 | print(' Move the module to make the output move...') 28 | 29 | duration = 4 # [sec] 30 | start = time() 31 | t = time() - start 32 | 33 | while t < duration: 34 | # Even though we don't use the feedback, getting feedback conveniently 35 | # limits the loop rate to the feedback frequency 36 | group.get_next_feedback(reuse_fbk=group_feedback) 37 | t = time() - start 38 | 39 | # Command a velocity that counters the measured angular velocity around the z-axis (same axis as the output) 40 | group_command.velocity = group_feedback.gyro[:, 2] 41 | group.send_command(group_command) 42 | 43 | # Stop logging. `log_file` contains the contents of the file 44 | log_file = group.stop_log() 45 | 46 | if log_file is not None: 47 | hebi.util.plot_logs(log_file, 'velocity', figure_spec=101) 48 | hebi.util.plot_logs(log_file, 'gyro', figure_spec=102) 49 | -------------------------------------------------------------------------------- /basic/04b_gains_saving_xml.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate 9 | sleep(2.0) 10 | 11 | family_name = "Test Family" 12 | module_name = "Test Actuator" 13 | 14 | group = lookup.get_group_from_names([family_name], [module_name]) 15 | 16 | if group is None: 17 | print('Group not found: Did you forget to set the module family and name above?') 18 | exit(1) 19 | 20 | # Get the gains that are currently active on the actuator and save them 21 | group_info = group.request_info() 22 | if group_info is None: 23 | print('Did not receive gains from the module.') 24 | 25 | # Save gains to a file. If this doesn't succeed, it probably indicates the directory doesn't exist. 26 | try: 27 | group_info.write_gains('gains/my_actuator_gains.xml') 28 | print('Successfully read gains from module and wrote to file.') 29 | except Exception as e: 30 | print('Could not write gains to file.') 31 | -------------------------------------------------------------------------------- /basic/04c_gains_loading_xml.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate 9 | sleep(2.0) 10 | 11 | family_name = "Test Family" 12 | module_name = "Test Actuator" 13 | 14 | group = lookup.get_group_from_names([family_name], [module_name]) 15 | 16 | if group is None: 17 | print('Group not found: Did you forget to set the module family and name above?') 18 | exit(1) 19 | 20 | group_command = hebi.GroupCommand(group.size) 21 | try: 22 | group_command.read_gains('gains/example_gains.xml') 23 | if not group.send_command_with_acknowledgement(group_command): 24 | raise RuntimeError('Did not receive ack from group.') 25 | print('Successfully read gains from file and sent to module.') 26 | except Exception as e: 27 | print('Problem reading gains from file or sending to module: {0}'.format(e)) 28 | -------------------------------------------------------------------------------- /basic/05_trajectory.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from math import pi 5 | from time import sleep, time 6 | import numpy as np 7 | 8 | lookup = hebi.Lookup() 9 | 10 | # Wait 2 seconds for the module list to populate 11 | sleep(2.0) 12 | 13 | family_name = "Test Family" 14 | module_name = "Test Actuator" 15 | 16 | group = lookup.get_group_from_names([family_name], [module_name]) 17 | 18 | if group is None: 19 | print('Group not found: Did you forget to set the module family and name above?') 20 | exit(1) 21 | 22 | num_joints = group.size 23 | group_feedback = hebi.GroupFeedback(num_joints) 24 | 25 | if group.get_next_feedback(reuse_fbk=group_feedback) is None: 26 | print('Error getting feedback.') 27 | exit(1) 28 | 29 | positions = np.zeros((num_joints, 3), dtype=np.float64) 30 | offset = [pi] * num_joints 31 | current_pos = group_feedback.position 32 | 33 | positions[:, 0] = current_pos 34 | positions[:, 1] = current_pos + pi 35 | positions[:, 2] = current_pos 36 | 37 | time_vector = [0, 3, 6] 38 | 39 | trajectory = hebi.trajectory.create_trajectory(time_vector, positions) 40 | 41 | # Start logging in the background 42 | group.start_log('logs', mkdirs=True) 43 | 44 | group_command = hebi.GroupCommand(num_joints) 45 | duration = trajectory.duration 46 | 47 | start = time() 48 | t = time() - start 49 | 50 | while t < duration: 51 | # Serves to rate limit the loop without calling sleep 52 | group.get_next_feedback(reuse_fbk=group_feedback) 53 | t = time() - start 54 | 55 | pos, vel, acc = trajectory.get_state(t) 56 | group_command.position = pos 57 | group_command.velocity = vel 58 | group.send_command(group_command) 59 | 60 | group.stop_log() 61 | -------------------------------------------------------------------------------- /basic/06a_kinematics_setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from math import pi 5 | 6 | # Method 1: Load the kinematics from an HRDF file 7 | try: 8 | model_from_hrdf = hebi.robot_model.import_from_hrdf("hrdf/A-2085-03.hrdf") 9 | except: 10 | print("Could not load HRDF.") 11 | exit(1) 12 | 13 | print('Robot model loaded from HRDF has {0} degrees of freedom.'.format(model_from_hrdf.dof_count)) 14 | 15 | model_from_code = hebi.robot_model.RobotModel() 16 | model_from_code.add_actuator('X5-9') 17 | model_from_code.add_bracket('X5-HeavyBracket', 'left-outside') 18 | model_from_code.add_actuator('X5-9') 19 | model_from_code.add_link('X5', 0.325, pi) 20 | model_from_code.add_actuator('X5-4') 21 | model_from_code.add_link('X5', 0.325, 0.0) 22 | 23 | # Method 2: Create a simple kinematic description of the arm in code 24 | print('Robot model generated in code has {0} degrees of freedom.'.format(model_from_code.dof_count)) 25 | -------------------------------------------------------------------------------- /basic/06b_kinematics_fwd_kinematics.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate 9 | sleep(2.0) 10 | 11 | family_name = "Test Family" 12 | module_names = ["J1_base", "J2_shoulder", "J3_elbow"] 13 | 14 | group = lookup.get_group_from_names([family_name], module_names) 15 | 16 | if group is None: 17 | print('Group not found: Did you forget to set the module family and name above?') 18 | exit(1) 19 | 20 | try: 21 | model = hebi.robot_model.import_from_hrdf("hrdf/A-2085-03.hrdf") 22 | except: 23 | print("Could not load HRDF.") 24 | exit(1) 25 | 26 | 27 | def feedback_handler(group_fbk): 28 | angles = group_fbk.position 29 | transform = model.get_end_effector(angles) 30 | print('x,y,z: {0}, {1}, {2}'.format(transform[0, 3], transform[1, 3], transform[2, 3])) 31 | 32 | 33 | group.add_feedback_handler(feedback_handler) 34 | group.feedback_frequency = 10.0 # Prevent printing to the screen too much 35 | 36 | # Control the robot at 10 Hz for 30 seconds 37 | sleep(30) 38 | -------------------------------------------------------------------------------- /basic/gains/A-2085-03.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 4 4 | 5 | 15 30 10 6 | 0 0 0 7 | 0 0 0 8 | 0 0 0 9 | 0 0 0 10 | 1 1 1 11 | 0 0 0 12 | -inf -inf -inf 13 | inf inf inf 14 | 1 1 1 15 | -20 -20 -10 16 | 20 20 10 17 | 1 1 1 18 | 1 1 1 19 | 20 | 21 | 0.05 0.05 0.05 22 | 0 0 0 23 | 0 0 0 24 | 1 1 1 25 | 0 0 0 26 | 0.25 0.25 0.25 27 | 0 0 0 28 | -1.502675 -1.502675 -3.434687 29 | 1.502675 1.502675 3.434687 30 | 1 1 1 31 | -1 -1 -1 32 | 1 1 1 33 | 0.75 0.75 0.75 34 | 1 1 1 35 | 36 | 37 | 0.25 0.25 0.25 38 | 0 0 0 39 | 0.001 0.001 0.001 40 | 1 1 1 41 | 0 0 0 42 | 0.25 0.25 0.25 43 | 0 0 0 44 | -20 -20 -10 45 | 20 20 10 46 | 1 1 1 47 | -1 -1 -1 48 | 1 1 1 49 | 0.9 0.9 0.9 50 | 0 0 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /basic/gains/A-2085-06.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 4 4 4 4 4 | 5 | 50 75 30 10 5 5 6 | 0 0 0 0 0 0 7 | 0 0 0 0 0 0 8 | 0 0 0 0 0 0 9 | 0 0 0 0 0 0 10 | 1 1 1 1 1 1 11 | 0 0 0 0 0 0 12 | -inf -inf -inf -inf -inf -inf 13 | inf inf inf inf inf inf 14 | 1 1 1 1 1 1 15 | -25 -40 -25 -5 -5 -5 16 | 25 40 25 5 5 5 17 | 1 1 1 1 1 1 18 | 1 1 1 1 1 1 19 | 20 | 21 | 0.03 0.03 0.03 0.05 0.05 0.05 22 | 0 0 0 0 0 0 23 | 0 0 0 0 0 0 24 | 1 1 1 1 1 1 25 | 0 0 0 0 0 0 26 | 0.25 0.25 0.25 0.25 0.25 0.25 27 | 0 0 0 0 0 0 28 | -3.434687 -1.790422 -3.434687 -9.617128 -9.617128 -9.617128 29 | 3.434687 1.790422 3.434687 9.617128 9.617128 9.617128 30 | 1 1 1 1 1 1 31 | -1 -1 -1 -1 -1 -1 32 | 1 1 1 1 1 1 33 | 0.75 0.75 0.75 0.75 0.75 0.75 34 | 1 1 1 1 1 1 35 | 36 | 37 | 0.1 0.1 0.1 0.25 0.25 0.25 38 | 0 0 0 0 0 0 39 | 0.0001 0.0001 0.0001 0.001 0.001 0.001 40 | 1 1 1 1 1 1 41 | 0.1 0.1 0.1 0.05 0.05 0.05 42 | 0.25 0.25 0.25 0.25 0.25 0.25 43 | 0 0 0 0 0 0 44 | -25 -40 -25 -5 -5 -5 45 | 25 40 25 5 5 5 46 | 1 1 1 1 1 1 47 | -1 -1 -1 -1 -1 -1 48 | 1 1 1 1 1 1 49 | 0.9 0.9 0.9 0.9 0.9 0.9 50 | 0 0 0 0 0 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /basic/gains/example_gains.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 3 4 | 5 | 0.5 6 | 0 7 | 0 8 | 0 9 | 0 10 | 0.25 11 | 0 12 | -inf 13 | inf 14 | 1 15 | -1 16 | 1 17 | 1 18 | 1 19 | 20 | 21 | 0.05 22 | 0 23 | 0 24 | 1 25 | 0 26 | 0.25 27 | 0 28 | -9.617128 29 | 9.617128 30 | 1 31 | -1 32 | 1 33 | 0.75 34 | 1 35 | 36 | 37 | 0.25 38 | 0 39 | 0.001 40 | 1 41 | 0 42 | 0.25 43 | -0 44 | -4 45 | 4 46 | 1 47 | -1 48 | 1 49 | 0.9 50 | 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /basic/hrdf/A-2085-03.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /basic/hrdf/A-2085-06.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /basic/io_board/1a_lookup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate, and then print out its contents 9 | sleep(2.0) 10 | 11 | for entry in lookup.entrylist: 12 | print(entry) 13 | 14 | print('NOTE:') 15 | print(' The listing above should show the information for all the modules') 16 | print(' on the local network. If this is empty make sure that the modules') 17 | print(' are connected, powered on, and that the status LEDs are displaying') 18 | print(' a green soft-fade.') 19 | -------------------------------------------------------------------------------- /basic/io_board/1b_newGroup_single_module.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate 9 | sleep(2.0) 10 | 11 | family_name = "HEBI" 12 | module_name = "IO Board" 13 | 14 | group = lookup.get_group_from_names([family_name], [module_name]) 15 | 16 | if group is None: 17 | print('Group not found: Did you forget to set the module family and name above?') 18 | exit(1) 19 | 20 | print('Created group from module {0} | {1}.'.format(family_name, module_name)) 21 | -------------------------------------------------------------------------------- /basic/io_board/1c_newGroup_multiple_modules.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate 9 | sleep(2.0) 10 | 11 | family_name = "HEBI" 12 | module_names = ["IO Board", "mobileIO", "Actuator 1"] 13 | 14 | group = lookup.get_group_from_names([family_name], module_names) 15 | 16 | if group is None: 17 | print('Group not found: Did you forget to set the module family and name above?') 18 | exit(1) 19 | 20 | print('Found group on network with {0} modules.'.format(group.size)) 21 | -------------------------------------------------------------------------------- /basic/io_board/2a_feedback.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep, time 5 | from matplotlib import pyplot as plt 6 | 7 | lookup = hebi.Lookup() 8 | 9 | # Wait 2 seconds for the module list to populate 10 | sleep(2.0) 11 | 12 | family_name = "HEBI" 13 | module_name = "IO Board" 14 | 15 | group = lookup.get_group_from_names([family_name], [module_name]) 16 | 17 | if group is None: 18 | print('Group not found: Did you forget to set the module family and name above?') 19 | exit(1) 20 | 21 | group.feedback_frequency = 50.0 22 | 23 | group_feedback = hebi.GroupFeedback(group.size) 24 | 25 | plt.ion() 26 | f = plt.figure() 27 | plt.title('IO Board Gyro Feedback') 28 | plt.xlabel('Axis') 29 | plt.ylabel('Angular Velocity (rad/sec)') 30 | plt.ylim([-15, 15]) 31 | plt.grid(True) 32 | # Start with 0 data first 33 | plt.bar([0, 1, 2], [0, 0, 0]) 34 | plt.draw() 35 | 36 | duration = 10.0 37 | start_time = time() 38 | end_time = start_time + duration 39 | current_time = start_time 40 | 41 | while current_time < end_time: 42 | if group.get_next_feedback(reuse_fbk=group_feedback) is None: 43 | print('Failed to get feedback') 44 | continue 45 | gyro = group_feedback.gyro[0] 46 | plt.bar([0, 1, 2], gyro) 47 | plt.pause(0.00001) 48 | 49 | current_time = time() 50 | -------------------------------------------------------------------------------- /basic/mobile_io/1a_lookup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate, and then print out its contents 9 | sleep(2.0) 10 | 11 | for entry in lookup.entrylist: 12 | print(entry) 13 | 14 | print('NOTE:') 15 | print(' The listing above should show the information for all the modules') 16 | print(' on the local network. If this is empty make sure that the modules') 17 | print(' are connected, powered on, and that the status LEDs are displaying') 18 | print(' a green soft-fade.') 19 | -------------------------------------------------------------------------------- /basic/mobile_io/1b_newGroup_single_module.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate 9 | sleep(2.0) 10 | 11 | family_name = "HEBI" 12 | module_name = "mobileIO" 13 | 14 | group = lookup.get_group_from_names([family_name], [module_name]) 15 | 16 | if group is None: 17 | print('Group not found: Did you forget to set the module family and name above?') 18 | exit(1) 19 | 20 | print('Created group from module {0} | {1}.'.format(family_name, module_name)) 21 | -------------------------------------------------------------------------------- /basic/mobile_io/1c_newGroup_multiple_modules.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep 5 | 6 | lookup = hebi.Lookup() 7 | 8 | # Wait 2 seconds for the module list to populate 9 | sleep(2.0) 10 | 11 | family_name = "HEBI" 12 | module_names = ["mobileIO", "Actuator 1"] 13 | 14 | group = lookup.get_group_from_names([family_name], module_names) 15 | 16 | if group is None: 17 | print('Group not found! Check that the names and families given in the source file') 18 | print('match modules available on the network.') 19 | exit(1) 20 | 21 | print('Found group on network with {0} modules.'.format(group.size)) 22 | -------------------------------------------------------------------------------- /basic/mobile_io/2a_feedback.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep, time 5 | from matplotlib import pyplot as plt 6 | 7 | lookup = hebi.Lookup() 8 | 9 | # Wait 2 seconds for the module list to populate 10 | sleep(2.0) 11 | 12 | family_name = "HEBI" 13 | module_name = "mobileIO" 14 | 15 | group = lookup.get_group_from_names([family_name], [module_name]) 16 | 17 | if group is None: 18 | print('Group not found: Did you forget to set the module family and name above?') 19 | exit(1) 20 | 21 | group.feedback_frequency = 50.0 22 | 23 | group_feedback = hebi.GroupFeedback(group.size) 24 | 25 | plt.ion() 26 | f = plt.figure() 27 | plt.title('Mobile IO Gyro Feedback') 28 | plt.xlabel('Axis') 29 | plt.ylabel('Angular Velocity (rad/sec)') 30 | plt.ylim([-15, 15]) 31 | plt.grid(True) 32 | # Start with 0 data first 33 | plt.bar([0, 1, 2], [0, 0, 0]) 34 | plt.draw() 35 | 36 | duration = 10.0 37 | start_time = time() 38 | end_time = start_time + duration 39 | current_time = start_time 40 | 41 | while current_time < end_time: 42 | if group.get_next_feedback(reuse_fbk=group_feedback) is None: 43 | print('Failed to get feedback') 44 | continue 45 | gyro = group_feedback.gyro[0] 46 | 47 | plt.bar([0, 1, 2], gyro) 48 | plt.pause(0.00001) 49 | 50 | current_time = time() 51 | -------------------------------------------------------------------------------- /basic/mobile_io/2b_feedback_io_w_logging.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | from time import sleep, time 5 | from matplotlib import pyplot as plt 6 | import numpy as np 7 | 8 | lookup = hebi.Lookup() 9 | 10 | # Wait 2 seconds for the module list to populate 11 | sleep(2.0) 12 | 13 | family_name = "HEBI" 14 | module_name = "mobileIO" 15 | 16 | group = lookup.get_group_from_names([family_name], [module_name]) 17 | 18 | if group is None: 19 | print('Group not found: Did you forget to set the module family and name above?') 20 | exit(1) 21 | 22 | # Live Visualization 23 | # Starts logging in the background. Note that logging can be enabled at any time, and that it does not negatively 24 | # affect the performance of your running programs. 25 | group.start_log('dir', 'logs', mkdirs=True) 26 | 27 | print('Drag the Sliders and press some buttons on the app screen!') 28 | x_labels = ("1", "2", "3", "4", "5", "6", "7", "8") 29 | x_ticks = (0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0) 30 | 31 | plt.ion() 32 | f = plt.figure() 33 | plt.ylim([-1, 1]) 34 | plt.xticks(x_ticks, x_labels) 35 | plt.xlabel('Digital Inputs and Analog Inputs') 36 | plt.ylabel('[-1 to 1]') 37 | plt.grid(True) 38 | 39 | duration = 10.0 40 | start_time = time() 41 | end_time = start_time + duration 42 | current_time = start_time 43 | fbk = hebi.GroupFeedback(group.size) 44 | 45 | while current_time < end_time: 46 | current_time = time() 47 | fbk = group.get_next_feedback(reuse_fbk=fbk) 48 | buttons = np.zeros(8) 49 | sliders = np.zeros(8) 50 | for i in range(8): 51 | buttons[i] = fbk.io.b.get_int(i + 1) 52 | for i in range(8): 53 | if fbk.io.a.has_int(i + 1): 54 | sliders[i] = fbk.io.a.get_int(i + 1) 55 | elif fbk.io.a.has_float(i + 1): 56 | sliders[i] = fbk.io.a.get_float(i + 1) 57 | 58 | plt.bar(x_ticks, buttons) 59 | plt.bar(x_ticks, sliders) 60 | plt.pause(0.00001) 61 | 62 | print('All done!') 63 | -------------------------------------------------------------------------------- /kits/arms/config/A-2084-01.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series 4-DoF SCARA Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist"] 5 | hrdf: "hrdf/A-2084-01.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2084-01.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2084-01G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series 4-DoF SCARA Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist"] 5 | hrdf: "hrdf/A-2084-01G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2084-01.xml" 9 | gripper: "gains/A-2080-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | # Kits with a gas spring need to add a shoulder compensation torque. 32 | # It should be around -7 Nm for most kits, but it may need to be tuned 33 | # for your specific setup. 34 | - name: 'gasSpringCompensation' 35 | type: EffortOffset 36 | enabled: false 37 | ramp_time: 5 38 | offset: [0, -7, 0, 0] 39 | -------------------------------------------------------------------------------- /kits/arms/config/A-2085-03.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series 3-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow"] 5 | hrdf: "hrdf/A-2085-03.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-03.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2085-04.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series 4-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist"] 5 | hrdf: "hrdf/A-2085-04.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-04.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2085-05.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series 5-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2"] 5 | hrdf: "hrdf/A-2085-05.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-05.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2085-05G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series 5-DoF Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2"] 5 | hrdf: "hrdf/A-2085-05G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-05.xml" 9 | gripper: "gains/A-2080-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | # Kits with a gas spring need to add a shoulder compensation torque. 32 | # It should be around -7 Nm for most kits, but it may need to be tuned 33 | # for your specific setup. 34 | - name: 'gasSpringCompensation' 35 | type: EffortOffset 36 | enabled: false 37 | ramp_time: 5 38 | offset: [0, -7, 0, 0, 0] 39 | -------------------------------------------------------------------------------- /kits/arms/config/A-2085-06.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5, 0.01] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # An impedance controller adds a virtual spring to the 26 | # end-effector and can improve tracking. It can be enabled 27 | # by setting 'enabled' to true. The gains are in the form of 28 | # [x, y, z, rx, ry, rz]. Setting gains of zero deactivates 29 | # the corresponding degree of translation or rotation. 30 | - type: ImpedanceController 31 | name: impedanceController 32 | enabled: false 33 | ramp_time: 5 34 | gains_in_end_effector_frame: true 35 | kp: [50, 50, 50, 0, 0, 0] # (N/m) or (Nm/rad) 36 | kd: [5, 5, 5, 0, 0, 0] # (N/(m/sec)) or (Nm/(rad/sec)) 37 | ki: [0, 0, 1, 0, 0, 0] 38 | i_clamp: [10, 10, 10, 10, 10, 10] # max value 39 | 40 | # Kits with a gas spring need to add a shoulder compensation torque. 41 | # It should be around -7 Nm for most kits, but it may need to be tuned 42 | # for your specific setup. 43 | - type: EffortOffset 44 | name: gasSpringCompensation 45 | enabled: false # disabled by default as the default configuration ships without one 46 | ramp_time: 5 47 | offset: [0, -7, 0, 0, 0, 0] 48 | -------------------------------------------------------------------------------- /kits/arms/config/A-2085-06G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series 6-DoF Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | gripper: "gains/A-2080-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5, 0.01] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | # An impedance controller adds a virtual spring to the 32 | # end-effector and can improve tracking. It can be enabled 33 | # by setting 'enabled' to true. The gains are in the form of 34 | # [x, y, z, rx, ry, rz]. Setting gains of zero deactivates 35 | # the corresponding degree of translation or rotation. 36 | - type: ImpedanceController 37 | name: impedanceController 38 | enabled: false 39 | ramp_time: 5 40 | gains_in_end_effector_frame: true 41 | kp: [50, 50, 50, 0, 0, 0] # (N/m) or (Nm/rad) 42 | kd: [5, 5, 5, 0, 0, 0] # (N/(m/sec)) or (Nm/(rad/sec)) 43 | ki: [0, 0, 1, 0, 0, 0] 44 | i_clamp: [10, 10, 10, 10, 10, 10] # max value 45 | 46 | # Kits with a gas spring need to add a shoulder compensation torque. 47 | # It should be around -7 Nm for most kits, but it may need to be tuned 48 | # for your specific setup. 49 | - type: EffortOffset 50 | name: gasSpringCompensation 51 | enabled: false # disabled by default as the default configuration ships without one 52 | ramp_time: 5 53 | offset: [0, -7, 0, 0, 0, 0] 54 | -------------------------------------------------------------------------------- /kits/arms/config/A-2099-07.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series 7-DoF Double Shoulder Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", J2A_shoulder1", "J3_shoulder2", "J4_elbow1", "J5_elbow2", "J6_wrist1", "J7_wrist2"] 5 | hrdf: "hrdf/A-2099-07.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2099-07.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, -1, 0, 1.5, 0.01, 0.01, 0.01] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | - name: 'DoubleShoulder' 26 | type: DoubledJointMirror 27 | enabled: true 28 | group_family: ["Arm"] 29 | group_name: [J2B_shoulder1"] 30 | index: 1 31 | -------------------------------------------------------------------------------- /kits/arms/config/A-2099-07G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series 7-DoF Double Shoulder Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", J2A_shoulder1", "J3_shoulder2", "J4_elbow1", "J5_elbow2", "J6_wrist1", "J7_wrist2"] 5 | hrdf: "hrdf/A-2099-07G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2099-01-7.xml" 9 | gripper: "gains/A-2080-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, 1, 0.01, 0.01, -1.5, 0.01, 0.01] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | - name: 'DoubleShoulder' 32 | type: DoubledJointMirror 33 | enabled: true 34 | group_family: ["Arm"] 35 | group_name: [J2B_shoulder1"] 36 | index: 1 37 | -------------------------------------------------------------------------------- /kits/arms/config/A-2240-04.cfg.yaml: -------------------------------------------------------------------------------- 1 | # R-Series 4-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist"] 5 | hrdf: "hrdf/A-2240-04.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2240-04.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2240-05.cfg.yaml: -------------------------------------------------------------------------------- 1 | # R-Series 5-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2"] 5 | hrdf: "hrdf/A-2240-05.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2240-05.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2240-05G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # R-Series 5-DoF Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2"] 5 | hrdf: "hrdf/A-2240-05G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2240-05.xml" 9 | gripper: "gains/A-2255-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | # Kits with a gas spring need to add a shoulder compensation torque. 32 | # It should be around -7 Nm for most kits, but it may need to be tuned 33 | # for your specific setup. 34 | - name: 'gasSpringCompensation' 35 | type: EffortOffset 36 | enabled: false 37 | ramp_time: 5 38 | offset: [0, -7, 0, 0, 0] 39 | -------------------------------------------------------------------------------- /kits/arms/config/A-2240-06.cfg.yaml: -------------------------------------------------------------------------------- 1 | # R-Series 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2240-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2240-06.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5, 0.01] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2240-06G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # R-Series 6-DoF Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2240-06G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2240-06.xml" 9 | gripper: "gains/A-2255-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5, 0.01] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | # Kits with a gas spring need to add a shoulder compensation torque. 32 | # It should be around -7 Nm for most kits, but it may need to be tuned 33 | # for your specific setup. 34 | - name: 'gasSpringCompensation' 35 | type: EffortOffset 36 | enabled: false 37 | ramp_time: 5 38 | offset: [0, -7, 0, 0, 0, 0] 39 | -------------------------------------------------------------------------------- /kits/arms/config/A-2302-01.cfg.yaml: -------------------------------------------------------------------------------- 1 | # R-Series 4-DoF SCARA Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist"] 5 | hrdf: "hrdf/A-2302-01.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2302-01.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2302-01G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # R-Series 4-DoF SCARA Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist"] 5 | hrdf: "hrdf/A-2302-01G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2302-01.xml" 9 | gripper: "gains/A-2255-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | # Kits with a gas spring need to add a shoulder compensation torque. 32 | # It should be around -7 Nm for most kits, but it may need to be tuned 33 | # for your specific setup. 34 | - name: 'gasSpringCompensation' 35 | type: EffortOffset 36 | enabled: false 37 | ramp_time: 5 38 | offset: [0, -7, 0, 0] 39 | -------------------------------------------------------------------------------- /kits/arms/config/A-2303-01.cfg.yaml: -------------------------------------------------------------------------------- 1 | # R-Series 7-DoF Double Shoulder Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", J2A_shoulder1", "J3_shoulder2", "J4_elbow1", "J5_elbow2", "J6_wrist1", "J7_wrist2"] 5 | hrdf: "hrdf/A-2303-01.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2303-01.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, -1, 0.01, 0.01, -1.5, 0.01, 0.01] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | - name: 'DoubleShoulder' 26 | type: DoubledJointMirror 27 | enabled: true 28 | group_family: ["Arm"] 29 | group_name: [J2B_shoulder1"] 30 | index: 1 31 | -------------------------------------------------------------------------------- /kits/arms/config/A-2303-01G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # R-Series 7-DoF Double Shoulder Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", J2A_shoulder1", "J3_shoulder2", "J4_elbow1", "J5_elbow2", "J6_wrist1", "J7_wrist2"] 5 | hrdf: "hrdf/A-2303-01G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2303-01.xml" 9 | gripper: "gains/A-2255-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, -1, 0.01, 0.01, -1.5, 0.01, 0.01] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | - name: 'DoubleShoulder' 32 | type: DoubledJointMirror 33 | enabled: true 34 | group_family: ["Arm"] 35 | group_name: [J2B_shoulder1"] 36 | index: 1 37 | -------------------------------------------------------------------------------- /kits/arms/config/A-2580-04.cfg.yaml: -------------------------------------------------------------------------------- 1 | # T-Series 4-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist"] 5 | hrdf: "hrdf/A-2580-04.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2580-04.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2580-05.cfg.yaml: -------------------------------------------------------------------------------- 1 | # T-Series 5-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2"] 5 | hrdf: "hrdf/A-2580-05.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2580-05.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2580-05G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # T-Series 5-DoF Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2"] 5 | hrdf: "hrdf/A-2580-05G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2580-05.xml" 9 | gripper: "gains/A-2080-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | # Kits with a gas spring need to add a shoulder compensation torque. 32 | # It should be around -7 Nm for most kits, but it may need to be tuned 33 | # for your specific setup. 34 | - name: 'gasSpringCompensation' 35 | type: EffortOffset 36 | enabled: false 37 | ramp_time: 5 38 | offset: [0, -7, 0, 0, 0] 39 | -------------------------------------------------------------------------------- /kits/arms/config/A-2580-06.cfg.yaml: -------------------------------------------------------------------------------- 1 | # T-Series 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2580-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2580-06.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5, 0.01] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2580-06G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # T-Series 6-DoF Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2580-06G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2580-06.xml" 9 | gripper: "gains/A-2080-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5, -1.5, 0.01] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | # Kits with a gas spring need to add a shoulder compensation torque. 32 | # It should be around -7 Nm for most kits, but it may need to be tuned 33 | # for your specific setup. 34 | - name: 'gasSpringCompensation' 35 | type: EffortOffset 36 | enabled: false 37 | ramp_time: 5 38 | offset: [0, -7, 0, 0, 0, 0] 39 | -------------------------------------------------------------------------------- /kits/arms/config/A-2582-07.cfg.yaml: -------------------------------------------------------------------------------- 1 | # T-Series 7-DoF Double Shoulder Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", J2A_shoulder1", "J3_shoulder2", "J4_elbow1", "J5_elbow2", "J6_wrist1", "J7_wrist2"] 5 | hrdf: "hrdf/A-2582-07.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2582-07.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, -1, 0.01, 0.01, -1.5, 0.01, 0.01] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | - name: 'DoubleShoulder' 26 | type: DoubledJointMirror 27 | enabled: true 28 | group_family: ["Arm"] 29 | group_name: [J2B_shoulder1"] 30 | index: 1 31 | -------------------------------------------------------------------------------- /kits/arms/config/A-2582-07G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # T-Series 7-DoF Double Shoulder Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", J2A_shoulder1", "J3_shoulder2", "J4_elbow1", "J5_elbow2", "J6_wrist1", "J7_wrist2"] 5 | hrdf: "hrdf/A-2582-07G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2582-07.xml" 9 | gripper: "gains/A-2080-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, -1, 0.01, 0.01, -1.5, 0.01, 0.01] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | - name: 'DoubleShoulder' 32 | type: DoubledJointMirror 33 | enabled: true 34 | group_family: ["Arm"] 35 | group_name: [J2B_shoulder1"] 36 | index: 1 37 | -------------------------------------------------------------------------------- /kits/arms/config/A-2590-01.cfg.yaml: -------------------------------------------------------------------------------- 1 | # T-Series 4-DoF SCARA Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist"] 5 | hrdf: "hrdf/A-2590-01.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2590-01.xml" 9 | 10 | user_data: 11 | # Default seed positions for doing inverse kinematics 12 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5] 13 | 14 | plugins: 15 | - type: GravityCompensationEffort 16 | name: gravComp 17 | enabled: true 18 | ramp_time: 5 19 | 20 | - type: DynamicsCompensationEffort 21 | name: dynamicsComp 22 | enabled: true 23 | ramp_time: 5 24 | 25 | # Kits with a gas spring need to add a shoulder compensation torque. 26 | # It should be around -7 Nm for most kits, but it may need to be tuned 27 | # for your specific setup. 28 | - name: 'gasSpringCompensation' 29 | type: EffortOffset 30 | enabled: false 31 | ramp_time: 5 32 | offset: [0, -7, 0, 0] 33 | -------------------------------------------------------------------------------- /kits/arms/config/A-2590-01G.cfg.yaml: -------------------------------------------------------------------------------- 1 | # T-Series 4-DoF SCARA Arm with Gripper 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist"] 5 | hrdf: "hrdf/A-2590-01G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2590-01.xml" 9 | gripper: "gains/A-2080-01.xml" 10 | 11 | user_data: 12 | # Default seed positions for doing inverse kinematics 13 | ik_seed_pos: [0.01, 1.0, 2.5, 1.5] 14 | 15 | # Gripper specific settings 16 | has_gripper: true 17 | gripper_open_effort: 1 18 | gripper_close_effort: -5 19 | 20 | plugins: 21 | - type: GravityCompensationEffort 22 | name: gravComp 23 | enabled: true 24 | ramp_time: 5 25 | 26 | - type: DynamicsCompensationEffort 27 | name: dynamicsComp 28 | enabled: true 29 | ramp_time: 5 30 | 31 | # Kits with a gas spring need to add a shoulder compensation torque. 32 | # It should be around -7 Nm for most kits, but it may need to be tuned 33 | # for your specific setup. 34 | - name: 'gasSpringCompensation' 35 | type: EffortOffset 36 | enabled: false 37 | ramp_time: 5 38 | offset: [0, -7, 0, 0] 39 | -------------------------------------------------------------------------------- /kits/arms/config/ex_AR_kit.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: true 14 | ramp_time: 5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 5 20 | 21 | user_data: 22 | # Joint angles at home for AR demo: [0, pi/3, 2*pi/3, 5*pi/6, -pi/2, 0] 23 | home_position: [0.001, 1.047, 2.0943, 2.618, -1.571, 0.001] # radians 24 | 25 | # Time taken for a steady motion to the home position 26 | homing_duration: 5 # seconds 27 | 28 | # Online trajectory delay to smooth out controller motion. A shorter 29 | # delay will make a trajectory more response, and longer delay will make 30 | # the trajectory smooother. 31 | delay_time: 0.5 # seconds 32 | 33 | # Displacements of the mobile device are scaled by these value to give 34 | # displacement of the end-effector 35 | xyz_scale: [1.0, 1.0, 2.0] # [ x, y, z ] 36 | 37 | mobile_io_family: "Arm" 38 | mobile_io_name: "mobileIO" 39 | mobile_io_layout: "layouts/ex_AR_kit.json" 40 | -------------------------------------------------------------------------------- /kits/arms/config/ex_AR_kit_w_gripper.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2240-06G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2240-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: true 14 | ramp_time: 5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 5 20 | 21 | user_data: 22 | # Joint angles at home for AR demo: [0, pi/3, pi/2, 2*pi/3, -pi/2, 0] 23 | home_position: [0.001, 1.047, 2.0943, 2.618, -1.571, 0.001] # radians 24 | 25 | # Time taken for a steady motion to the home position 26 | homing_duration: 5 # seconds 27 | 28 | # Online trajectory delay to smooth out controller motion. A shorter 29 | # delay will make a trajectory more response, and longer delay will make 30 | # the trajectory smooother. 31 | delay_time: 0.5 # seconds 32 | 33 | # Displacements of the mobile device are scaled by these value to give 34 | # displacement of the end-effector 35 | xyz_scale: [1.0, 1.0, 2.0] # [ x, y, z ] 36 | 37 | gripper_family: "Arm" 38 | gripper_name: "gripperSpool" 39 | gripper_gains: "gains/gripper_spool_gains.xml" 40 | gripper_close_effort: -5.0 # (Nm) Effort applied to close the gripper. More negative effort will pinch the gripper harder. 41 | gripper_open_effort: 1.0 # (Nm) Effort applied to open the gripper. More positive effort will NOT make the gripper harder to close. 42 | 43 | mobile_io_family: "Arm" 44 | mobile_io_name: "mobileIO" 45 | mobile_io_layout: "layouts/ex_AR_kit_w_gripper.json" 46 | -------------------------------------------------------------------------------- /kits/arms/config/ex_gravity_compensation.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: true 14 | ramp_time: 5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 5 20 | -------------------------------------------------------------------------------- /kits/arms/config/ex_gravity_compensation_toggle.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: false 14 | ramp_time: 0.5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 0.5 20 | 21 | user_data: 22 | mobile_io_family: "Arm" 23 | mobile_io_name: "mobileIO" 24 | mobile_io_layout: "layouts/ex_gravity_compensation_toggle.json" 25 | -------------------------------------------------------------------------------- /kits/arms/config/ex_impedance_control_cartesian.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: true 14 | ramp_time: 5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 5 20 | 21 | # An impedance controller adds a virtual spring to the 22 | # end-effector and can improve tracking. It can be enabled 23 | # by setting 'enabled' to true. The gains are in the form of 24 | # [x, y, z, rx, ry, rz]. Setting gains of zero deactivates 25 | # the corresponding degree of translation or rotation. 26 | # These gains correspond to a translational spring which maintains position but not orientation 27 | - type: ImpedanceController 28 | name: impedanceController 29 | enabled: true 30 | ramp_time: 5 31 | gains_in_end_effector_frame: true 32 | kp: [300, 300, 300, 0, 0, 0] # (N/m) or (Nm/rad) 33 | kd: [5, 5, 5, 0, 0, 0] # (N/(m/sec)) or (Nm/(rad/sec)) 34 | ki: [20, 20, 20, 0, 0, 0] 35 | i_clamp: [10, 10, 10, 0, 0, 0] # max value 36 | 37 | user_data: 38 | mobile_io_family: "Arm" 39 | mobile_io_name: "mobileIO" 40 | mobile_io_layout: "layouts/ex_impedance_control_cartesian.json" 41 | -------------------------------------------------------------------------------- /kits/arms/config/ex_impedance_control_damping.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: true 14 | ramp_time: 5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 5 20 | 21 | # An impedance controller adds a virtual spring to the 22 | # end-effector and can improve tracking. It can be enabled 23 | # by setting 'enabled' to true. The gains are in the form of 24 | # [x, y, z, rx, ry, rz]. Setting gains of zero deactivates 25 | # the corresponding degree of translation or rotation. 26 | # These gains are initialized to zero as the will be changed over the course of the damping example 27 | - type: ImpedanceController 28 | name: impedanceController 29 | enabled: true 30 | ramp_time: 0.5 31 | gains_in_end_effector_frame: false 32 | kp: [0, 0, 0, 0, 0, 0] # (N/m) or (Nm/rad) 33 | kd: [0, 0, 0, 0, 0, 0] # (N/(m/sec)) or (Nm/(rad/sec)) 34 | 35 | # Any extra configuration data is stored here 36 | user_data: 37 | # Distance above the base for overdamped, critically damped, and underdamped cases respectively 38 | lower_limits: [0.0, 0.15, 0.3] # (m) 39 | 40 | overdamped_kp: [100, 100, 0, 5, 5, 1] # (N/m) or (Nm/rad) 41 | overdamped_kd: [15, 15, 1, 0, 0, 0] # (N/(m/sec)) or (Nm/(rad/sec)) 42 | 43 | critically_damped_kp: [100, 100, 0, 5, 5, 1] # (N/m) or (Nm/rad) 44 | critically_damped_kd: [5, 5, 1, 0, 0, 0] # (N/(m/sec)) or (Nm/(rad/sec)) 45 | 46 | underdamped_kp: [100, 100, 0, 5, 5, 1] # (N/m) or (Nm/rad) 47 | underdamped_kd: [0, 0, 0, 0, 0, 0] # (N/(m/sec)) or (Nm/(rad/sec)) 48 | 49 | mobile_io_family: "Arm" 50 | mobile_io_name: "mobileIO" 51 | mobile_io_layout: "layouts/ex_impedance_control_damping.json" 52 | -------------------------------------------------------------------------------- /kits/arms/config/ex_impedance_control_fixed.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: true 14 | ramp_time: 5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 5 20 | 21 | # An impedance controller adds a virtual spring to the 22 | # end-effector and can improve tracking. It can be enabled 23 | # by setting 'enabled' to true. The gains are in the form of 24 | # [x, y, z, rx, ry, rz]. Setting gains of zero deactivates 25 | # the corresponding degree of translation or rotation. 26 | # These gains correspond to a controller that rigidly maintains a fixed pose 27 | - type: ImpedanceController 28 | name: impedanceController 29 | enabled: true 30 | ramp_time: 5 31 | gains_in_end_effector_frame: true 32 | kp: [300, 300, 300, 5, 5, 1] # (N/m) or (Nm/rad) 33 | kd: [5, 5, 5, 0, 0, 0] # (N/(m/sec)) or (Nm/(rad/sec)) 34 | ki: [20, 20, 20, 0.5, 0.5, 0.5] 35 | i_clamp: [10, 10, 10, 1, 1, 1] # max value 36 | 37 | user_data: 38 | mobile_io_family: "Arm" 39 | mobile_io_name: "mobileIO" 40 | mobile_io_layout: "layouts/ex_impedance_control_fixed.json" 41 | -------------------------------------------------------------------------------- /kits/arms/config/ex_impedance_control_gimbal.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: true 14 | ramp_time: 5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 5 20 | 21 | # An impedance controller adds a virtual spring to the 22 | # end-effector and can improve tracking. It can be enabled 23 | # by setting 'enabled' to true. The gains are in the form of 24 | # [x, y, z, rx, ry, rz]. Setting gains of zero deactivates 25 | # the corresponding degree of translation or rotation. 26 | # These gains correspond to a rotational spring emulating a gimbal 27 | - type: ImpedanceController 28 | name: impedanceController 29 | enabled: true 30 | ramp_time: 5 31 | gains_in_end_effector_frame: true 32 | kp: [0, 0, 0, 8, 8, 1] # (N/m) or (Nm/rad) 33 | kd: [0, 0, 0, 0, 0, 0] # (N/(m/sec)) or (Nm/(rad/sec)) 34 | ki: [0, 0, 0, 0.5, 0.5, 0.5] 35 | i_clamp: [0, 0, 0, 1, 1, 1] # max value 36 | 37 | user_data: 38 | mobile_io_family: "Arm" 39 | mobile_io_name: "mobileIO" 40 | mobile_io_layout: "layouts/ex_impedance_control_gimbal.json" 41 | -------------------------------------------------------------------------------- /kits/arms/config/ex_mobile_io_control.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: true 14 | ramp_time: 5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 5 20 | 21 | user_data: 22 | # Three waypoints for Buttons - B1, B2, B3 23 | waypoint_1: [0, 0, 0, 0, 0, 0] 24 | waypoint_2: [0.7854, 1.0472, 2.0944, 1.0472, 0.7854, 0] # [pi/4, pi/3, 2*pi/3, pi/3, pi/4, 0] 25 | waypoint_3: [-0.7854, 1.0472, 2.0944, 1.0472, 2.356194490192345, 0] # [-pi/4, pi/3, 2*pi/3, pi/3, 3*pi/4, 0] 26 | 27 | # Time taken to travel to a waypoint 28 | travel_time: 3 # seconds 29 | 30 | mobile_io_family: "Arm" 31 | mobile_io_name: "mobileIO" 32 | mobile_io_layout: "layouts/ex_mobile_io_control.json" 33 | -------------------------------------------------------------------------------- /kits/arms/config/ex_teach_repeat.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2085-06.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2085-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: true 14 | ramp_time: 5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 5 20 | 21 | user_data: 22 | # Travel time is calculated using 23 | # base_travel_time + slider * (base_travel_time - min_travel_time) 24 | # Since slider goes from -1 to 1, travel time goes from min_travel_time to 2 * base_travel_time - min_travel_time 25 | 26 | # Minimum travel time value 27 | min_travel_time: 0.5 28 | 29 | # The default travel time value 30 | base_travel_time: 3 # seconds 31 | 32 | mobile_io_family: "Arm" 33 | mobile_io_name: "mobileIO" 34 | mobile_io_layout: "layouts/ex_teach_repeat.json" 35 | -------------------------------------------------------------------------------- /kits/arms/config/ex_teach_repeat_w_gripper.cfg.yaml: -------------------------------------------------------------------------------- 1 | # 6-DoF Arm 2 | version: 1.0 3 | families: ["Arm"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3"] 5 | hrdf: "hrdf/A-2240-06G.hrdf" 6 | 7 | gains: 8 | default: "gains/A-2240-06.xml" 9 | 10 | plugins: 11 | - type: GravityCompensationEffort 12 | name: gravComp 13 | enabled: true 14 | ramp_time: 5 15 | 16 | - type: DynamicsCompensationEffort 17 | name: dynamicsComp 18 | enabled: true 19 | ramp_time: 5 20 | 21 | user_data: 22 | # Travel time is calculated using 23 | # base_travel_time + slider * (base_travel_time - min_travel_time) 24 | # Since slider goes from -1 to 1, travel time goes from min_travel_time to 2 * base_travel_time - min_travel_time 25 | 26 | # Minimum travel time value 27 | min_travel_time: 0.5 28 | 29 | # The default travel time value 30 | base_travel_time: 3 # seconds 31 | 32 | gripper_family: "Arm" 33 | gripper_name: "gripperSpool" 34 | gripper_gains: "gains/gripper_spool_gains.xml" 35 | gripper_close_effort: -5.0 # (Nm) Effort applied to close the gripper. More negative effort will pinch the gripper harder. 36 | gripper_open_effort: 1.0 # (Nm) Effort applied to open the gripper. More positive effort will NOT make the gripper harder to close. 37 | 38 | mobile_io_family: "Arm" 39 | mobile_io_name: "mobileIO" 40 | mobile_io_layout: "layouts/ex_teach_repeat_w_gripper.json" 41 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2080-01.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 4 5 | 6 | 15 7 | 0 8 | 0 9 | 0 10 | 0 11 | 1 12 | 0 13 | -inf 14 | inf 15 | 1 16 | -20 17 | 20 18 | 1 19 | 1 20 | 21 | 22 | 0.05 23 | 0 24 | 0 25 | 1 26 | 0 27 | 0.25 28 | 0 29 | -1.502675 30 | 1.502675 31 | 1 32 | -1 33 | 1 34 | 0.75 35 | 1 36 | 37 | 38 | 0.25 39 | 0 40 | 0.001 41 | 1 42 | 0 43 | 0.25 44 | 0 45 | -20 46 | 20 47 | 1 48 | -1 49 | 1 50 | 0.9 51 | 0 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2084-01.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 4 4 4 | 5 | 15 30 10 5 6 | 0 0 0 0 7 | 0 0 0 0 8 | 0 0 0 0 9 | 0 0 0 0 10 | 1 1 1 1 11 | 0 0 0 0 12 | -inf -inf -inf -inf 13 | inf inf inf inf 14 | 1 1 1 1 15 | -20 -20 -10 -5 16 | 20 20 10 5 17 | 1 1 1 1 18 | 1 1 1 1 19 | 20 | 21 | 0.05 0.05 0.05 0.05 22 | 0 0 0 0 23 | 0 0 0 0 24 | 1 1 1 1 25 | 0 0 0 0 26 | 0.25 0.25 0.25 0.25 27 | 0 0 0 0 28 | -3.4 -1.5 -3.4 -9.6 29 | 3.4 1.5 3.4 9.6 30 | 1 1 1 1 31 | -1 -1 -1 -1 32 | 1 1 1 1 33 | 0.75 0.75 0.75 0.75 34 | 1 1 1 1 35 | 36 | 37 | 0.25 0.25 0.25 0.25 38 | 0 0 0 0 39 | 0.001 0.001 0.001 0.001 40 | 1 1 1 1 41 | 0.1 0.1 0.1 0.05 42 | 0.25 0.25 0.25 0.25 43 | 0 0 0 0 44 | -20 -20 -10 -5 45 | 20 20 10 5 46 | 1 1 1 1 47 | -1 -1 -1 -1 48 | 1 1 1 1 49 | 0.9 0.9 0.9 0.9 50 | 0 0 0 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2085-03.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 4 4 | 5 | 15 30 10 6 | 0 0 0 7 | 0 0 0 8 | 0 0 0 9 | 0 0 0 10 | 1 1 1 11 | 0 0 0 12 | -inf -inf -inf 13 | inf inf inf 14 | 1 1 1 15 | -20 -20 -10 16 | 20 20 10 17 | 1 1 1 18 | 1 1 1 19 | 20 | 21 | 0.05 0.05 0.05 22 | 0 0 0 23 | 0 0 0 24 | 1 1 1 25 | 0 0 0 26 | 0.25 0.25 0.25 27 | 0 0 0 28 | -3.4 -1.5 -3.4 29 | 3.4 1.5 3.4 30 | 1 1 1 31 | -1 -1 -1 32 | 1 1 1 33 | 0.75 0.75 0.75 34 | 1 1 1 35 | 36 | 37 | 0.25 0.25 0.25 38 | 0 0 0 39 | 0.001 0.001 0.001 40 | 1 1 1 41 | 0 0 0 42 | 0.25 0.25 0.25 43 | 0 0 0 44 | -20 -20 -10 45 | 20 20 10 46 | 1 1 1 47 | -1 -1 -1 48 | 1 1 1 49 | 0.9 0.9 0.9 50 | 0 0 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2085-04.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 4 4 4 | 5 | 15 30 10 5 6 | 0 0 0 0 7 | 0 0 0 0 8 | 0 0 0 0 9 | 0 0 0 0 10 | 1 1 1 1 11 | 0 0 0 0 12 | -inf -inf -inf -inf 13 | inf inf inf inf 14 | 1 1 1 1 15 | -20 -20 -10 -5 16 | 20 20 10 5 17 | 1 1 1 1 18 | 1 1 1 1 19 | 20 | 21 | 0.05 0.05 0.05 0.05 22 | 0 0 0 0 23 | 0 0 0 0 24 | 1 1 1 1 25 | 0 0 0 0 26 | 0.25 0.25 0.25 0.25 27 | 0 0 0 0 28 | -3.4 -1.5 -3.4 -9.6 29 | 3.4 1.5 3.4 9.6 30 | 1 1 1 1 31 | -1 -1 -1 -1 32 | 1 1 1 1 33 | 0.75 0.75 0.75 0.75 34 | 1 1 1 1 35 | 36 | 37 | 0.25 0.25 0.25 0.25 38 | 0 0 0 0 39 | 0.001 0.001 0.001 0.001 40 | 1 1 1 1 41 | 0.1 0.1 0.1 0.05 42 | 0.25 0.25 0.25 0.25 43 | 0 0 0 0 44 | -20 -20 -10 -5 45 | 20 20 10 5 46 | 1 1 1 1 47 | -1 -1 -1 -1 48 | 1 1 1 1 49 | 0.9 0.9 0.9 0.9 50 | 0 0 0 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2085-05.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 4 4 4 4 | 5 | 50 75 30 10 5 6 | 0 0 0 0 0 7 | 0 0 0 0 0 8 | 0 0 0 0 0 9 | 0 0 0 0 0 10 | 1 1 1 1 1 11 | 0 0 0 0 0 12 | -inf -inf -inf -inf -inf 13 | inf inf inf inf inf 14 | 1 1 1 1 1 15 | -25 -40 -25 -5 -5 16 | 25 40 25 5 5 17 | 1 1 1 1 1 18 | 1 1 1 1 1 19 | 20 | 21 | 0.03 0.03 0.03 0.05 0.05 22 | 0 0 0 0 0 23 | 0 0 0 0 0 24 | 1 1 1 1 1 25 | 0 0 0 0 0 26 | 0.25 0.25 0.25 0.25 0.25 27 | 0 0 0 0 0 28 | -3.4 -1.8 -3.4 -9.6 -9.6 29 | 3.4 1.8 3.4 9.6 9.6 30 | 1 1 1 1 1 31 | -1 -1 -1 -1 -1 32 | 1 1 1 1 1 33 | 0.75 0.75 0.75 0.75 0.75 34 | 1 1 1 1 1 35 | 36 | 37 | 0.1 0.1 0.1 0.25 0.25 38 | 0 0 0 0 0 39 | 0.0001 0.0001 0.0001 0.001 0.001 40 | 1 1 1 1 1 41 | 0.1 0.1 0.1 0.05 0.05 42 | 0.25 0.25 0.25 0.25 0.25 43 | 0 0 0 0 0 44 | -25 -40 -25 -5 -5 45 | 25 40 25 5 5 46 | 1 1 1 1 1 47 | -1 -1 -1 -1 -1 48 | 1 1 1 1 1 49 | 0.9 0.9 0.9 0.9 0.9 50 | 0 0 0 0 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2085-06.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 4 4 4 4 4 | 5 | 50 75 30 10 5 5 6 | 0 0 0 0 0 0 7 | 0 0 0 0 0 0 8 | 0 0 0 0 0 0 9 | 0 0 0 0 0 0 10 | 1 1 1 1 1 1 11 | 0 0 0 0 0 0 12 | -inf -inf -inf -inf -inf -inf 13 | inf inf inf inf inf inf 14 | 1 1 1 1 1 1 15 | -25 -40 -25 -5 -5 -5 16 | 25 40 25 5 5 5 17 | 1 1 1 1 1 1 18 | 1 1 1 1 1 1 19 | 20 | 21 | 0.03 0.03 0.03 0.05 0.05 0.05 22 | 0 0 0 0 0 0 23 | 0 0 0 0 0 0 24 | 1 1 1 1 1 1 25 | 0 0 0 0 0 0 26 | 0.25 0.25 0.25 0.25 0.25 0.25 27 | 0 0 0 0 0 0 28 | -3.4 -1.8 -3.4 -9.6 -9.6 -9.6 29 | 3.4 1.8 3.4 9.6 9.6 9.6 30 | 1 1 1 1 1 1 31 | -1 -1 -1 -1 -1 -1 32 | 1 1 1 1 1 1 33 | 0.75 0.75 0.75 0.75 0.75 0.75 34 | 1 1 1 1 1 1 35 | 36 | 37 | 0.1 0.1 0.1 0.25 0.25 0.25 38 | 0 0 0 0 0 0 39 | 0.0001 0.0001 0.0001 0.001 0.001 0.001 40 | 1 1 1 1 1 1 41 | 0.1 0.1 0.1 0.05 0.05 0.05 42 | 0.25 0.25 0.25 0.25 0.25 0.25 43 | 0 0 0 0 0 0 44 | -25 -40 -25 -5 -5 -5 45 | 25 40 25 5 5 5 46 | 1 1 1 1 1 1 47 | -1 -1 -1 -1 -1 -1 48 | 1 1 1 1 1 1 49 | 0.9 0.9 0.9 0.9 0.9 0.9 50 | 0 0 0 0 0 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2240-04.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 4 4 4 4 6 | 7 | 8 | 30 50 20 5 9 | 0 0 0 0 10 | 0 0 0 0 11 | 0 0 0 0 12 | 0 0 0 0 13 | 1 1 1 1 14 | 0 0 0 0 15 | -inf -inf -inf -inf 16 | inf inf inf inf 17 | 1 1 1 1 18 | -20 -20 -10 -5 19 | 20 20 10 5 20 | 1 1 1 1 21 | 1 1 1 1 22 | 23 | 24 | 25 | 0.05 0.05 0.05 0.05 26 | 0 0 0 0 27 | 0 0 0 0 28 | 1 1 1 1 29 | 0 0 0 0 30 | 0.25 0.25 0.25 0.25 31 | 0 0 0 0 32 | -1.8 -1.8 -1.8 -9.6 33 | 1.8 1.8 1.8 9.6 34 | 1 1 1 1 35 | -1 -1 -1 -1 36 | 1 1 1 1 37 | 0.75 0.75 0.75 0.75 38 | 1 1 1 1 39 | 40 | 41 | 42 | 0.1 0.1 0.1 0.1 43 | 0 0 0 0 44 | 0.0001 0.0001 0.0001 0.0001 45 | 1 1 1 1 46 | 0.1 0.1 0.1 0.05 47 | 0.25 0.25 0.25 0.25 48 | 0 0 0 0 49 | -40 -40 -40 -5 50 | 40 40 40 5 51 | 1 1 1 1 52 | -1 -1 -1 -1 53 | 1 1 1 1 54 | 0.9 0.9 0.9 0.9 55 | 0 0 0 0 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2240-05.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 4 4 4 4 4 6 | 7 | 8 | 75 100 50 20 10 9 | 0 0 0 0 0 10 | 0 0 0 0 0 11 | 0 0 0 0 0 12 | 0 0 0 0 0 13 | 1 1 1 1 1 14 | 0 0 0 0 0 15 | -inf -inf -inf -inf -inf 16 | inf inf inf inf inf 17 | 1 1 1 1 1 18 | -40 -40 -40 -10 -10 19 | 40 40 40 10 10 20 | 1 1 1 1 1 21 | 1 1 1 1 1 22 | 23 | 24 | 25 | 0.1 0.2 0.1 0.1 0.05 26 | 0 0 0 0 0 27 | 0 0 0 0 0 28 | 1 1 1 1 1 29 | 0 0 0 0 0 30 | 0.25 0.25 0.25 0.25 0.25 31 | 0 0 0 0 0 32 | -1.8 -1.8 -1.8 -9.6 -9.6 33 | 1.8 1.8 1.8 9.6 9.6 34 | 1 1 1 1 1 35 | -1 -1 -1 -1 -1 36 | 1 1 1 1 1 37 | 0.75 0.75 0.75 0.75 0.75 38 | 1 1 1 1 1 39 | 40 | 41 | 42 | 0.1 0.1 0.1 0.1 0.1 43 | 0 0 0 0 0 44 | 0.0001 0.0001 0.0001 0.0001 0.0001 45 | 1 1 1 1 1 46 | 0.1 0.1 0.1 0.05 0.05 47 | 0.25 0.25 0.25 0.25 0.25 48 | 0 0 0 0 0 49 | -40 -40 -40 -25 -5 50 | 40 40 40 25 5 51 | 1 1 1 1 1 52 | -1 -1 -1 -1 -1 53 | 1 1 1 1 1 54 | 0.9 0.9 0.9 0.9 0.9 55 | 0 0 0 0 0 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2255-01.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 4 5 | 6 | 15 7 | 0 8 | 0 9 | 0 10 | 0 11 | 1 12 | 0 13 | -inf 14 | inf 15 | 1 16 | -20 17 | 20 18 | 1 19 | 1 20 | 21 | 22 | 0.05 23 | 0 24 | 0 25 | 1 26 | 0 27 | 0.25 28 | 0 29 | -1.502675 30 | 1.502675 31 | 1 32 | -1 33 | 1 34 | 0.75 35 | 1 36 | 37 | 38 | 0.25 39 | 0 40 | 0.001 41 | 1 42 | 0 43 | 0.25 44 | 0 45 | -20 46 | 20 47 | 1 48 | -1 49 | 1 50 | 0.9 51 | 0 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2302-01.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 4 4 4 4 6 | 7 | 8 | 30 50 20 5 9 | 0 0 0 0 10 | 0 0 0 0 11 | 0 0 0 0 12 | 0 0 0 0 13 | 1 1 1 1 14 | 0 0 0 0 15 | -inf -inf -inf -inf 16 | inf inf inf inf 17 | 1 1 1 1 18 | -20 -20 -10 -5 19 | 20 20 10 5 20 | 1 1 1 1 21 | 1 1 1 1 22 | 23 | 24 | 25 | 0.05 0.05 0.05 0.05 26 | 0 0 0 0 27 | 0 0 0 0 28 | 1 1 1 1 29 | 0 0 0 0 30 | 0.25 0.25 0.25 0.25 31 | 0 0 0 0 32 | -3.4 -1.8 -9.6 -9.6 33 | 3.4 1.8 9.6 9.6 34 | 1 1 1 1 35 | -1 -1 -1 -1 36 | 1 1 1 1 37 | 0.75 0.75 0.75 0.75 38 | 1 1 1 1 39 | 40 | 41 | 42 | 0.1 0.1 0.1 0.1 43 | 0 0 0 0 44 | 0.0001 0.0001 0.0001 0.0001 45 | 1 1 1 1 46 | 0.1 0.1 0.1 0.05 47 | 0.25 0.25 0.25 0.25 48 | 0 0 0 0 49 | -25 -40 -5 -5 50 | 25 40 5 5 51 | 1 1 1 1 52 | -1 -1 -1 -1 53 | 1 1 1 1 54 | 0.9 0.9 0.9 0.9 55 | 0 0 0 0 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2580-04.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 4 4 4 4 6 | 7 | 8 | 15 30 10 5 9 | 0 0 0 0 10 | 0 0 0 0 11 | 0 0 0 0 12 | 0 0 0 0 13 | 1 1 1 1 14 | 0 0 0 0 15 | -inf -inf -inf -inf 16 | inf inf inf inf 17 | 1 1 1 1 18 | -20 -20 -10 -5 19 | 20 20 10 5 20 | 1 1 1 1 21 | 1 1 1 1 22 | 23 | 24 | 25 | 0.05 0.05 0.05 0.05 26 | 0 0 0 0 27 | 0 0 0 0 28 | 1 1 1 1 29 | 0 0 0 0 30 | 0.25 0.25 0.25 0.25 31 | 0 0 0 0 32 | -3.4 -1.5 -3.4 -9.6 33 | 3.4 1.5 3.4 9.6 34 | 1 1 1 1 35 | -1 -1 -1 -1 36 | 1 1 1 1 37 | 0.75 0.75 0.75 0.75 38 | 1 1 1 1 39 | 40 | 41 | 42 | 0.25 0.25 0.25 0.25 43 | 0 0 0 0 44 | 0.001 0.001 0.001 0.001 45 | 1 1 1 1 46 | 0.1 0.1 0.1 0.05 47 | 0.25 0.25 0.25 0.25 48 | 0 0 0 0 49 | -20 -20 -10 -5 50 | 20 20 10 5 51 | 1 1 1 1 52 | -1 -1 -1 -1 53 | 1 1 1 1 54 | 0.9 0.9 0.9 0.9 55 | 0 0 0 0 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2580-05.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 4 4 4 4 4 6 | 7 | 8 | 50 75 30 10 5 9 | 0 0 0 0 0 10 | 0 0 0 0 0 11 | 0 0 0 0 0 12 | 0 0 0 0 0 13 | 1 1 1 1 1 14 | 0 0 0 0 0 15 | -inf -inf -inf -inf -inf 16 | inf inf inf inf inf 17 | 1 1 1 1 1 18 | -25 -40 -25 -5 -5 19 | 25 40 25 5 5 20 | 1 1 1 1 1 21 | 1 1 1 1 1 22 | 23 | 24 | 25 | 0.03 0.03 0.03 0.05 0.05 26 | 0 0 0 0 0 27 | 0 0 0 0 0 28 | 1 1 1 1 1 29 | 0 0 0 0 0 30 | 0.25 0.25 0.25 0.25 0.25 31 | 0 0 0 0 0 32 | -3.4 -1.8 -3.4 -9.6 -9.6 33 | 3.4 1.8 3.4 9.6 9.6 34 | 1 1 1 1 1 35 | -1 -1 -1 -1 -1 36 | 1 1 1 1 1 37 | 0.75 0.75 0.75 0.75 0.75 38 | 1 1 1 1 1 39 | 40 | 41 | 42 | 0.1 0.1 0.1 0.25 0.25 43 | 0 0 0 0 0 44 | 0.0001 0.0001 0.0001 0.001 0.001 45 | 1 1 1 1 1 46 | 0.1 0.1 0.1 0.05 0.05 47 | 0.25 0.25 0.25 0.25 0.25 48 | 0 0 0 0 0 49 | -25 -40 -25 -5 -5 50 | 25 40 25 5 5 51 | 1 1 1 1 1 52 | -1 -1 -1 -1 -1 53 | 1 1 1 1 1 54 | 0.9 0.9 0.9 0.9 0.9 55 | 0 0 0 0 0 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /kits/arms/config/gains/A-2590-01.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 4 4 4 4 6 | 7 | 8 | 15 30 10 5 9 | 0 0 0 0 10 | 0 0 0 0 11 | 0 0 0 0 12 | 0 0 0 0 13 | 1 1 1 1 14 | 0 0 0 0 15 | -inf -inf -inf -inf 16 | inf inf inf inf 17 | 1 1 1 1 18 | -20 -20 -10 -5 19 | 20 20 10 5 20 | 1 1 1 1 21 | 1 1 1 1 22 | 23 | 24 | 25 | 0.05 0.05 0.05 0.05 26 | 0 0 0 0 27 | 0 0 0 0 28 | 1 1 1 1 29 | 0 0 0 0 30 | 0.25 0.25 0.25 0.25 31 | 0 0 0 0 32 | -3.4 -1.5 -3.4 -9.6 33 | 3.4 1.5 3.4 9.6 34 | 1 1 1 1 35 | -1 -1 -1 -1 36 | 1 1 1 1 37 | 0.75 0.75 0.75 0.75 38 | 1 1 1 1 39 | 40 | 41 | 42 | 0.25 0.25 0.25 0.25 43 | 0 0 0 0 44 | 0.001 0.001 0.001 0.001 45 | 1 1 1 1 46 | 0.1 0.1 0.1 0.05 47 | 0.25 0.25 0.25 0.25 48 | 0 0 0 0 49 | -10 -20 -10 -5 50 | 10 20 10 5 51 | 1 1 1 1 52 | -1 -1 -1 -1 53 | 1 1 1 1 54 | 0.9 0.9 0.9 0.9 55 | 0 0 0 0 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /kits/arms/config/gains/gripper_spool_gains.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | 5 | 15 6 | 0 7 | 0 8 | 0 9 | 0 10 | 1 11 | 0 12 | -inf 13 | inf 14 | 1 15 | -20 16 | 20 17 | 1 18 | 1 19 | 20 | 21 | 0.05 22 | 0 23 | 0 24 | 1 25 | 0 26 | 0.25 27 | 0 28 | -1.502675 29 | 1.502675 30 | 1 31 | -1 32 | 1 33 | 0.75 34 | 1 35 | 36 | 37 | 0.25 38 | 0 39 | 0.001 40 | 1 41 | 0 42 | 0.25 43 | 0 44 | -20 45 | 20 46 | 1 47 | -1 48 | 1 49 | 0.9 50 | 0 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /kits/arms/config/gains/mirror_shoulder.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | 5 | 50 6 | 0 7 | 0 8 | 0 9 | 0 10 | 1 11 | 0 12 | -inf 13 | inf 14 | 1 15 | -40 16 | 40 17 | 1 18 | 1 19 | 20 | 21 | 0.1 22 | 0 23 | 0 24 | 1 25 | 0 26 | 0.25 27 | 0 28 | -1.790422 29 | 1.790422 30 | 1 31 | -1 32 | 1 33 | 0.5 34 | 1 35 | 36 | 37 | 0.3 38 | 0 39 | 0.0001 40 | 1 41 | 0 42 | 0.25 43 | 0 44 | -40 45 | 40 46 | 1 47 | -1 48 | 1 49 | 0.5 50 | 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2084-01.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2084-01G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2085-03.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2085-04.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2085-05.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2085-05G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2085-06.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2085-06G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2099-07.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2099-07G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2240-04.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2240-05.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2240-05G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2240-06.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2240-06G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2302-01.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2302-01G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2303-01.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2303-01G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2580-04.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2580-05.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2580-05G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2580-06.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2580-06G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2582-07.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2582-07G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2590-01.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /kits/arms/config/hrdf/A-2590-01G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /kits/arms/config/layouts/ar_control_sm.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "b1", 4 | "channels": [ 5 | "b1" 6 | ], 7 | "type": "button", 8 | "x": -0.5, 9 | "y": -0.73, 10 | "width": 0.15, 11 | "height": 0.15, 12 | "parameters": { 13 | "text": [ 14 | "Home" 15 | ], 16 | "mode": 0 17 | } 18 | }, 19 | { 20 | "id": "b2", 21 | "channels": [ 22 | "b2" 23 | ], 24 | "type": "button", 25 | "x": 0, 26 | "y": -0.73, 27 | "width": 0.15, 28 | "height": 0.15, 29 | "parameters": { 30 | "text": [ 31 | "Arm Control" 32 | ], 33 | "mode": 0 34 | } 35 | }, 36 | { 37 | "id": "b3", 38 | "channels": [ 39 | "b3" 40 | ], 41 | "type": "button", 42 | "x": 0.5, 43 | "y": -0.73, 44 | "width": 0.15, 45 | "height": 0.15, 46 | "parameters": { 47 | "text": [ 48 | "Gripper" 49 | ], 50 | "mode": 0 51 | } 52 | } 53 | ] -------------------------------------------------------------------------------- /kits/arms/config/layouts/ex_AR_kit.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "b1", 4 | "channels": [ 5 | "b1" 6 | ], 7 | "type": "button", 8 | "x": -0.75, 9 | "y": -0.73, 10 | "width": 0.15, 11 | "height": 0.15, 12 | "parameters": { 13 | "text": [ 14 | "🏠" 15 | ], 16 | "mode": "momentary" 17 | } 18 | }, 19 | { 20 | "id": "b3", 21 | "channels": [ 22 | "b3" 23 | ], 24 | "type": "button", 25 | "x": -0.25, 26 | "y": -0.73, 27 | "width": 0.15, 28 | "height": 0.15, 29 | "parameters": { 30 | "text": [ 31 | "📲" 32 | ], 33 | "mode": "momentary" 34 | } 35 | }, 36 | { 37 | "id": "b6", 38 | "channels": [ 39 | "b6" 40 | ], 41 | "type": "button", 42 | "x": 0.25, 43 | "y": -0.73, 44 | "width": 0.15, 45 | "height": 0.15, 46 | "parameters": { 47 | "text": [ 48 | "🌍" 49 | ], 50 | "mode": "momentary" 51 | } 52 | }, 53 | { 54 | "id": "b8", 55 | "channels": [ 56 | "b8" 57 | ], 58 | "type": "button", 59 | "x": 0.75, 60 | "y": -0.73, 61 | "width": 0.15, 62 | "height": 0.15, 63 | "parameters": { 64 | "text": [ 65 | "❌" 66 | ], 67 | "mode": "momentary" 68 | } 69 | } 70 | ] -------------------------------------------------------------------------------- /kits/arms/config/layouts/ex_AR_kit_w_gripper.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "b1", 4 | "channels": [ 5 | "b1" 6 | ], 7 | "type": "button", 8 | "x": -0.75, 9 | "y": -0.73, 10 | "width": 0.15, 11 | "height": 0.15, 12 | "parameters": { 13 | "text": [ 14 | "🏠" 15 | ], 16 | "mode": "momentary" 17 | } 18 | }, 19 | { 20 | "id": "b3", 21 | "channels": [ 22 | "b3" 23 | ], 24 | "type": "button", 25 | "x": -0.25, 26 | "y": -0.73, 27 | "width": 0.15, 28 | "height": 0.15, 29 | "parameters": { 30 | "text": [ 31 | "📲" 32 | ], 33 | "mode": "momentary" 34 | } 35 | }, 36 | { 37 | "id": "b6", 38 | "channels": [ 39 | "b6" 40 | ], 41 | "type": "button", 42 | "x": 0.25, 43 | "y": -0.73, 44 | "width": 0.15, 45 | "height": 0.15, 46 | "parameters": { 47 | "text": [ 48 | "🌍" 49 | ], 50 | "mode": "momentary" 51 | } 52 | }, 53 | { 54 | "id": "b8", 55 | "channels": [ 56 | "b8" 57 | ], 58 | "type": "button", 59 | "x": 0.75, 60 | "y": -0.73, 61 | "width": 0.15, 62 | "height": 0.15, 63 | "parameters": { 64 | "text": [ 65 | "❌" 66 | ], 67 | "mode": "momentary" 68 | } 69 | }, 70 | { 71 | "id": "a3", 72 | "channels": [ 73 | "a3" 74 | ], 75 | "type": "rotslider", 76 | "x": -0.25, 77 | "y": 0.6, 78 | "width": 0.05, 79 | "height": 0.5, 80 | "parameters": { 81 | "text": [ 82 | "🤌" 83 | ], 84 | "steps": 10, 85 | "min": -1, 86 | "max": 1, 87 | "rest": 0 88 | } 89 | } 90 | ] -------------------------------------------------------------------------------- /kits/arms/config/layouts/ex_gravity_compensation_toggle.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "b1", 4 | "channels": [ 5 | "b1" 6 | ], 7 | "type": "button", 8 | "x": -0.25, 9 | "y": -0.73, 10 | "width": 0.15, 11 | "height": 0.15, 12 | "parameters": { 13 | "text": [ 14 | "❌/📈" 15 | ], 16 | "mode": "momentary" 17 | } 18 | }, 19 | { 20 | "id": "b2", 21 | "channels": [ 22 | "b2" 23 | ], 24 | "type": "button", 25 | "x": 0.25, 26 | "y": -0.73, 27 | "width": 0.15, 28 | "height": 0.15, 29 | "parameters": { 30 | "text": [ 31 | "🌍" 32 | ], 33 | "mode": "toggle" 34 | } 35 | } 36 | ] -------------------------------------------------------------------------------- /kits/arms/config/layouts/ex_impedance_control_cartesian.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "b1", 4 | "channels": [ 5 | "b1" 6 | ], 7 | "type": "button", 8 | "x": -0.25, 9 | "y": -0.73, 10 | "width": 0.15, 11 | "height": 0.15, 12 | "parameters": { 13 | "text": [ 14 | "❌/📈" 15 | ], 16 | "mode": "momentary" 17 | } 18 | }, 19 | { 20 | "id": "b2", 21 | "channels": [ 22 | "b2" 23 | ], 24 | "type": "button", 25 | "x": 0.25, 26 | "y": -0.73, 27 | "width": 0.15, 28 | "height": 0.15, 29 | "parameters": { 30 | "text": [ 31 | "📌" 32 | ], 33 | "mode": "toggle" 34 | } 35 | } 36 | ] -------------------------------------------------------------------------------- /kits/arms/config/layouts/ex_impedance_control_damping.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "b1", 4 | "channels": [ 5 | "b1" 6 | ], 7 | "type": "button", 8 | "x": -0.25, 9 | "y": -0.73, 10 | "width": 0.15, 11 | "height": 0.15, 12 | "parameters": { 13 | "text": [ 14 | "❌/📈" 15 | ], 16 | "mode": "momentary" 17 | } 18 | }, 19 | { 20 | "id": "b2", 21 | "channels": [ 22 | "b2" 23 | ], 24 | "type": "button", 25 | "x": 0.25, 26 | "y": -0.73, 27 | "width": 0.15, 28 | "height": 0.15, 29 | "parameters": { 30 | "text": [ 31 | "💪" 32 | ], 33 | "mode": "toggle" 34 | } 35 | } 36 | ] -------------------------------------------------------------------------------- /kits/arms/config/layouts/ex_impedance_control_fixed.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "b1", 4 | "channels": [ 5 | "b1" 6 | ], 7 | "type": "button", 8 | "x": -0.25, 9 | "y": -0.73, 10 | "width": 0.15, 11 | "height": 0.15, 12 | "parameters": { 13 | "text": [ 14 | "❌/📈" 15 | ], 16 | "mode": "momentary" 17 | } 18 | }, 19 | { 20 | "id": "b2", 21 | "channels": [ 22 | "b2" 23 | ], 24 | "type": "button", 25 | "x": 0.25, 26 | "y": -0.73, 27 | "width": 0.15, 28 | "height": 0.15, 29 | "parameters": { 30 | "text": [ 31 | "🛑" 32 | ], 33 | "mode": "toggle" 34 | } 35 | } 36 | ] -------------------------------------------------------------------------------- /kits/arms/config/layouts/ex_impedance_control_floor.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "b1", 4 | "channels": [ 5 | "b1" 6 | ], 7 | "type": "button", 8 | "x": -0.25, 9 | "y": -0.73, 10 | "width": 0.15, 11 | "height": 0.15, 12 | "parameters": { 13 | "text": [ 14 | "❌/📈" 15 | ], 16 | "mode": "momentary" 17 | } 18 | }, 19 | { 20 | "id": "b2", 21 | "channels": [ 22 | "b2" 23 | ], 24 | "type": "button", 25 | "x": 0.25, 26 | "y": -0.73, 27 | "width": 0.15, 28 | "height": 0.15, 29 | "parameters": { 30 | "text": [ 31 | "🧱" 32 | ], 33 | "mode": "toggle" 34 | } 35 | } 36 | ] -------------------------------------------------------------------------------- /kits/arms/config/layouts/ex_impedance_control_gimbal.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "b1", 4 | "channels": [ 5 | "b1" 6 | ], 7 | "type": "button", 8 | "x": -0.25, 9 | "y": -0.73, 10 | "width": 0.15, 11 | "height": 0.15, 12 | "parameters": { 13 | "text": [ 14 | "❌/📈" 15 | ], 16 | "mode": "momentary" 17 | } 18 | }, 19 | { 20 | "id": "b2", 21 | "channels": [ 22 | "b2" 23 | ], 24 | "type": "button", 25 | "x": 0.25, 26 | "y": -0.73, 27 | "width": 0.15, 28 | "height": 0.15, 29 | "parameters": { 30 | "text": [ 31 | "🤳" 32 | ], 33 | "mode": "toggle" 34 | } 35 | } 36 | ] -------------------------------------------------------------------------------- /kits/arms/config/layouts/ex_mobile_io_control.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "b1", 4 | "channels": [ 5 | "b1" 6 | ], 7 | "type": "button", 8 | "x": -0.8, 9 | "y": -0.73, 10 | "width": 0.15, 11 | "height": 0.15, 12 | "parameters": { 13 | "text": [ 14 | "1" 15 | ], 16 | "mode": "momentary" 17 | } 18 | }, 19 | { 20 | "id": "b2", 21 | "channels": [ 22 | "b2" 23 | ], 24 | "type": "button", 25 | "x": -0.4, 26 | "y": -0.73, 27 | "width": 0.15, 28 | "height": 0.15, 29 | "parameters": { 30 | "text": [ 31 | "2" 32 | ], 33 | "mode": "momentary" 34 | } 35 | }, 36 | { 37 | "id": "b3", 38 | "channels": [ 39 | "b3" 40 | ], 41 | "type": "button", 42 | "x": -0, 43 | "y": -0.73, 44 | "width": 0.15, 45 | "height": 0.15, 46 | "parameters": { 47 | "text": [ 48 | "3" 49 | ], 50 | "mode": "momentary" 51 | } 52 | }, 53 | { 54 | "id": "b6", 55 | "channels": [ 56 | "b6" 57 | ], 58 | "type": "button", 59 | "x": 0.4, 60 | "y": -0.73, 61 | "width": 0.15, 62 | "height": 0.15, 63 | "parameters": { 64 | "text": [ 65 | "🌍" 66 | ], 67 | "mode": "momentary" 68 | } 69 | }, 70 | { 71 | "id": "b8", 72 | "channels": [ 73 | "b8" 74 | ], 75 | "type": "button", 76 | "x": 0.8, 77 | "y": -0.73, 78 | "width": 0.15, 79 | "height": 0.15, 80 | "parameters": { 81 | "text": [ 82 | "❌" 83 | ], 84 | "mode": "momentary" 85 | } 86 | } 87 | ] -------------------------------------------------------------------------------- /kits/arms/ex_gravity_compensation.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | import os 5 | from time import sleep 6 | from plotting import draw_plots 7 | 8 | # Initialize the interface for network connected modules 9 | lookup = hebi.Lookup() 10 | sleep(2) 11 | 12 | # Config file 13 | example_config_file = "config/ex_gravity_compensation.cfg.yaml" # Relative to this file directory 14 | example_config = hebi.config.load_config(os.path.join(os.path.dirname(os.path.realpath(__file__)), example_config_file)) 15 | 16 | # Set up arm from config 17 | arm = hebi.arm.create_from_config(example_config, lookup) 18 | 19 | arm.group.feedback_frequency = 200.0 20 | 21 | # Start background logging 22 | enable_logging = False 23 | if enable_logging: 24 | arm.group.start_log('dir', 'logs', mkdirs=True) 25 | 26 | ####################### 27 | ## Main Control Loop ## 28 | ####################### 29 | 30 | while arm.update(): 31 | 32 | # When no goal is set, the arm automatically returns to grav-comp mode 33 | # Thus, when we have an empty control loop, the arm is in grav-comp 34 | # awaiting further instructions 35 | 36 | # Send the latest loaded commands to the arm. If no changes are made, 37 | # it will send the last loaded command when arm.update() was last called 38 | 39 | arm.send() 40 | 41 | ########################## 42 | ## Logging and Plotting ## 43 | ########################## 44 | 45 | if enable_logging: 46 | hebi_log = arm.group.stop_log() 47 | draw_plots(hebi_log) 48 | 49 | # Add additional plotting code here 50 | -------------------------------------------------------------------------------- /kits/arms/plotting.py: -------------------------------------------------------------------------------- 1 | from matplotlib import pyplot as plt 2 | 3 | def draw_plots(hebi_log): 4 | 5 | # Plot tracking / error from the joints in the arm. 6 | time = [] 7 | position = [] 8 | velocity = [] 9 | effort = [] 10 | # iterate through log 11 | for entry in hebi_log.feedback_iterate: 12 | time.append(entry.transmit_time) 13 | position.append(entry.position) 14 | velocity.append(entry.velocity) 15 | effort.append(entry.effort) 16 | 17 | # Offline Visualization 18 | # Plot the logged position feedback 19 | plt.figure(101) 20 | plt.plot(time, position) 21 | plt.title('Position') 22 | plt.xlabel('time (sec)') 23 | plt.ylabel('position (rad)') 24 | plt.grid(True) 25 | 26 | # Plot the logged velocity feedback 27 | plt.figure(102) 28 | plt.plot(time, velocity) 29 | plt.title('Velocity') 30 | plt.xlabel('time (sec)') 31 | plt.ylabel('velocity (rad/sec)') 32 | plt.grid(True) 33 | 34 | # Plot the logged effort feedback 35 | plt.figure(103) 36 | plt.plot(time, effort) 37 | plt.title('Effort') 38 | plt.xlabel('time (sec)') 39 | plt.ylabel('effort (N*m)') 40 | plt.grid(True) 41 | 42 | plt.show() -------------------------------------------------------------------------------- /kits/arms/starter_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | 3 | import hebi 4 | import os 5 | from time import sleep 6 | from plotting import draw_plots 7 | 8 | # Initialize the interface for network connected modules 9 | # Lookup class is used to find modules on the network 10 | lookup = hebi.Lookup() 11 | sleep(2) # Wait for a few seconds to find modules 12 | 13 | ############### 14 | ## Arm Setup ## 15 | ############### 16 | 17 | # Config file contains the necessary information to set up the arm, such as 18 | # the family name, module names, path to HRDF file for the kinematics, etc. 19 | 20 | # By default, this example uses a 6-DoF arm with X-Series modules 21 | # You can edit the config file to match your robot's configuration 22 | # For example, if you have a 5-DoF T-Series arm, replace the config file 23 | # with "config/A-2580-05.cfg.yaml" 24 | 25 | example_config_file = "config/A-2085-06.cfg.yaml" # Relative to this file directory 26 | example_config = hebi.config.load_config(os.path.join(os.path.dirname(os.path.realpath(__file__)), example_config_file)) 27 | 28 | # Set up arm from config 29 | arm = hebi.arm.create_from_config(example_config, lookup) 30 | arm.group.feedback_frequency = 200.0 31 | 32 | ########################### 33 | ## Command Home Position ## 34 | ########################### 35 | 36 | goal = hebi.arm.Goal(arm.size) 37 | home_position = [0.0, 2.09, 2.09, 0.0, 1.57, 0.0] 38 | goal.add_waypoint(t=3.0, position=home_position[:arm.size]) 39 | arm.update() 40 | arm.set_goal(goal) 41 | arm.send() 42 | 43 | # Start background logging 44 | enable_logging = False 45 | if enable_logging: 46 | arm.group.start_log('dir', 'logs', mkdirs=True) 47 | 48 | ####################### 49 | ## Main Control Loop ## 50 | ####################### 51 | 52 | while arm.update(): 53 | 54 | # Send the latest loaded commands to the arm. Since the goal is already set, 55 | # it will send the last loaded command when arm.update() was last called 56 | 57 | arm.send() 58 | 59 | ########################## 60 | ## Logging and Plotting ## 61 | ########################## 62 | 63 | if enable_logging: 64 | hebi_log = arm.group.stop_log() 65 | draw_plots(hebi_log) 66 | 67 | # Add additional plotting code here 68 | -------------------------------------------------------------------------------- /kits/bases/config/default/A-2592-01.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series Rosie with default omniwheel configuration 2 | version: 1.0 3 | families: ["Rosie"] 4 | names: ["J1_base", "J2_shoulder", "J3_elbow", "J4_wrist1", "J5_wrist2", "J6_wrist3", "W1", "W2", "W3"] 5 | hrdf: "../hrdf/Rosie.hrdf" 6 | 7 | gains: 8 | omni_wheels: "../gains/omni-drive-wheel-gains.xml" 9 | mecanum_wheels: "../gains/mecanum-wheel-gains.xml" 10 | diff_drive: "../gains/diff-drive-wheel-gains.xml" 11 | arm: "../gains/6-dof-arm-gains-rosie.xml" 12 | gripper: "../gains/gripper-gains.xml" 13 | 14 | user_data: 15 | controller_family: "HEBI" 16 | controller_name: "mobileIO" -------------------------------------------------------------------------------- /kits/bases/config/examples/ex_holonomic_omni.cfg.yaml: -------------------------------------------------------------------------------- 1 | # X-Series Rosie with default omniwheel configuration 2 | version: 1.0 3 | families: ["Rosie"] 4 | names: ["W1", "W2", "W3"] 5 | hrdf: "../hrdf/A-2592-01.hrdf" 6 | 7 | gains: 8 | omni_wheels: "../gains/A-2592-01.xml" 9 | 10 | user_data: 11 | controller_family: "HEBI" 12 | controller_name: "mobileIO" -------------------------------------------------------------------------------- /kits/bases/config/gains/A-2592-01.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 4 4 | 5 | 3 3 3 6 | 0 0 0 7 | 0 0 0 8 | 0 0 0 9 | 0 0 0 10 | 1 1 1 11 | 0 0 0 12 | -inf -inf -inf 13 | inf inf inf 14 | 1 1 1 15 | -10 -10 -10 16 | 10 10 10 17 | 1 1 1 18 | 1 1 1 19 | 20 | 21 | 0.03 0.03 0.03 22 | 0 0 0 23 | 0 0 0 24 | 1 1 1 25 | 0 0 0 26 | 0.25 0.25 0.25 27 | 0 0 0 28 | -9.617128 -9.617128 -9.617128 29 | 9.617128 9.617128 9.617128 30 | 1 1 1 31 | -1 -1 -1 32 | 1 1 1 33 | 0.75 0.75 0.75 34 | 1 1 1 35 | 36 | 37 | 0.02 0.02 0.02 38 | 0 0 0 39 | 0.0001 0.0001 0.0001 40 | 1 1 1 41 | 0 0 0 42 | 0.25 0.25 0.25 43 | 0 0 0 44 | -10 -10 -10 45 | 10 10 10 46 | 1 1 1 47 | -1 -1 -1 48 | 1 1 1 49 | 0.9 0.9 0.9 50 | 0 0 0 51 | 52 | -------------------------------------------------------------------------------- /kits/bases/config/hrdf/A-2592-01.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | # 6 | # 7 | # 8 | # 9 | # 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /kits/camera/hrdf/pan_tilt_mast.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | -------------------------------------------------------------------------------- /kits/daisy/components/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/kits/daisy/components/__init__.py -------------------------------------------------------------------------------- /kits/daisy/install/hebi-demo.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=HEBI Demo (Daisy) 3 | Requires=network.target 4 | After=multi-user.target 5 | 6 | [Service] 7 | Type=simple 8 | WorkingDirectory=/home/hebi 9 | ExecStart=/home/hebi/launch_demo 10 | StartLimitInterval=0 11 | User=hebi 12 | StandardOutput=syslog 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /kits/daisy/install/hebi_demo_wait_for_connected: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Change this to the network interface connected to the subnet containing the modules of your robot. 4 | DEPLOY_IFACE=eno1 5 | 6 | # Wait for connection to come up, if it is not already 7 | IF_ATTRS=$(ip a show $DEPLOY_IFACE 2>/dev/null | head -n1 | awk '{ print substr($3, 2, length($3)-2) }' | tr ',' ' ') 8 | iface_up=$(echo $IF_ATTRS | grep -e "[[:space:]]UP[[:space:]]" | wc -l) 9 | 10 | if [ $iface_up != 0 ]; then 11 | # Interface is up - we can exit 12 | exit 0; 13 | fi 14 | 15 | while [ 1 ]; do 16 | echo "Waiting for network interface '$DEPLOY_IFACE' to come up..." 17 | sleep 3 18 | 19 | IF_ATTRS=$(ip a show $DEPLOY_IFACE 2>/dev/null | head -n1 | awk '{ print substr($3, 2, length($3)-2) }' | tr ',' ' ') 20 | iface_up=$(echo $IF_ATTRS | grep -e "[[:space:]]UP[[:space:]]" | wc -l) 21 | 22 | if [ $iface_up != 0 ]; then 23 | # Interface is up - we can exit 24 | exit 0; 25 | fi 26 | done 27 | -------------------------------------------------------------------------------- /kits/daisy/install/launch_demo: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ./hebi_demo_wait_for_connected 4 | python3 ./hebi-python-examples/kits/daisy/daisy.py 5 | -------------------------------------------------------------------------------- /kits/daisy/install/service_install: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ $(whoami) != root ]; then 4 | echo "You must run this script as root."; 5 | exit 1 6 | fi 7 | 8 | DEMO_USER=hebi 9 | USER_HOME_DIR=/home/$DEMO_USER 10 | 11 | # make sure current working directory is where this script resides and hide output 12 | pushd $(readlink -f $(dirname $0)) >/dev/null 2>&1 13 | 14 | cp hebi-demo.service /etc/systemd/system/ 15 | # Reload all service files (scanning for new ones as well) 16 | systemctl daemon-reload 17 | # Check that systemd found the service 18 | FOUND_HEBI_SERVICE=$(systemctl list-unit-files | grep hebi-demo.service | wc -l) 19 | 20 | if [ "$FOUND_HEBI_SERVICE" -eq 0 ]; then 21 | echo "An error occurred while finding 'hebi-demo.service' - Was the service file installed properly?" 22 | exit 1 23 | fi 24 | 25 | # Copy shell scripts to home directory - also make sure to set executable bits 26 | cp hebi_demo_wait_for_connected $USER_HOME_DIR && chmod +x $USER_HOME_DIR/hebi_demo_wait_for_connected && chown $DEMO_USER:$DEMO_USER $USER_HOME_DIR/hebi_demo_wait_for_connected 27 | cp launch_demo $USER_HOME_DIR && chmod +x $USER_HOME_DIR/launch_demo && chown $DEMO_USER:$DEMO_USER $USER_HOME_DIR/launch_demo 28 | # Enable service to run on startup 29 | systemctl enable hebi-demo.service 30 | 31 | echo "Service installed." 32 | 33 | -------------------------------------------------------------------------------- /kits/daisy/resources/images/controller.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/kits/daisy/resources/images/controller.png -------------------------------------------------------------------------------- /kits/daisy/resources/images/daisy_coordinates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/kits/daisy/resources/images/daisy_coordinates.png -------------------------------------------------------------------------------- /kits/daisy/resources/images/daisy_coordinates_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/kits/daisy/resources/images/daisy_coordinates_small.png -------------------------------------------------------------------------------- /kits/daisy/resources/images/daisy_labeled.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/kits/daisy/resources/images/daisy_labeled.png -------------------------------------------------------------------------------- /kits/daisy/resources/images/daisy_render.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/kits/daisy/resources/images/daisy_render.png -------------------------------------------------------------------------------- /kits/daisy/resources/left.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /kits/daisy/resources/right.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /kits/igor2/README.md: -------------------------------------------------------------------------------- 1 | # Igor Balancing Robot Python Demo 2 | 3 | ## Requirements 4 | 5 | ### Controller 6 | 7 | The demo can be run using either a gamecontroller or Mobile IO device acessible from the computer running the demo. 8 | 9 | * USB controller (Must be compatibile with SDL2 - check [here](https://github.com/gabomdq/SDL_GameControllerDB/blob/master/gamecontrollerdb.txt) for your controller) 10 | * Mobile IO (Requires HEBI's Mobile IO app on an Android or iOS device) 11 | 12 | ### Software Requirements 13 | * [HEBI Python API](https://pypi.org/project/hebi-py/) 14 | * [PySDL2](https://pypi.org/project/PySDL2/) 15 | * **Linux Users:** You should check if your distro has a package for this already. For Ubuntu, install the [pysdl2 package](https://launchpad.net/ubuntu/+source/pysdl2) 16 | * If not installing through a package manager, make sure you have the SDL2 library installed! 17 | 18 | ## Running 19 | 20 | Simply run the `igor2_demo.py` file located at `kits/igor2`. You can run this in a terminal by executing 21 | ```sh 22 | python3 igor2_demo.py 23 | ``` 24 | 25 | Both Python 2 and 3 are supported, but note that Python 2 upstream is end of life. 26 | 27 | **Note:** By default, the demo will look for a Mobile IO device with family `Igor` and name `mobileIO`. You must provide `--joystick` if you want to control Igor using a USB gamecontroller. 28 | 29 | ## Controls 30 | 31 | The demo provides default mappings for both supported controllers. You can modify them, if needed, by editing the `components/configuration.py` file directly. 32 | 33 | ### Game Controller 34 | 35 | The default gamecontroller mappings are as followed. Note that the image is of a generic Sony Playstation 4 controller, but the concept applies to all other SDL2 compatible controllers. 36 | ![ps4 igor](resources/ps4_igor.png) 37 | 38 | *Note: To exit idle mode, press L3 (press in left axis stick)* 39 | 40 | ### Mobile IO 41 | 42 | The default Mobile IO mappings are as followed. Note that the layout of the application may appear different on your device than what is shown, but the buttons and axes are guaranteed across any device. 43 | ![mobile io igor](resources/mobile_io_igor.png) 44 | -------------------------------------------------------------------------------- /kits/igor2/components/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/kits/igor2/components/__init__.py -------------------------------------------------------------------------------- /kits/igor2/hrdf/igor.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /kits/igor2/hrdf/igorArm-Left.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /kits/igor2/hrdf/igorArm-Right.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /kits/igor2/hrdf/igorLeg.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /kits/igor2/hrdf/tgor.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /kits/igor2/hrdf/tgorArm-Left.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /kits/igor2/hrdf/tgorArm-Right.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /kits/igor2/hrdf/tgorChassis.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 10 | 11 | -------------------------------------------------------------------------------- /kits/igor2/hrdf/tgorLeg.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /kits/igor2/install/hebi-demo.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=HEBI Demo 3 | Requires=network.target 4 | After=multi-user.target 5 | 6 | [Service] 7 | Type=simple 8 | WorkingDirectory=/home/hebi 9 | ExecStart=/home/hebi/launch_demo 10 | StartLimitInterval=0 11 | User=hebi 12 | StandardOutput=syslog 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | -------------------------------------------------------------------------------- /kits/igor2/install/hebi_demo_wait_for_connected: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Change this to the network interface connected to the subnet containing the modules of your robot. 4 | DEPLOY_IFACE=eno1 5 | 6 | # Wait for connection to come up, if it is not already 7 | IF_ATTRS=$(ip a show $DEPLOY_IFACE 2>/dev/null | head -n1 | awk '{ print substr($3, 2, length($3)-2) }' | tr ',' ' ') 8 | iface_up=$(echo $IF_ATTRS | grep -e "[[:space:]]UP[[:space:]]" | wc -l) 9 | 10 | if [ $iface_up != 0 ]; then 11 | # Interface is up - we can exit 12 | exit 0; 13 | fi 14 | 15 | while [ 1 ]; do 16 | echo "Waiting for network interface '$DEPLOY_IFACE' to come up..." 17 | sleep 3 18 | 19 | IF_ATTRS=$(ip a show $DEPLOY_IFACE 2>/dev/null | head -n1 | awk '{ print substr($3, 2, length($3)-2) }' | tr ',' ' ') 20 | iface_up=$(echo $IF_ATTRS | grep -e "[[:space:]]UP[[:space:]]" | wc -l) 21 | 22 | if [ $iface_up != 0 ]; then 23 | # Interface is up - we can exit 24 | exit 0; 25 | fi 26 | done 27 | -------------------------------------------------------------------------------- /kits/igor2/install/launch_demo: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ./hebi_demo_wait_for_connected 4 | python3 ./hebi-python-examples/kits/igor2/igor2_demo.py 5 | -------------------------------------------------------------------------------- /kits/igor2/install/service_install: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | if [ $(whoami) != root ]; then 4 | echo "You must run this script as root."; 5 | exit 1 6 | fi 7 | 8 | DEMO_USER=hebi 9 | USER_HOME_DIR=/home/$DEMO_USER 10 | 11 | # make sure current working directory is where this script resides and hide output 12 | pushd $(readlink -f $(dirname $0)) >/dev/null 2>&1 13 | 14 | cp hebi-demo.service /etc/systemd/system/ 15 | # Reload all service files (scanning for new ones as well) 16 | systemctl daemon-reload 17 | # Check that systemd found the service 18 | FOUND_HEBI_SERVICE=$(systemctl list-unit-files | grep hebi-demo.service | wc -l) 19 | 20 | if [ "$FOUND_HEBI_SERVICE" -eq 0 ]; then 21 | echo "An error occurred while finding 'hebi-demo.service' - Was the service file installed properly?" 22 | exit 1 23 | fi 24 | 25 | # Copy shell scripts to home directory - also make sure to set executable bits 26 | cp hebi_demo_wait_for_connected $USER_HOME_DIR && chmod +x $USER_HOME_DIR/hebi_demo_wait_for_connected && chown $DEMO_USER:$DEMO_USER $USER_HOME_DIR/hebi_demo_wait_for_connected 27 | cp launch_demo $USER_HOME_DIR && chmod +x $USER_HOME_DIR/launch_demo && chown $DEMO_USER:$DEMO_USER $USER_HOME_DIR/launch_demo 28 | # Enable service to run on startup 29 | systemctl enable hebi-demo.service 30 | 31 | echo "Service installed." 32 | 33 | -------------------------------------------------------------------------------- /kits/igor2/resources/mobile_io_igor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/kits/igor2/resources/mobile_io_igor.png -------------------------------------------------------------------------------- /kits/igor2/resources/ps4_igor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/kits/igor2/resources/ps4_igor.png -------------------------------------------------------------------------------- /kits/tready/gains/gripper_spool_gains.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 | 5 | 15 6 | 0 7 | 0 8 | 0 9 | 0 10 | 1 11 | 0 12 | -inf 13 | inf 14 | 1 15 | -20 16 | 20 17 | 1 18 | 1 19 | 20 | 21 | 0.05 22 | 0 23 | 0 24 | 1 25 | 0 26 | 0.25 27 | 0 28 | -1.502675 29 | 1.502675 30 | 1 31 | -1 32 | 1 33 | 0.75 34 | 1 35 | 36 | 37 | 0.25 38 | 0 39 | 0.001 40 | 1 41 | 0 42 | 0.25 43 | 0 44 | -20 45 | 20 46 | 1 47 | -1 48 | 1 49 | 0.9 50 | 0 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /kits/tready/gains/tready-arm-gains.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 4 4 4 4 4 | 5 | 50 200 100 15 15 6 | 0 0 0 0 0 7 | 0 0.01 0 0 0 8 | 0 0 0 0 0 9 | 0 0 0 0 0 10 | 1 15 1 1 1 11 | 0 0 0 0 0 12 | -inf -inf -inf -inf -inf 13 | inf inf inf inf inf 14 | 1 1 1 1 1 15 | -40 -40 -40 -10 -10 16 | 40 40 40 10 10 17 | 1 1 1 1 1 18 | 1 1 1 1 1 19 | 20 | 21 | 0.03 0.3 0.03 0.01 0.01 22 | 0 0 0 0 0 23 | 0 0 0 0 0 24 | 1 1 1 1 1 25 | 0 0 0 0 0 26 | 0.25 0.25 0.25 0.25 0.25 27 | 0 0 0 0 0 28 | -1.790422 -1.79 -1.790422 -9.617128 -9.617128 29 | 1.790422 1.79 1.790422 9.617128 9.617128 30 | 1 1 1 1 1 31 | -1 -1 -1 -1 -1 32 | 1 1 1 1 1 33 | 0.75 0.75 0.75 0.75 0.75 34 | 1 1 1 1 1 35 | 36 | 37 | 0.1 0.1 0.1 0.1 0.1 38 | 0 0 0 0 0 39 | 0.0001 0.0002 0.0001 0.0001 0.0001 40 | 1 1 1 1 1 41 | 0 0.1 0 0 0 42 | 0.25 0.25 0.25 0.25 0.25 43 | 0 0 0 0 0 44 | -40 -40 -40 -10 -10 45 | 40 40 40 10 10 46 | 1 1 1 1 1 47 | -1 -1 -1 -1 -1 48 | 1 1 1 1 1 49 | 0.9 0.9 0.9 0.9 0.9 50 | 0 0 0 0 0 51 | 52 | 53 | -------------------------------------------------------------------------------- /kits/tready/hrdf/R8-16_reverse.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /kits/tready/hrdf/Tready.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /kits/tready/hrdf/Tready_track.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /kits/tready/hrdf/tready-7dof-arm.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /kits/tready/hrdf/tready-arm-5DoF.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /kits/tready/hrdf/tready-arm-A2085-06G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /kits/tready/hrdf/tready-arm-A2240-06G.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /kits/tready/hrdf/tready-arm.hrdf: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /lib/win_x64/SDL2.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/lib/win_x64/SDL2.dll -------------------------------------------------------------------------------- /lib/win_x86/SDL2.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HebiRobotics/hebi-python-examples/1abb3188907b7ac0e4b1e4965477f30683a2e782/lib/win_x86/SDL2.dll -------------------------------------------------------------------------------- /util/__init__.py: -------------------------------------------------------------------------------- 1 | __all__ = ['math_utils', 'type_utils'] 2 | -------------------------------------------------------------------------------- /util/type_utils.py: -------------------------------------------------------------------------------- 1 | import hebi 2 | 3 | 4 | def assert_callable(val, what='function'): 5 | """ 6 | :param val: 7 | :param what: 8 | """ 9 | if not hasattr(val, '__call__'): 10 | raise TypeError('{0} is not a callable object (does not have __call__)'.format(what)) 11 | 12 | 13 | def assert_type(val, type_, what='input'): 14 | """ 15 | :param val: 16 | :param type_: 17 | :param what: 18 | """ 19 | if type(val) != type_: 20 | raise TypeError('{0} must be of type {1}'.format(what, type_.__name__)) 21 | 22 | 23 | def assert_range(val, infimum, supremum, what='index', l_inclusive=True, u_inclusive=False): 24 | """ 25 | :param val: 26 | :param infimum: 27 | :param supremum: 28 | :param what: 29 | :param l_inclusive: 30 | :param u_inclusive: 31 | """ 32 | if l_inclusive: 33 | l_str = '[' 34 | in_range = val >= infimum 35 | else: # exclusive 36 | l_str = '(' 37 | in_range = val > infimum 38 | 39 | if u_inclusive: 40 | u_str = ']' 41 | in_range = in_range and val <= supremum 42 | else: # exclusive 43 | u_str = ')' 44 | in_range = in_range and val < supremum 45 | 46 | if not in_range: 47 | raise IndexError('{0} ({5}) out of range {1}{2},{3}{4}'.format( 48 | what, l_str, infimum, supremum, u_str, val)) 49 | 50 | 51 | def assert_prange(val, supremum, what='index'): 52 | """ 53 | :param val: 54 | :param supremum: 55 | :param what: 56 | """ 57 | assert_range(val, 0, supremum, what=what) 58 | --------------------------------------------------------------------------------