Skip to content

CHANGELOG

1. Version 5.1.6

Release date: 2025.06.16

1.1 New Features

  • [Data Collection] (!186): Enable fully open length control of G2 using E2/PE2 through remapping. If using old end effector or need special configuration, please modify parameters in config_full.yaml.
  • [Data Collection]: Update data recording methods using MCAP file format.
  • [Data Collection]: Use a simple bootstrap script to configure the system parameters for data collection. The usage of data collection can be found in the data collection documentation
  • [Model Reproduction]: Add model reproduction support for PI0 and ACT. Refer to the PI0 model reproduction documentation and ACT model reproduction documentation for more details.

1.2 Bug Fixes

  • [SDK] (!304): Fix firmware version display error at order and old dm motor.
  • [Control Service] (!306): Fix the issue that arm with old G2 use error gravity compensation parameters.

2. Version 5.1.5

Release date: 2025.06.13

2.1 New Features

  • [SDK] (!228): Add firmware version info in get_product_info method.

2.2 Bug Fixes

  • [Control Service] (!285): Fix the value of d6 of play with E2B from 0.1488 to 0.1488995. Fix the issue that some reasonable pose cannot be accepted due to validation error.
  • [Control Service] (!291): Fix the issue that the inverse kinematics solution may fail at some poses when first launched.
  • [Control Service]: Fix the issue that E2 got inaccurate position of open length.
  • [Firmware]: Fix the issue that position calibration will not release DM motors which may cause collision.

3. Version 5.1.4

Release date: 2025.05.28

3.1 New Features

  • [Control Service]: Add support for directly MIT control.

3.2 Bug Fixes

  • [SDK] (!251, !254): Remove unimplemented method servo_eef_force.
  • [SDK: CPP Client] (!289): Fix the issue that the MoverEefPos method cannot be used to move end effector.
  • [SDK: CPP Client] (!297): Fix the issue that the GetMode method and GetControlMode method have duplicated functionality and remove the GetMode method.

4. Version 5.1.3

Release date: 2025.05.21

4.1 New Features

  • [Firmware, Control Service]: Add home position setting for motor, which will be used when stop the control service or position calibration.
  • [SDK: Cpp Client]: Add Cpp SDK.

4.2 Bug Fixes

  • [Firmware] (!278): Fix the issue that position of motor will lost after restart power without unplugging USB cable.
  • [Control Service]: Fix the issue that the control service cannot be launched on X5 RDK with G2.
  • [Configuration] (!277): Fix the issue that the can rules are removed after package upgrade.

5. Version 5.1.2

Release date: 2025.05.09

5.1 New Features

  • [Firmware]: Add support for manual zero point reference calibration. To trigger the calibration, press and hold the base board button for 3 seconds when the AIRBOT Play is not controlled by any control service.
  • [Control Service]: Add log dumpping. Now launching control service via airbot_fsm or airbot_server will automatically create a log folder airbot_logs and dump the logs in airbot_logs/<TIMESTAMP> folder. The logs are also dumped to the console.
  • [Configuration]: Add idleness check for airbot_fw_upgrade. Now the upgrade would fail to start if AIRBOT Play is currently being used by another process.

5.2 Bug Fixes

  • [Documentation] (!271): Fix the broken url at the intro page.
  • [Documentation] (!247): Add missing specification of the control modes in which the control service should be before calling respective control methods.
  • [Control Service] (!266): Fix the issue that occasionally gripper cannot be controlled via short press on end button when in free-drive state of record-replay APP.
  • [Control Service] (!245): Fix the issue that fingers of G2 would rebound when closing the gripper in the record-replay APP.
  • [SDK: Examples] (!232): add support for servo_joint_vel mode in airbot_examples.switch_mode example.
  • [SDK: Python Client] (!253): Forcing argument type checks in all SDK methods. This is to prevent the user from passing in incorrect types of arguments, which may cause the robot to behave unexpectedly.
  • [SDK: Python Client] (!235): Remove get_eef_vel method as not planned.
  • [SDK: Python Client] (!219): Fix the issue that move_with_cart_waypoints would raise exception immediately after the method is called.
  • [Control Service] (!276): Fix the issue that simultaneously launching more than 3 control services would cause the last one to fail.
  • [Configuration] (!268): Fix the issue that the bizzarre display of progress bar when upgrading firmware via airbot_fw_upgrade command.

6. Version 5.1.1

Release date: 2025.05.07

