Skip to main content

Signal interoperability

The examples below show how signal translator components included in the core components can be used with a selection of common ROS message types for interoperability.

tip

Review the Signals concept page for signals before starting this example.

AICA signals to standard ROS messages

AICA state signals carrying Cartesian or joint space information can be converted to standard ROS message types using the following components:

Component nameInput signal typeOutput message type
Cartesian Signal to Pose Stamped MessageCartesian state or posegeometry_msgs::msg::PoseStamped
Cartesian Signal to Twist Stamped MessageCartesian state or twistgeometry_msgs::msg::TwistStamped
Cartesian Signal to Wrench Stamped MessageCartesian state or wrenchgeometry_msgs::msg::WrenchStamped
Joint Signal To Joint State MessageJoint state, positions, velocities or torquessensor_msgs::msg::JointState

This example uses the Joint Signal To Joint State Message component to translate the joint state output from the hardware interface to a sensor_msgs::msg::JointState message and the Cartesian Signal to Pose Stamped Message component to translate the Cartesian state output to a geometry_msgs::msg::PoseStamped message.

Signal interoperability example 1

With the application loaded and playing, the two components will publish the converted message on their output signal each time a new message is received from the hardware interface. A jsonified version of those messages can be observed in the live topic view.

ROS Topic for Cartesian signal to Pose Stamped Message

With content

{"header":{"stamp":{"sec":1749019367,"nanosec":736960997},"frame_id":"world"},"pose":{"position":{"x":0.37246365888399174,"y":0.048146868357851064,"z":0.4299999920960212},"orientation":{"x":0.7073880448768991,"y":0.7068251811053661,"z":8.971607761328708e-7,"w":-0.0005633114591638605}}}
ROS Topic for joint signal to Joint State Message

With content

{"header":{"stamp":{"sec":1749019239,"nanosec":277825301},"frame_id":""},"name":["joint_0","joint_1","joint_2","joint_3","joint_4","joint_5"],"position":[0,0,0,0,0,0],"velocity":[0,0,0,0,0,0],"effort":[0,0,0,0,0,0]}
Application YAML
schema: 2-0-4
dependencies:
core: v4.3.2
on_start:
load:
hardware: hardware
components:
joint_signal_to_joint_state_message:
component: aica_core_components::ros::JointSignalToJointStateMsg
display_name: Joint Signal To Joint State Message
inputs:
input: /hardware/robot_state_broadcaster/joint_state
cartesian_signal_to_pose_stamped_message:
component: aica_core_components::ros::CartesianSignalToPoseStampedMsg
display_name: Cartesian Signal To Pose Stamped Message
inputs:
input: /hardware/robot_state_broadcaster/cartesian_state
hardware:
hardware:
display_name: Hardware Interface
urdf: Generic six-axis robot arm
rate: 100
events:
transitions:
on_load:
load:
controller: robot_state_broadcaster
hardware: hardware
controllers:
robot_state_broadcaster:
plugin: aica_core_controllers/RobotStateBroadcaster
outputs:
joint_state: /hardware/robot_state_broadcaster/joint_state
cartesian_state: /hardware/robot_state_broadcaster/cartesian_state
events:
transitions:
on_load:
switch_controllers:
hardware: hardware
activate: robot_state_broadcaster
on_activate:
load:
- component: cartesian_signal_to_pose_stamped_message
- component: joint_signal_to_joint_state_message
graph:
positions:
components:
joint_signal_to_joint_state_message:
x: 200
y: 880
cartesian_signal_to_pose_stamped_message:
x: 200
y: 660
hardware:
hardware:
x: 200
y: -20
edges:
hardware_hardware_robot_state_broadcaster_on_activate_cartesian_signal_to_pose_stamped_message_cartesian_signal_to_pose_stamped_message:
path:
- x: 80
y: 400
- x: 80
y: 720
hardware_hardware_robot_state_broadcaster_on_activate_joint_signal_to_joint_state_message_joint_signal_to_joint_state_message:
path:
- x: -20
y: 400
- x: -20
y: 940
hardware_hardware_robot_state_broadcaster_joint_state_joint_signal_to_joint_state_message_input:
path:
- x: 120
y: 520
- x: 120
y: 1060
hardware_hardware_robot_state_broadcaster_cartesian_state_cartesian_signal_to_pose_stamped_message_input:
path:
- x: 140
y: 560
- x: 140
y: 840

