2. Status Dashboard and Instructions
2.1. Status Dashboard
The status dashboard is essentially a controller named “fairino_hardware_state_broadcaster” that starts automatically with the plugin by default. It monitors all status feedback interfaces within the plugin at a frequency of 500 Hz and publishes the data as topics, with the message type name being “fairino_hardware_state_broadcaster/msg/HardwareState”.
Table 2-1 Specific Message Definitions
Field Name |
Data Types |
Physical Meaning and Business Interpretation |
Header |
std_msgs/Header |
Includes timestamp and coordinate system information for high-precision time synchronization of data frames. |
joint_names |
string[] |
Joint name. Corresponds to the joint name defined in the URDF to ensure data mapping remains in correct order. |
errorcode |
int32[] |
Single-axis servo error code. Records the independent alarm status of each joint driver (e.g., single-axis overload/encoder abnormality). |
position |
float64[] |
Actual position feedback. The motor’s true position reading (in rad or m). |
velocity |
float64[] |
Actual speed feedback. The motor’s true speed reading (in rad/s or m/s). |
effort |
float64[] |
Actual current/torque feedback. Estimated actual output force of the motor. |
sensortorque |
float64[] |
Sensor torque feedback. If equipped with dual encoders or external joint torque sensors, this represents the actual physical torque. |
stateword |
uint16[] |
Servo Status Word. Strictly conforms to the EtherCAT CiA 402 standard state machine dictionary (e.g., 0x0237 indicates Operation Enabled). |
opmode |
int32[] |
Servo operation mode. For example, 8 represents CSP (Cyclic Synchronous Position), and 10 represents CST (Cyclic Synchronous Torque). |
command_position |
float64[] |
Command position. The target position for this joint recently issued by the ROS 2 controller. Subtracting it from “position” yields the “tracking error.” |
command_velocity |
float64[] |
Command velocity. The feedforward velocity commanded by the ROS 2 controller. |
command_torque |
float64[] |
Command torque. The target feedforward torque issued by the ROS 2 controller. |
version_major |
float64 |
Major version number. The core major version of the underlying hardware or firmware. |
version_minor |
float64 |
Minor version number. Functional update iteration number. |
version_minor2 |
float64 |
Revision number. Minor patch or bug fix number. |
hex_error_code_current_error_code |
int32 |
Current system fatal/operational fault code. Corresponds to a 32-bit hexadecimal code. When non-zero, immediately triggers full-arm brake engagement and dumps a fault snapshot. |
hexerrorcode_curwarncode |
float64 |
Current system general warning code. Corresponds to a 32-bit hexadecimal code (e.g., trajectory peak clipping triggered). Recorded and reported only; does not interrupt motion. |
generalio_di |
uint32 |
General-purpose digital input (DI). Represents the status of multiple digital inputs (e.g., safety door, external button) via a 32-bit binary mask. |
generalio_ai |
float64 |
General-purpose analog input (AI). Digital reading of analog signals in the range of 0–10 V or 4–20 mA. |
Interface485_Feedback485 |
float64 |
RS-485 interface feedback: Used for reading back communication data from end-effector smart grippers or external serial sensors. |
interfacecan_feedbackcan |
float64 |
CAN bus interface feedback. Peripheral communication data or status feedback from expanded CAN nodes. |
interfacesdo_sdoreaddata |
float64 |
SDO reads data. Parameter values returned after querying the EtherCAT acyclic data object (SDO) dictionary. |
interfacesdo_sdostatus |
float64 |
SDO communication status. Indicates whether the SDO asynchronous read/write request has successfully handshaked or encountered an error. |
interfaceGripper1_act |
float64 |
The act status of the left-arm gripper ( requires an arm model with an end plate ) |
interfaceGripper1_id |
float64 |
The id( of the left-arm gripper requires an arm model with an end plate ) |
interfaceGripper1_cmdnum |
float64 |
Left-arm gripper command number ( requires an arm model with an end plate ) |
interfaceGripper1_curpos |
float64 |
Current position of left arm gripper(Arm model with end plate required) |
interfaceGripper1_curtor |
float64 |
Current motor torque of left arm gripper(requires arm model with end plate) |
interfaceGripper1_done |
float64 |
Whether the current command execution of the left arm gripper is completed(The arm model needs to have an end plate) |
interfaceGripper1_error |
float64 |
Current error code of left arm gripper ( requires arm model with end plate ) |
interfaceGripper2_act |
float64 |
Right-arm gripper’s act status ( requires arm model with end plate ) |
interfaceGripper2_id |
float64 |
The id( of the right-arm gripper requires an arm model with an end plate ) |
interfaceGripper2_cmdnum |
float64 |
Right arm gripper command number ( requires an arm model with end plate ) |
interfaceGripper2_curpos |
float64 |
Current position of right arm gripper(Arm model with end plate required) |
interfaceGripper2_curtor |
float64 |
Current motor torque of right-arm gripper(requires arm model with end plate) |
interfaceGripper2_done |
float64 |
Whether the current command execution of the right-arm gripper has been completed(The arm model must have an end plate) |
interfaceGripper2_error |
float64 |
Current error code of right arm gripper ( requires arm model with end plate ) |
freedrive1_flag |
float64 |
Left-arm drag button triggers flag, 1 indicates trigger ( requires arm model with end plate ) |
freedrive2_flag |
float64 |
Right-arm drag button triggers flag, 1 represents trigger ( requires arm model with end plate ) |
force_sensor1_linx |
float64 |
Left Arm Torque SensorxDirectional Force(Arm Model with End Plate Required) |
force_sensor1_liny |
float64 |
Left Arm Torque SensoryDirectional Force(Arm Model with End Plate Required) |
force_sensor1_linz |
float64 |
Left Arm Torque SensorzDirectional Force(Arm Model with End Plate Required) |
force_sensor1_rotx |
float64 |
Left Arm Torque SensorxDirectional Torque(Arm Model with End Plate Required) |
force_sensor1_roty |
float64 |
Left Arm Torque SensoryDirectional Torque(Arm Model with End Plate Required) |
force_sensor1_rotz |
float64 |
Left Arm Torque SensorzDirectional Torque(Arm Model with End Plate Required) |
force_sensor2_linx |
float64 |
Left Arm Torque SensorxDirectional Force(Arm Model with End Plate Required) |
force_sensor2_liny |
float64 |
Right Arm Torque SensoryDirectional Force(Arm model with end plate required) |
force_sensor2_linz |
float64 |
Right Arm Torque SensorzDirectional Force(Arm Model with End Plate Required) |
force_sensor2_rotx |
float64 |
Right Arm Torque SensorxDirectional Torque(Arm Model with End Plate Required) |
force_sensor2_roty |
float64 |
Right Arm Torque SensoryDirection Torque(Requires Arm Model with End Plate) |
force_sensor2_rotz |
float64 |
Right Arm Torque SensorzDirectional Torque(Arm Model with End Plate Required) |
Here, “hexerrorcode_curerrcode” is the current system error code. If this value is non-zero, it indicates that an error exists in the system. Since the displayed error code uses decimal notation while the error codes are defined in hexadecimal, the decimal value must be converted to hexadecimal to interpret the corresponding fault information. Below is an explanation of the 32-bit error code structure.
Table 2-2: Description of 32-bit Plugin Error Codes
Byte Position |
Name |
Values and Their Meanings |
[31:24] Byte 4 |
Severity |
0x00 = OK (Normal)
0x01 = INFO (informational message)
0x02 = WARN (General warning, does not interrupt execution)
0x0E = ERROR (Operation failure, motion interruption)
0x0F = FATAL (Fatal fault, triggering emergency stop and safety lock)
|
[23:16] Byte 3 |
Subsystem |
0x00 = INIT (initialization process)
0x10 = RUN (Running Process)
0x20 = SENSOR
0x30 = HAL (Hardware Abstraction Layer Feedback)
|
[15:08] Byte 2 |
MainCode (Main Error Code) |
For example: 0x00, 0x01, 0xFF (global broadcast) |
[07:00] Byte 1 |
Subcode (from error code) |
Serial number, used to precisely distinguish the specific cause of an error |
Note
Note that fatal-level errors currently do not support error recovery; all error-level issues can be recovered via the server’s “reseterror” command; warning-level messages are indicated by “curwarncode” but do not interrupt system operation.
Table 2-3 Fatal-Level Fault Codes
Complete Hexadecimal Value |
Fault Interpretation |
Troubleshooting and Resolution Guidelines |
0x0F000001 |
Parameter reading exception, invalid parameter |
Before startup, did you manually modify the configuration file, or is the configuration file corrupted? It is recommended to rerun the “frconfig” command and use the configuration file provided by Faou to configure the slave station. |
0x0F000002 |
Invalid slave station format; failed to parse gear ratio using regular expression. |
Before startup, did you manually modify the configuration file, or is the configuration file corrupted? It is recommended to rerun the “frconfig” command and use the configuration file provided by Faou to configure the slave station. |
0x0F000004 |
Failed to initialize shared memory or open semaphore |
The HAL library failed to initialize properly. Please contact FAO technical support for troubleshooting. |
0x0F000008 |
Reading initial state and checksum error |
The invoked HAL library version is incorrect. Please upgrade using the Faao-provided update package and then restart. |
0x0F000010 |
Error reading initial slave status information; check the EtherCAT topology. |
Error in verifying the number and type of slave stations. Please check whether the currently loaded configuration matches the actual hardware and confirm that the EtherCAT cable is connected to the controller at power-on. |
0x0F000020 |
Error: Reading initial state shared memory object is empty |
HAL library exited. Please contact Faou technical support for troubleshooting. |
0x0F000040 |
Timeout reading initial state |
HAL library exited. Please contact Faou technical support for troubleshooting. |
0x0F100001 |
Shared Memory Watchdog Timeout |
The HAL library has gone offline or the underlying driver process has crashed. Check whether the underlying igh process is running normally and verify whether the IPC shared memory mechanism is blocked. |
0x0F100101 |
Slave Information and Checksum Errors |
CRC verification failure for the servo data packet obtained at the lower layer. Pay special attention to whether the bus network cable is loose, whether the RJ-45 connector is intact, or whether the cable is subject to strong electromagnetic interference. |
0x0F100102 |
Abnormal number or type of slave stations |
The actual number/model of physically scanned joints is inconsistent with the topology defined in the YAML configuration file. Check whether the configuration file is loaded correctly. |
0x0F100103 |
Status shared memory pointer is null |
Memory mapping failed. The ROS 2 hardware_interface failed to correctly mount the shared memory address for reading the robotic arm’s status. |
0x0F100201 |
Instruction shared memory pointer is null |
Memory mapping failed. The ROS 2 hardware_interface cannot correctly mount the shared memory address for issuing motion commands. |
Note
Note that immediately after system startup, the parsed error codes may not be found in the table above—for example, 0x0F00005 may appear. This error code is a combination of 0x0F00001 and 0x0F00004, because multiple operations during system initialization may each fail; however, before the system fully starts up, these errors cannot be reported immediately and are instead accumulated cumulatively, resulting in such composite error codes appearing after initialization.
Table 2-4 ERROR-Level Error Codes
Complete Hexadecimal Value |
Fault Interpretation |
Troubleshooting and Resolution Guidelines |
0x0E10FF01 |
Drive Failure (Global Broadcast) |
0xFF indicates a broadcast alarm for any axis. Possible causes include overcurrent, overload, excessive torque due to collision, or encoder disconnection. Refer to the individual-axis error code to pinpoint the specific joint. |
0x0E100001 |
Soft Emergency Stop Triggered |
Logical emergency stop triggered. The host computer or teach pendant issued an emergency stop command, causing the underlying system to immediately interrupt the current motion queue to ensure safety. |
0x0E100002 |
Instruction queue is too long |
Interpolation buffer overflow. The host computer sends trajectory points too densely or sets the control frequency too high, causing timeout in the underlying consumer processing. Please check the controller’s execution frequency setting. |
Table 2-5 Warning (WARN)-Level Error Codes
Complete Hexadecimal Value |
Warning Interpretation |
Troubleshooting and Resolution Guidelines |
0x02100001 |
Large instruction step (triggering clipping) |
The positional difference between two consecutive points issued by the planner exceeds the underlying system’s maximum velocity/acceleration limits, triggering forced peak clipping and smoothing. This may cause a negligible deviation between the actual and intended trajectory. |
0x02100002 |
Instruction queue write failure |
Excessively high instantaneous concurrency causes the system to fail to push interpolation points into the lock-free queue within an extremely short time, potentially resulting in brief motion stuttering. |
2.2. Command Server
The instruction server is a controller that starts automatically with the plugin system upon boot-up, named “fairino_hardware_command_controller.” It provides an action server externally named “command,” using a custom interaction message format:
Table 2-6 Custom Interactive Message Format
string command |
Request (Goal) – String command, e.g., “Enable(1)” |
string error_code |
Result – Controller-specific 16-bit hexadecimal error code, e.g., “0xC000” |
float32 progress |
Feedback – Execution Progress (0.0 ~ 100.0) |
Table 2-7 Supported Instructions
Instruction Name |
In-depth Feature Description |
Input Parameter Description |
activateController |
Activate the specified ROS 2 controller by calling the controller_manager service to transition the target controller’s state from inactive to active. |
args[0]: Controller name (String) Example: fairino_trajectory_controller |
Deactivate controller |
Deactivate the specified ROS 2 controller. Switch the running controller’s state to inactive, commonly used for control authority handover (e.g., switching out trajectory control and switching in impedance control). |
args[0]: Controller name (String) Example: fairino_trajectory_controller |
enable |
Robot Enable (Servo ON). Send a command to the lower-level controller to close the relay, power up the joint servo motors, and enable torque output. |
When no parameters are provided, all joints are enabled; when parameters are provided, joints are enabled according to bit positions (e.g., 1 enables joint 1, 2 enables joint 2, 4 enables joint 3, 8 enables joint 4, and 7 enables joints 1, 2, and 3). |
disable |
Robot servo disable (Servo OFF). Cuts off torque output from the servo motors, causing the robotic arm to engage the brake. |
Same usage as the enable function |
setdo |
Configure digital output to control the IO pin levels of the robot control cabinet or end-effector, enabling activation of peripheral devices (e.g., grippers, welding torches, relays). |
args[0]: IO port index/name args[1]: Status (“1”/”true” for on, “0”/”false” for off) |
zeroing |
Perform zero-point calibration of the robotic arm. Trigger the underlying homing logic to enable joints to automatically locate the mechanical origin and reset the absolute encoder offset. |
Same usage as enable |
reset error |
Error reset. When the underlying system triggers an ERROR alarm causing brake engagement, invoking this command clears the underlying error flag and restores the system to standby mode, provided the physical fault has been resolved. |
No parameters |
frconfig |
Dynamically generate the robot’s core configuration files. Launch the background Python script to parse the YAML configuration and dynamically generate the URDF model and controller_manager configuration files. |
args[0] (optional): The configuration file name under the /opt/fairino_art_plugin/config directory. If omitted, the default file “fairino_config.yaml” is used, equivalent to frconfig(fairino_config.yaml). |
upgrade plugin |
Automatically upgrade underlying drivers and plugin packages. Extract the incoming ZIP package, clean up the old environment, overwrite the new code to the /opt system directory, and automatically fix permissions for .sh and executable files. |
args[0]: The absolute path of the upgrade package (.zip). Example: [“/tmp/update_v2.zip”] |
PackLog |
One-click packaging of system logs and dump snapshots. Compresses fault snapshots and system runtime logs from /home/fairino/plugin_log/ into a single archive file for easy copying and export by on-site personnel. |
No parameters (or optionally specify the target export path) |
record data |
Control the user’s high-frequency data recorder. Enable or disable a 20 MB circular data recording queue in memory for capturing high-precision joint position, torque, and status waveforms. |
args[0]: Action command. Only “start” or “stop” is accepted (case-insensitive). |
switch mode |
Switch the servo control mode. Note that joint servos support position and torque modes, while modular servos support position and speed modes. If the parameters of the specified servo do not match the allowed modes, an error will be returned. |
args[0]: Mode name; “position” for position mode, “velocity” for velocity mode, “torque” for torque mode. args[1]: Slave mask; switches modes for slaves whose indices correspond to the bit positions set to 1 in the mask. |
reboot |
Restart command |
No parameters |
shutdownsys |
Power-off command |
No parameters |
getecatcommstatus |
Obtain ethercat communication information, used to assist in diagnosing ethercat communication status |
No parameters |
enablevelff |
Enable the specified velocity feedforward(disabled by default),plugin calculates the velocity feedforward by differentiating the position command and sends it to the motor,to reduce the position tracking delay。It is only effective in position control mode。 |
Same usage as the enable function |
disablevelff |
Disable robot velocity feedforward function |
Same usage as the enable function |
Similarly, according to the instruction-server interaction format described above, each string instruction has a corresponding string feedback value—a 16-bit error code system, whose specific functions are detailed in the table below:
Table 2-8 Specific Function Table
Return Value |
Trigger Scenario Definition |
Common Troubleshooting and Resolution Recommendations |
0xC000 |
Execution succeeded. The command was fully launched and completed successfully. |
No action required; the host computer can continue issuing subsequent procedures. |
0xC010 |
Invalid parameter or injection prevention intercepted. The input parameter is empty or contains dangerous shell characters. |
Check the parameters sent by the host computer to ensure they contain only valid file paths or plain text. |
0xC011 |
Dependent service is unavailable. The ROS 2 internal service being called (e.g., controller_manager) is offline or not ready. |
Check whether the target node is alive, or wait until the system has fully booted before issuing commands. |
0xC012 |
Hardware status is abnormal. An error or disabled state was detected at the underlying level when issuing commands requiring hardware cooperation. |
Please first check the hardware alarm codes for fairino_hardware, then reset the hardware and try again. |
0xC013 |
Command timeout. The command did not complete within the specified time (e.g., download, system response, etc.). |
Check the network connection or whether the system load is too high. |
0xC020 |
Controller switching failed. The soft switch (e.g., from joint space to Cartesian space controller) was rejected by the system. |
Check whether the controller name is spelled correctly, or whether there is a port conflict on the controller. |
0xC021 |
Zero calibration timeout. |
Checking if the plugin is running normally |
0xC030 |
Configuration generation failed. The Python script failed to parse the YAML or generate the URDF/controller configuration. |
Check whether the YAML format is correct, and whether the file has been manually tampered with or contains garbled characters. |
0xC040 |
Failed to extract the upgrade package. The unzip command returned a non-zero exit code. |
Check whether the .zip file path is correct, whether the archive is corrupted, or whether the /tmp space is full. |
0xC041 |
Directory overwrite failed. An error occurred while the plugin upgrade attempted to overwrite the /opt/… directory. |
Check the directory permissions and ownership (whether the owner is fairino) or whether it is occupied. |
0xC050 |
Failed to package logs. An error occurred while collecting and compressing dump files and system runtime logs. |
Check the permissions of the target storage path and the remaining disk capacity. |
0xC060 |
Data recording operation failed. The recorddata(start/stop) command processing failed or a write exception occurred. |
Check whether the /tmp/record_data directory is writable, or whether a deadlock exists in memory. |
0xC0FE |
Unknown command. The host computer sent a command that the Action Server cannot parse. |
Alignment of the communication protocol interface documentation between the host computer and the slave computer. |
0xC0FF |
An exception was thrown at the lower level. A severe crash occurred inside C++ or a script, or the process was forcibly terminated by the system. |
Check the host’s dmesg or the node’s standard output to troubleshoot segmentation faults (segfaults) or missing dependencies. |