6.1 New Features

  • [SDK: Python Client]: Add parameter update example with Python SDK. This example will update the parameters of the robot and print the updated parameters. The example can be run with the following command:
    # The parameters are passed in as a JSON string
    python3 -m airbot_examples.set_params '{"dm_motor_can1_5.enable_protected_mode": true}'
    # Or with shortcut,
    arm_set_params '{"dm_motor_can1_5.enable_protected_mode": true}'
    
  • [SDK: Python Client]: Add shortcuts for examples. Starting from this version, you can run examples with the following commands:

    # For example, keyboard control example can be launched with:
    arm_kbd_ctrl -u <URL> -p <PORT>
    # Instead of
    python3 -m airbot_examples.task_kbd_ctrl -u <URL> -p <PORT>
    
    Supported examples are:

    Example Shortcut Launch via Python module
    Keyboard control arm_kbd_ctrl python3 -m airbot_examples.task_kbd_ctrl
    Motion following arm_follow python3 -m airbot_examples.task_follow
    Switch control mode arm_switch_mode python3 -m airbot_examples.switch_mode
    Load app arm_load_app python3 -m airbot_examples.app_load
    Unload app arm_unload_app python3 -m airbot_examples.app_unload
    Print joint position arm_joint_state python3 -m airbot_examples.get_joint_pos
    Print end pose arm_end_pose python3 -m airbot_examples.get_end_pose
    Parameter query arm_get_params python3 -m airbot_examples.get_end_pose
    Parameter update arm_set_params python3 -m airbot_examples.set_params
    Move end effector to a cartesian pose arm_move_cart_pose python3 -m airbot_examples.move_cart_pose
    Move to a set of joint angles arm_move_joint python3 -m airbot_examples.move_joint_pos
    Move along a set of cartesian waypoints arm_move_cart_waypoints python3 -m airbot_examples.move_with_cart_waypoints
    Move along a set of joint waypoints arm_move_joint_waypoints python3 -m airbot_examples.move_with_joint_waypoints
    Swing example: continuous swing in joint space arm_example_swing python3 -m airbot_examples.task_swing
    Wipe example: continuous wipe in cartesian space arm_example_wipe python3 -m airbot_examples.task_wipe
  • [System Configuration] Add airbot_server as an alias for airbot_fsm, airbot_fw_upgrade as an alias for airbot_iap, and airbot_bind_device as an alias for bind_airbot_device in the airbot-configure package. This is to make the command names more user-friendly and easier to remember.

  • [System Configuration] Add a new firmware upgrade tool. Now the firmwares of AIRBOT arm series are shipped as a whole package inside the container image, and the package can be burned directly with one command:
    airbot_fw_upgrade
    # Or
    airbot_fw_upgrade -i <INTERFACE> -f <FILEPATH>
    
  • [System Configuration] With the new upgrade tool, the time required to upgrade the firmware for the whole arm is shortened to less than 2 minutes.
  • [Documentation] Add concept sections to describe the internal states of the control services

6.2 Bug Fixes

  • [Control Service]: Fix the issue that control service cannot read states of AIRBOT Replay.
  • [Control Service]: Disable collision protection introducted in 5.1.0 by default.
  • [System Configuration]: Fix the issue that device name bindings created by bind_airbot_device are removed after package upgrade.

7. Version 5.1.0

Release date: 2025.04.29

7.1 Breaking Changes

  • [System Configuration]: The argument of airbot_fsm command to specify control port is changed from -P to -p to align with SDK. -P will now specify the product type.
  • [Control Service]: The home position of the arm is changed to a new position, in order to avoid collision between end effector and the robot itself. The new home position is:
robot.set_joint_pos([0.0, -1.184, 1.184, -math.pi / 2, math.pi / 2, 0.0])

in which links are either parallel or perpendicular to the ground. The new home position is also the default position to go to after the zero point reference is calibrated. * [Control Service]: Add support for motor firmware version 5015. Motor firmware version 5015 addresses the critical issue of short-time twitching when switching mode to gravity compensation. To upgrade motor #4-#6 to 5015 version, a special set of hardware upgrading tools is required. Please contact AIRBOT support for more information.