Standard ROS messages to AICA signals

Mirroring the first example, standard ROS message types carrying Cartesian or joint space information can be converted back into AICA state signals using the following components:

Component nameInput message typeOutput signal type
Pose Stamped Message to Cartesian Signalgeometry_msgs::msg::PoseStampedCartesian state containing pose information
Twist Stamped Message to Cartesian Signalgeometry_msgs::msg::TwistStampedCartesian state containing twist information
Wrench Stamped Message to Cartesian Signalgeometry_msgs::msg::WrenchStampedCartesian state containing wrench information
Joint State Message to Joint Signalsensor_msgs::msg::JointStateJoint state

The next example uses the Wrench Stamped Message To Cartesian Signal component to translate a geometry_msgs::msg::WrenchStamped from some custom component to a Cartesian signal that is connected to the force controller of the hardware interface.

note

The custom component is just an example placeholder in for any implementation that has a ROS standard message output, which might occur when porting existing ROS nodes into AICA Studio using the AICA SDK.

Signal interoperability example 2
Application YAML
schema: 2-0-4
dependencies:
core: v4.3.2
on_start:
load:
hardware: hardware
components:
wrench_stamped_message_to_cartesian_signal:
component: aica_core_components::ros::WrenchStampedMsgToCartesianSignal
display_name: Wrench Stamped Message To Cartesian Signal
events:
transitions:
on_load:
switch_controllers:
hardware: hardware
activate: force_controller
inputs:
input: /custom_motion_generator/command
outputs:
output: /wrench_stamped_message_to_cartesian_signal/output
custom_motion_generator:
component: template_component_package::PyComponent
display_name: Custom Motion Generator
events:
transitions:
on_load:
load:
component: wrench_stamped_message_to_cartesian_signal
outputs:
command: /custom_motion_generator/command
hardware:
hardware:
display_name: Hardware Interface
urdf: Generic six-axis robot arm
rate: 100
events:
transitions:
on_load:
load:
- controller: robot_state_broadcaster
hardware: hardware
- controller: force_controller
hardware: hardware
controllers:
robot_state_broadcaster:
plugin: aica_core_controllers/RobotStateBroadcaster
events:
transitions:
on_load:
switch_controllers:
hardware: hardware
activate: robot_state_broadcaster
on_activate:
load:
component: custom_motion_generator
force_controller:
plugin: aica_core_controllers/effort/ForceController
parameters:
force_limit:
- !!float 20.0
- !!float 20.0
- !!float 20.0
- !!float 2.0
- !!float 2.0
- !!float 2.0
inputs:
command: /wrench_stamped_message_to_cartesian_signal/output
graph:
positions:
components:
wrench_stamped_message_to_cartesian_signal:
x: 100
y: 780
custom_motion_generator:
x: 100
y: 420
hardware:
hardware:
x: 680
y: -20
edges:
wrench_stamped_message_to_cartesian_signal_output_hardware_hardware_force_controller_command:
path:
- x: 660
y: 1040
- x: 660
y: 820
wrench_stamped_message_to_cartesian_signal_on_load_hardware_hardware_force_controller:
path:
- x: 580
y: 920
- x: 580
y: 660
hardware_hardware_robot_state_broadcaster_on_activate_custom_motion_generator_custom_motion_generator:
path:
- x: 40
y: 400
- x: 40
y: 480
custom_motion_generator_on_load_wrench_stamped_message_to_cartesian_signal_wrench_stamped_message_to_cartesian_signal:
path:
- x: 540
y: 560
- x: 540
y: 740
- x: 40
y: 740
- x: 40
y: 840
custom_motion_generator_command_wrench_stamped_message_to_cartesian_signal_input:
path:
- x: 500
y: 680
- x: 500
y: 760
- x: 80
y: 760
- x: 80
y: 1040