Changelog
Trossen Arm Driver
1.10.0
Replaced the built-in
spdlogdependency with a custom logging frontend, and exposed a backend hook so users can plug in the logging library of their choice. Related example scripts demonstrate how to usespdlogin C++ or the standardloggingmodule or loguru in Python. See the error_recovery_and_logging demo for details.Fixed parsing of some error messages surfaced from the OS, e.g., now you should get
Failed to send UDP message to 192.168.1.2:50000 due to Network is unreachableinstead ofdue to Success.trossen_arm::StandardMotorParameters::wxai_v0_defaultnow aliasestrossen_arm::StandardMotorParameters::wxai_v0_20260317, completing the default parameter change announced in v1.9.3. The same gains ship as the boot defaults in Arm Controller firmware v1.10.0, so arms running matched firmware and driver use the new tuning out of the box. The correspondingtrossen_arm::Notice::default_motor_parameters_20260317has been suppressed.
1.9.3
Added
trossen_arm::TrossenArmDriver::discover(), a static method that scans a subnet for reachable arm controllers and returns atrossen_arm::DiscoverResultfor each one with its model, firmware version, IP, and error state. Demonstrated in the arm_discovery demo.Promoted
trossen_arm::ErrorStateand thetrossen_arm::ERROR_INFORMATION,trossen_arm::MODEL_NAME, andtrossen_arm::MODE_NAMEmaps from private to public so user code can render error and identifier strings.Added a
trossen-armcommand-line tool withdiscover,identify, andusagesubcommands. Install it alongside the Python package viapip install "trossen_arm[cli]".trossen_arm::TrossenArmDriver::configure()now respects smalltimeoutvalues without depending on operating system’s TCP connection timeout.Added
trossen_arm::TrossenArmDriver::clear_error(), a convenience method that internally callstrossen_arm::TrossenArmDriver::cleanup()withreboot_controller = falseand thentrossen_arm::TrossenArmDriver::configure()withclear_error = true.Added
trossen_arm::StandardMotorParameters, a collection of named, dated motor parameter sets that can be passed totrossen_arm::TrossenArmDriver::set_motor_parameters()instead of hand-tuning gains. The currently shipped sets aretrossen_arm::StandardMotorParameters::wxai_v0_20250509andtrossen_arm::StandardMotorParameters::wxai_v0_20260317, withtrossen_arm::StandardMotorParameters::wxai_v0_defaultaliasing whichever set is the current default. Demonstrated in the set_motor_parameters demo.Added a notice system for surfacing one-time messages from the driver at startup. Each notice can be silenced individually by calling
trossen_arm::TrossenArmDriver::disable_notice()with the correspondingtrossen_arm::Noticevalue before constructing the driver.Issued
trossen_arm::Notice::default_motor_parameters_20260317: the default motor parameters will change fromtrossen_arm::StandardMotorParameters::wxai_v0_20250509totrossen_arm::StandardMotorParameters::wxai_v0_20260317in the next minor release (v1.10.0). To opt in early or pin to the old defaults, set motor parameters explicitly as in the set_motor_parameters demo.Switching into
trossen_arm::Mode::velocity,trossen_arm::Mode::external_effort, ortrossen_arm::Mode::effortnow starts from a zero command instead of seeding from the latest measurement, preventing unintended motion at the moment the mode changes.Fixed two interpolation issues that caused unstable motion when trajectory goals were updated at a rate close to the trajectory evaluation rate:
Trajectory start time is now anchored to the moment
robot_input_is evaluated, so consecutive trajectories remain continuous across transitions regardless of host scheduling.Pre-run inverse-kinematics feasibility checking on Cartesian trajectories is now opt-in (previously on by default), removing a substantial per-call cost in tight control loops.
Very short trajectory durations are handled robustly: under 1 ms uses a step, under 200 ms uses linear interpolation, otherwise uses linear, cubic, and quintic interpolations for effort, velocity, and position commands with feed-forward terms default to zero when not specified.
Fixed a race in spdlog logger registration that could throw when multiple
trossen_arm::TrossenArmDriverinstances were constructed concurrently from different threads.Fixed a segfault in the C++ demos: https://github.com/TrossenRobotics/trossen_arm/pull/179.
The C++ demo template now uses a guarded
find_package(libtrossen_arm), so a standalone demo build no longer fails when the package is not pre-installed.
1.9.1
Removed the following deprecated getter functions from both C++ and Python APIs. Use the
get_all_*variants instead:get_positions->get_all_positionsget_velocities->get_all_velocitiesget_efforts->get_all_effortsget_external_efforts->get_all_external_effortsget_compensation_efforts->get_all_compensation_efforts
All
get_*functions now return copies instead ofconstreferences. This prevents dangling reference issues when the underlying data is updated by the daemon thread.TCP send and receive timeouts are now both applied using the user-specified timeout value.
Fixed an uncaught exception during Ethernet connection handling.
Added wheel builds for Python 3.13 on Linux (x86_64 and arm64) and macOS (Apple Silicon).
All
criticallog messages now append a link to the troubleshooting guide athttps://docs.trossenrobotics.com/trossen_arm/main/troubleshooting.html.On successful connection, the driver now logs the client IP address along with the TCP and UDP port numbers.
1.9.0
Moved position_offset to EEPROM so it persists across power cycles as other joint characteristics.
Added
trossen_arm::RobotOutput::Headerthat containstrossen_arm::RobotOutput::Header::idandtrossen_arm::RobotOutput::Header::timestamp.
1.8.8
Warned instead of throwing an exception at calling
trossen_arm::TrossenArmDriver::set_end_effector()when the gripper joint is in position mode.
1.8.7
Added a temporary implementation for position_offset. Different from its fellow joint characteristics, it currently initializes to zeros at driver configuration and resets at cleanup. This peculiarity will be addressed in the next minor update.
Threw exceptions when setting configurations that may cause sudden movements while joints are in position mode. The following methods are affected:
1.8.6
Fixed a deadlock introduced in 1.8.4 with the new logging system. Please update to this version if the driver hangs when throwing an exception in Python.
Added a new demo gravity_compensation_partial demonstrating how to compensate for a portion of the gravity.
Relaxed NumPy requirement from
>= 2.0.0to>= 1.22.4.
1.8.5
Fixed an issue in the C++ driver where some of the configuration getters would fail due to internal logic errors.
1.8.4
Added the
trossen_arm::TrossenArmDriver::get_is_configured()method that returns whether the driver is configured or not.C++ libraries are now built on Ubuntu 20.04 to maintain compatibility with older Linux distributions.
spdlog is now used for logging for the C++ library and its capabilities are exposed to Python for use with the Python logging module. This allows users to configure the driver’s logging level, format, and preferred sinks. See the error_recovery_and_logging demo for usage.
Added a demo for finetuning joint characteristics. It is available in joint_characteristics_finetune.
1.8.3
Added new models
trossen_arm::Model::vxai_v0_leftandtrossen_arm::Model::vxai_v0_right. These models are 7-DOF arms to be released in the future. All features except for the Cartesian space inputs are supported.Adjusted UDP message lost logging behavior to avoid flooding the terminal. The driver now only warns when there are more than 1000 messages lost among each 5000 messages.
Added initial implementation for custom end effectors. The original rack-and-pinion gripper can be removed or replaced with a custom end effector. For more details, see End Effector.
1.8.2
Moved the default tool frame from a point on the contacting surfaces to the tips of the fingers.
Added pre-run trajectory check to
trossen_arm::TrossenArmDriver::set_cartesian_positions(). Now the driver by default samples 1000 points on the trajectory and checks if they have the corresponding inverse kinematics solutions before moving.Added a demo for configuring joint limits. It is available in set_joint_limits.
Fixed two issues related to mixed interpolation spaces and updated the demo mixed_interpolation_space.
Using joint space commands immediately after Cartesian space commands no longer causes unexpected behavior. (trossen_arm#78)
Using Cartesian space commands immediately after setting to the corresponding mode no longer causes unexpected behavior.
Warning
Trossen Arm Driver 1.8.1 has been yanked due to potentially unsafe behavior on mode switching.
1.8.1
Updated mode switching logic to no longer skip joints whose mode did not change.
This resolves trossen_arm#71, which caused unexpected arm movement during mode transitions.
The root cause was that the interpolation space resets to joint mode, requiring the interpolator to also reset. Without this, Cartesian values could be incorrectly interpreted as joint values.
Warning
Trossen Arm Driver 1.8.0 has been yanked due to potentially unsafe behavior on mode switching.
1.8.0
Added a new
trossen_arm::Mode::effortmode. It allows commanding the effort of the joints without any built-in compensation like in thetrossen_arm::Mode::external_effortmode. This mode is useful for applications where full control of the joint efforts is desired.Grouped the outputs into a single new class
trossen_arm::RobotOutputand added the additional fields below:Added helpful output getters to extract the members of
trossen_arm::RobotOutput.trossen_arm::TrossenArmDriver::get_gripper_external_effort()trossen_arm::TrossenArmDriver::get_cartesian_external_efforts()trossen_arm::TrossenArmDriver::get_all_compensation_efforts()trossen_arm::TrossenArmDriver::get_arm_compensation_efforts()trossen_arm::TrossenArmDriver::get_gripper_compensation_effort()trossen_arm::TrossenArmDriver::get_joint_compensation_effort()trossen_arm::TrossenArmDriver::get_gripper_rotor_temperature()trossen_arm::TrossenArmDriver::get_joint_rotor_temperature()trossen_arm::TrossenArmDriver::get_all_driver_temperatures()trossen_arm::TrossenArmDriver::get_arm_driver_temperatures()trossen_arm::TrossenArmDriver::get_gripper_driver_temperature()trossen_arm::TrossenArmDriver::get_joint_driver_temperature()
The old getters are deprecated and will be removed in the next major release.
trossen_arm::TrossenArmDriver::get_positions()trossen_arm::TrossenArmDriver::get_velocities()trossen_arm::TrossenArmDriver::get_efforts()trossen_arm::TrossenArmDriver::get_external_efforts()trossen_arm::TrossenArmDriver::get_compensation_efforts()
Added methods for commanding Cartesian inputs with respect to a tool frame. These features are demonstrated in the scripts listed below:
Added the capability to soft reboot the controller via the driver. This feature is demonstrated in set_factory_reset_flag.
Added more configurations and revised some previous ones.
Added
Removed
continuity_factorintrossen_arm::JointCharacteristict_max_factorintrossen_arm::EndEffector
Made driver-controller connection more user-friendly with retry, timeout, and allowing interruption.
For C++ users,
doubleis now used instead offloatfor all the data types. This improves compatibility with other modern libraries.
Trossen Arm Controller Firmware
1.10.0
Set the
trossen_arm::StandardMotorParameters::wxai_v0_20260317motor parameters as default.
1.9.4
Switching into
trossen_arm::Mode::velocity,trossen_arm::Mode::external_effort, ortrossen_arm::Mode::effortnow starts from a zero command instead of seeding from the latest measurement, preventing unintended motion at the moment the mode changes.Lowered sensitivity to transient CAN bus failures by triggering motor feedback error on two consecutive lost messages instead of one.
1.9.3
Fixed an issue where the controller would sometimes fail to ignore invalid UDP packets, leading to unexpected behavior.
1.9.2
Minor improvements to user experience.
1.9.1
Fixed an issue introduced in v1.9.0 where the controller would throw an error if the gripper was not detected. The controller now behaves as in previous versions if the gripper is not used.
1.9.0
Moved position_offset to EEPROM so it persists across power cycles as other joint characteristics.
Added
trossen_arm::RobotOutput::Headerthat containstrossen_arm::RobotOutput::Header::idandtrossen_arm::RobotOutput::Header::timestamp.In multi-motor joints, following motors copy leading motor’s command instead of running independently.
Bug fixes for multi-motor joint logic.
1.8.4
Fixed an issue where, when the gripper was not used, NaN external effort output was reported for the joint. External effort output is now fixed at 0 for the gripper joint when the gripper is not used.
1.8.3
Refactored the model definition to reduce repeated logic for different motors.
Added the new models.
Allowed removing the original rack-and-pinion end effector or replacing it with a custom one.
1.8.2
Update default configurations to more reasonable values.
Increased
trossen_arm::JointLimit::velocity_maxfor the wrist joints from 2 \(\pi\) rad/s to 3 \(\pi\) rad/s.Increased
trossen_arm::PIDParameter::imaxintrossen_arm::Mode::idlemode for joint 1 from 9 Nm to 27 Nm so the arm can hold itself when extended horizontally.
1.8.1
Skip limit checks in idle mode.
1.8.0
Added the associated interface for the new effort mode.
Added rotor and driver temperatures to the output.
Added the associated interface for soft reboot.
Exposed the associated interfaces for the new configurations.
Added checks on outputs according to the joint limits and on inputs for infinite values.
Removed deprecated continuity check.
The connection, disconnection, and data exchange is now handled more robustly.
UDP is only used for control and TCP handles the rest of the communication.
The controller now return to idle mode if the connection is lost.
The controller now only accept one driver at a time.
Revised default configurations to more reasonable values, more specifically