├── .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 | #
10 |
11 |
12 |
16 |
17 |
21 |
22 |
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 | 
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 | 
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 |
8 |
11 |
14 |
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 |
8 |
11 |
14 |
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 |
9 |
10 |
14 |
15 |
19 |
20 |
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 |
--------------------------------------------------------------------------------