7.2 New Features

  • [Control Service]: Largely reduce the image size of the control server. Now the image size is about 620MB, which is about 1/6 of the original size.
  • [Control Service]: If the zero position reference needs to be calibrated when the control server is launched, the control server will wait for calibration to complete before subsequent operations.
  • [Control Service]: Add enable_protected_mode bool parameter to enable/disable the collision protection of the motors. This feature is enabled by default. The parameter can be set by the Python SDK:
    # For motor #1 - #3, the param name start with "od_motor_<INTERFACE>_<INDEX>"
    robot.set_params({"od_motor_can1_2.enable_protected_mode": True})
    # For motor #4 - #6, the param name start with "dm_motor_<INTERFACE>_<INDEX>"
    robot.set_params({"dm_motor_can1_5.enable_protected_mode": False})
    
  • [SDK: Python Client]: Add URL argument (-u) to specify the URL of the control server. This allows you to control AIRBOT Pro, and also another robot from a remote location.
  • [System Configuration]: Add bind_airbot_device command (shipped with airbot-configure deb package) to bind the AIRBOT device with certain interface name. After binding, the device will be recognized by the system with the specified name. This is useful when you have multiple AIRBOT devices connected to the same host and want to distinguish them by name.
    # In this example, the connected device is bound to the name "can_tbw"
    # sudo bind_airbot_device
    Detecting connected USB2CAN devices...
    Detected USB2CAN devices:
    1. 002/034
    Serial number: 205B334C5543
    Enter desired CAN interface name for device with serial number 205B334C5543 (e.g., can_left) or press Enter to skip this device: can_tbw
    udev for can_tbw created in /etc/udev/rules.d/91-usb-slcan-airbot.rules
    Udev rules reloaded successfully. Reconnect your USB2CAN devices.
    

7.3 Bug Fixes

  • [Control Service]: Fix the issue that the control service is not able to control AIRBOT Play lite.
  • [Control Service]: Fix the critical issue of control server misbehaving when the gravity compensation parameters are not calibrated. Now service checks the presence of the parameters, and will NOT start if the parameters are not calibrated.
  • [Control Service]: (fixed only for motor firmware 5015) Fix the issue of short-time twitching when motor #4-#6 enters protection state or gravity compensation state.
  • [Control Service]: Fix the issue of RecoredAndRecord not able to exit in ReplayWaiting mode.
  • [SDK: Server]: Fix the issue of returning False but still moving afterwards in waypoint control mode.
  • [SDK: Server]: Fix the issue of not resetting with multiple parts of path planning.
  • [System Configuration] Fix the issue of interference between multiple control servers in the same subnet. It is not necessary to set ROS_DOMAIN_ID variable now.

7.4 Known Issues

  • [Control Service]: AIRBOT Play Lite is using URDF of AIRBOT Play right now.

8. Version 5.0.9

Release date: 2025.04.17

8.1 Control Services

8.1.1 New Features

  • Largely optimize the performance of control server, now the CPU usage is reduced to less than half of the original.
  • Largely optimize launch time of control server, now the launch time is about 8 seconds with x86_64 host and 15 seconds on X5 RDK.
  • New feature: maximum torque protection during arm operation
  • This feature is intended to prevent the robot from severely damaging surrounding environment and is NOT a guarantee of absolute safety. It is strongly discouraged to solely rely on this feature to conduct any human-related interactions.
  • This feature also prevents motor from entering overload or over-temperature state.
  • The maximum torque can be set by the Python SDK:
    # For motor #1 - #3, the param name start with "od_motor_<INTERFACE>_<INDEX>"
    robot.set_params({"od_motor_can1_2.over_effort_thres": 10.0})
    # For motor #4 - #6, the param name start with "dm_motor_<INTERFACE>_<INDEX>"
    robot.set_params({"dm_motor_can1_5.over_effort_thres": 5.0})
    
  • The default threshold for motor #1 - #3 is 5.0 and for motor #4 - #6 is 2.0.
  • New feature: offline replaying
  • Paths recorded in the record-replay app can not be downloaded to AIRBOT Play and be played without external control services.
    • Double press base board button in Idle mode (constant cyan light effect)
    • During downloading, the light effect is rainbow
    • When downloading completes, the light effect returns to cyan
  • To replay the path once (in offline mode), long press the base board button when USB cable is unplugged (constant white light effect)
    • During replaying, the light effect is rainbow
    • When replaying completes, the light effect returns to constant white
  • To replay the path indefinitely (in offline mode), double press the base board button when USB cable is unplugged (constant white light effect)
    • During replaying, the light effect is rainbow
    • To interrupt the replaying, press once on the base board button, AIRBOT Play will wait for the current path to finish and then returns to home position and then stops
  • New feature: waypoint control mode:
  • Two new control modes are added: PLANNING_WAYPOINTS_PATH and PLANNING_WAYPOINTS
    • PLANNING_WAYPOINTS_PATH: Perform linear interpolation between waypoints in cartesian space, then execute the path without stopping.
    • PLANNING_WAYPOINTS: Perform local planning between adjacent waypoints, join the planned paths then execute the path. Deceleration may occur near waypoints.
  • Two new Python SDK methods are added: move_with_cart_waypoints and move_with_joint_waypoints
    • move_with_cart_waypoints: move the robot arm along a series of cartesian waypoints.
    • move_with_joint_waypoints: move the robot arm along a series of joint space waypoints.
    • please refer to Python SDK reference for detailed usage.
  • Two SDK examples are added: move_with_cart_waypoints and move_with_joint_waypoints for demonstration of newly added SDK methods.
    • python3 -m airbot_examples.move_with_cart_waypoints
    • python3 -m airbot_examples.move_with_joint_waypoints

8.1.2 Bug Fixes

  • Replace RNE (Recursive Newton-Euler) with deterministic analytical inverse kinematics solution. This solves the wrist flipping issue in previous versions.
  • Add check during launch to ensure that for each robot only one control service is currently running
  • Add check during launch to ensure that the same CAN bus is not occupied by multiple processes
  • Fix the issue of false alarming zero point reference loss when power is unplugged but USB cable is not unplugged
  • Fix the jitter issue when performing offline replay
  • Fix the light effect:
  • The light effect changes from constant green to constant white when powered on but no USB cable is plugged in
  • Fix the issue of incorrect zero point reference reset of E2 when powered on.
  • The E2 zero point reference is now calibrate at the factory (using the new production tool) and is not affected by the power on state.
  • Fix the precision issue of the URDF model. Lower the possibility of false positive collision detection.

8.2 Python SDK

8.2.1 New Features

8.2.2 Bug Fixes

  • task_kbd_ctrl: Align the home position of the arm with the home position when cleaning up.

9. Version 5.0.8

Release date: 2025.04.10

9.1 Python SDK

9.1.1 New Features

  • Add airbot_py.arm.SpeedProfile class to set speed profile for arm. Now the speed of the arm can be altered by robot.set_speed_profile(SpeedProfile.DEFAULT). Currently supported speed profiles are:
    • SpeedProfile.SLOW
    • SpeedProfile.DEFAULT
    • SpeedProfile.FAST: May move too fast. Use at your own risk!
  • Add get_params and set_params method to read / write parameters for internal nodes. Useful parameters:
    • servo_node.moveit_servo.scale.linear: linear speed scale in servo control modes
    • servo_node.moveit_servo.scale.rotational: rotational speed scale in servo control modes
    • servo_node.moveit_servo.scale.joint: joint speed scale in servo control modes
    • sdk_server.max_velocity_scaling_factor: velocity scale in planning control modes
    • sdk_server.max_acceleration_scaling_factor: acceleration scale in planning control modes
  • Add get_product_info method to obtain internal product information (product type, serial number, etc.)
  • Add exception handler to print details of exceptions in a human-readable format.
  • Add logging config for examples
  • Add end effector control in keyboard control example (using [ and ] to control)
  • Add speed profile switch in keyboard control example (using ENTER to switch)
  • Add joint-space and cartesian-space switch in keyboard control example (using SPACE to switch)
  • Add joint-space control in keyboard control example (using 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, -, = to control)
  • Add speed profile arguments in examples -S [fast, default, slow]
  • Add product information print in get examples (get_joint_pos and get_end_pose)
  • Add position syncing before following in the task_follow example

9.1.2 Bug Fixes

  • Fix None returned by get_joint_eff
  • Use enum class RobotMode to replace plain integer to represent robot mode. Output of robot.get_control_mode() is now RobotMode instead of integer.
  • Use enum class State to replace plain integer to represent robot state. Output of robot.get_state() is now State instead of integer.
  • Unify the interfaces of end effector, now list[float] is passed and returned for get_eef_pos, set_eef_pos and servo_eef_pos.
  • Add support for Python 3.8 (to support Ubuntu 20.04)
  • Fix the incorrect always-true return value of load_app and unload_app methods.
  • Fix the exception raised by servo_eef_pos and move_eff_pos

9.2 Control Service

9.2.1 Bug Fixes

  • Slow down the speed of the arm on exit when returning to the starting point
  • Add torque limit to end effector controller to prevent motor entering overload or over-temperature state.
  • Fix the bugs when trying to load record_replay_app
  • Disable internal singularity check in moveit2, to avoid stuck when in servo control modes.
  • Fix possible timeout when sending planning request in PLANNING_POS mode

9.3 Shipping

9.3.1 New Features

Based on the 5.0.8 version of airbot-configure,

  • airbot_fsm is available now to launch control server in a docker container:
    airbot_fsm -i <INTERFACE> -P <PORT>
    
  • airbot_iap is available now to upgrade the firmware of the boards.

    Firmware upgrade must not run simultaneously with control server!

    airbot_iap -f <FILEPATH> -d <INTERFACE> --mask <INDEX> -t <TARGET>
    

9.3.2 Bug Fixes

  • Use 199 as the default ROS Domain ID to avoid conflict with other ROS 2 nodes.