添加机械臂和移液站

This commit is contained in:
zhangshixiang
2025-07-19 16:09:56 +08:00
parent ae712e35ab
commit 9f652fa78a
150 changed files with 9911 additions and 652 deletions

View File

@@ -0,0 +1,323 @@
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
<xacro:macro name="cs_ros2_control" params="
name
use_fake_hardware:=false fake_sensor_commands:=false
sim_gazebo:=false
sim_ignition:=false
headless_mode:=false
initial_positions:=${dict(shoulder_pan_joint=0.0,shoulder_lift_joint=-1.57,elbow_joint=0.0,wrist_1_joint=-1.57,wrist_2_joint=0.0,wrist_3_joint=0.0)}
use_tool_communication:=false
script_filename
output_recipe_filename
input_recipe_filename
tf_prefix
robot_ip
tool_voltage:=0
tool_parity:=0 tool_baud_rate:=115200 tool_stop_bits:=1 tool_tcp_port:=54321
reverse_port:=50001
script_sender_port:=50002
local_ip:=0.0.0.0
script_command_port:=50004
trajectory_port:=50003
robot_receive_timeout:=0.2
">
<ros2_control name="${name}" type="system">
<hardware>
<xacro:if value="${sim_gazebo}">
<plugin>gazebo_ros2_control/GazeboSystem</plugin>
</xacro:if>
<xacro:if value="${sim_ignition}">
<plugin>ign_ros2_control/IgnitionSystem</plugin>
</xacro:if>
<xacro:if value="${use_fake_hardware}">
<plugin>mock_components/GenericSystem</plugin>
<param name="fake_sensor_commands">${fake_sensor_commands}</param>
<param name="state_following_offset">0.0</param>
</xacro:if>
<xacro:unless value="${use_fake_hardware or sim_gazebo or sim_ignition}">
<plugin>ELITE_CS_ROBOT_ROS_DRIVER/EliteCSPositionHardwareInterface</plugin>
<param name="robot_ip">${robot_ip}</param>
<param name="script_filename">${script_filename}</param>
<param name="output_recipe_filename">${output_recipe_filename}</param>
<param name="input_recipe_filename">${input_recipe_filename}</param>
<param name="headless_mode">${headless_mode}</param>
<param name="reverse_port">${reverse_port}</param>
<param name="script_sender_port">${script_sender_port}</param>
<param name="local_ip">${local_ip}</param>
<param name="script_command_port">${script_command_port}</param>
<param name="trajectory_port">${trajectory_port}</param>
<param name="tf_prefix">${tf_prefix}</param>
<param name="servoj_gain">2000</param>
<param name="servoj_lookahead_time">0.08</param>
<param name="servoj_time">0.008</param>
<param name="use_tool_communication">${use_tool_communication}</param>
<param name="tool_voltage">${tool_voltage}</param>
<param name="tool_parity">${tool_parity}</param>
<param name="tool_baud_rate">${tool_baud_rate}</param>
<param name="tool_stop_bits">${tool_stop_bits}</param>
<param name="tool_tcp_port">${tool_tcp_port}</param>
<param name="robot_receive_timeout">${robot_receive_timeout}</param>
</xacro:unless>
</hardware>
<joint name="${tf_prefix}shoulder_pan_joint">
<command_interface name="position"/>
<command_interface name="velocity"/>
<state_interface name="position">
<!-- initial position for the FakeSystem and simulation -->
<param name="initial_value">${initial_positions['shoulder_pan_joint']}</param>
</state_interface>
<state_interface name="velocity"/>
<state_interface name="effort"/>
</joint>
<joint name="${tf_prefix}shoulder_lift_joint">
<command_interface name="position"/>
<command_interface name="velocity"/>
<state_interface name="position">
<!-- initial position for the FakeSystem and simulation -->
<param name="initial_value">${initial_positions['shoulder_lift_joint']}</param>
</state_interface>
<state_interface name="velocity"/>
<state_interface name="effort"/>
</joint>
<joint name="${tf_prefix}elbow_joint">
<command_interface name="position"/>
<command_interface name="velocity"/>
<state_interface name="position">
<!-- initial position for the FakeSystem and simulation -->
<param name="initial_value">${initial_positions['elbow_joint']}</param>
</state_interface>
<state_interface name="velocity"/>
<state_interface name="effort"/>
</joint>
<joint name="${tf_prefix}wrist_1_joint">
<command_interface name="position"/>
<command_interface name="velocity"/>
<state_interface name="position">
<!-- initial position for the FakeSystem and simulation -->
<param name="initial_value">${initial_positions['wrist_1_joint']}</param>
</state_interface>
<state_interface name="velocity"/>
<state_interface name="effort"/>
</joint>
<joint name="${tf_prefix}wrist_2_joint">
<command_interface name="position"/>
<command_interface name="velocity"/>
<state_interface name="position">
<!-- initial position for the FakeSystem and simulation -->
<param name="initial_value">${initial_positions['wrist_2_joint']}</param>
</state_interface>
<state_interface name="velocity"/>
<state_interface name="effort"/>
</joint>
<joint name="${tf_prefix}wrist_3_joint">
<command_interface name="position"/>
<command_interface name="velocity"/>
<state_interface name="position">
<!-- initial position for the FakeSystem and simulation -->
<param name="initial_value">${initial_positions['wrist_3_joint']}</param>
</state_interface>
<state_interface name="velocity"/>
<state_interface name="effort"/>
</joint>
<xacro:unless value="${sim_gazebo or sim_ignition}">
<sensor name="${tf_prefix}tcp_fts_sensor">
<state_interface name="force.x"/>
<state_interface name="force.y"/>
<state_interface name="force.z"/>
<state_interface name="torque.x"/>
<state_interface name="torque.y"/>
<state_interface name="torque.z"/>
</sensor>
<!-- NOTE The following are joints used only for testing with fake hardware and will change in the future -->
<gpio name="${tf_prefix}speed_scaling">
<state_interface name="speed_scaling_factor"/>
<param name="initial_speed_scaling_factor">1</param>
<command_interface name="target_speed_fraction_cmd"/>
<command_interface name="target_speed_fraction_async_success"/>
</gpio>
<gpio name="${tf_prefix}gpio">
<command_interface name="standard_digital_output_cmd_0"/>
<command_interface name="standard_digital_output_cmd_1"/>
<command_interface name="standard_digital_output_cmd_2"/>
<command_interface name="standard_digital_output_cmd_3"/>
<command_interface name="standard_digital_output_cmd_4"/>
<command_interface name="standard_digital_output_cmd_5"/>
<command_interface name="standard_digital_output_cmd_6"/>
<command_interface name="standard_digital_output_cmd_7"/>
<command_interface name="standard_digital_output_cmd_8"/>
<command_interface name="standard_digital_output_cmd_9"/>
<command_interface name="standard_digital_output_cmd_10"/>
<command_interface name="standard_digital_output_cmd_11"/>
<command_interface name="standard_digital_output_cmd_12"/>
<command_interface name="standard_digital_output_cmd_13"/>
<command_interface name="standard_digital_output_cmd_14"/>
<command_interface name="standard_digital_output_cmd_15"/>
<command_interface name="configure_digital_output_cmd_0"/>
<command_interface name="configure_digital_output_cmd_1"/>
<command_interface name="configure_digital_output_cmd_2"/>
<command_interface name="configure_digital_output_cmd_3"/>
<command_interface name="configure_digital_output_cmd_4"/>
<command_interface name="configure_digital_output_cmd_5"/>
<command_interface name="configure_digital_output_cmd_6"/>
<command_interface name="configure_digital_output_cmd_7"/>
<command_interface name="tool_digital_output_cmd_0"/>
<command_interface name="tool_digital_output_cmd_1"/>
<command_interface name="tool_digital_output_cmd_2"/>
<command_interface name="tool_digital_output_cmd_3"/>
<command_interface name="standard_analog_output_type_cmd_0"/>
<command_interface name="standard_analog_output_type_cmd_1"/>
<command_interface name="standard_analog_output_cmd_0"/>
<command_interface name="standard_analog_output_cmd_1"/>
<command_interface name="tool_voltage_cmd"/>
<command_interface name="io_async_success"/>
<state_interface name="standard_digital_output_0"/>
<state_interface name="standard_digital_output_1"/>
<state_interface name="standard_digital_output_2"/>
<state_interface name="standard_digital_output_3"/>
<state_interface name="standard_digital_output_4"/>
<state_interface name="standard_digital_output_5"/>
<state_interface name="standard_digital_output_6"/>
<state_interface name="standard_digital_output_7"/>
<state_interface name="standard_digital_output_8"/>
<state_interface name="standard_digital_output_9"/>
<state_interface name="standard_digital_output_10"/>
<state_interface name="standard_digital_output_11"/>
<state_interface name="standard_digital_output_12"/>
<state_interface name="standard_digital_output_13"/>
<state_interface name="standard_digital_output_14"/>
<state_interface name="standard_digital_output_15"/>
<state_interface name="configure_digital_output_0"/>
<state_interface name="configure_digital_output_1"/>
<state_interface name="configure_digital_output_2"/>
<state_interface name="configure_digital_output_3"/>
<state_interface name="configure_digital_output_4"/>
<state_interface name="configure_digital_output_5"/>
<state_interface name="configure_digital_output_6"/>
<state_interface name="configure_digital_output_7"/>
<state_interface name="tool_digital_output_0"/>
<state_interface name="tool_digital_output_1"/>
<state_interface name="tool_digital_output_2"/>
<state_interface name="tool_digital_output_3"/>
<state_interface name="standard_digital_input_0"/>
<state_interface name="standard_digital_input_1"/>
<state_interface name="standard_digital_input_2"/>
<state_interface name="standard_digital_input_3"/>
<state_interface name="standard_digital_input_4"/>
<state_interface name="standard_digital_input_5"/>
<state_interface name="standard_digital_input_6"/>
<state_interface name="standard_digital_input_7"/>
<state_interface name="standard_digital_input_8"/>
<state_interface name="standard_digital_input_9"/>
<state_interface name="standard_digital_input_10"/>
<state_interface name="standard_digital_input_11"/>
<state_interface name="standard_digital_input_12"/>
<state_interface name="standard_digital_input_13"/>
<state_interface name="standard_digital_input_14"/>
<state_interface name="standard_digital_input_15"/>
<state_interface name="configure_digital_input_0"/>
<state_interface name="configure_digital_input_1"/>
<state_interface name="configure_digital_input_2"/>
<state_interface name="configure_digital_input_3"/>
<state_interface name="configure_digital_input_4"/>
<state_interface name="configure_digital_input_5"/>
<state_interface name="configure_digital_input_6"/>
<state_interface name="configure_digital_input_7"/>
<state_interface name="tool_digital_input_0"/>
<state_interface name="tool_digital_input_1"/>
<state_interface name="tool_digital_input_2"/>
<state_interface name="tool_digital_input_3"/>
<state_interface name="standard_analog_output_type_0"/>
<state_interface name="standard_analog_output_type_1"/>
<state_interface name="standard_analog_output_0"/>
<state_interface name="standard_analog_output_1"/>
<state_interface name="standard_analog_input_type_0"/>
<state_interface name="standard_analog_input_type_1"/>
<state_interface name="standard_analog_input_0"/>
<state_interface name="standard_analog_input_1"/>
<state_interface name="tool_mode"/>
<state_interface name="tool_output_voltage"/>
<state_interface name="tool_output_current"/>
<state_interface name="tool_temperature"/>
<state_interface name="tool_analog_input"/>
<state_interface name="tool_analog_output"/>
<state_interface name="tool_analog_input_type"/>
<state_interface name="tool_analog_output_type"/>
<state_interface name="robot_mode"/>
<state_interface name="robot_status_bit_0"/>
<state_interface name="robot_status_bit_1"/>
<state_interface name="robot_status_bit_2"/>
<state_interface name="robot_status_bit_3"/>
<state_interface name="safety_mode"/>
<state_interface name="safety_status_bit_0"/>
<state_interface name="safety_status_bit_1"/>
<state_interface name="safety_status_bit_2"/>
<state_interface name="safety_status_bit_3"/>
<state_interface name="safety_status_bit_4"/>
<state_interface name="safety_status_bit_5"/>
<state_interface name="safety_status_bit_6"/>
<state_interface name="safety_status_bit_7"/>
<state_interface name="safety_status_bit_8"/>
<state_interface name="safety_status_bit_9"/>
<state_interface name="safety_status_bit_10"/>
<state_interface name="task_running"/>
</gpio>
<gpio name="${tf_prefix}payload">
<command_interface name="mass"/>
<command_interface name="cog.x"/>
<command_interface name="cog.y"/>
<command_interface name="cog.z"/>
<command_interface name="payload_async_success"/>
</gpio>
<gpio name="${tf_prefix}resend_external_script">
<command_interface name="resend_external_script_cmd"/>
<command_interface name="resend_external_script_async_success"/>
</gpio>
<gpio name="${tf_prefix}hand_back_control">
<command_interface name="hand_back_control_cmd"/>
<command_interface name="hand_back_control_async_success"/>
</gpio>
<gpio name="${tf_prefix}zero_ftsensor">
<command_interface name="zero_ftsensor_cmd"/>
<command_interface name="zero_ftsensor_async_success"/>
</gpio>
<gpio name="${tf_prefix}system_interface">
<state_interface name="initialized"/>
</gpio>
</xacro:unless>
</ros2_control>
</xacro:macro>
</robot>

View File

@@ -0,0 +1,118 @@
<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro" name="$(arg name)">
<!-- robot name parameter -->
<xacro:arg name="name" default="cs"/>
<!-- import main macro -->
<xacro:include filename="$(find eli_cs_robot_description)/urdf/cs_macro.xacro"/>
<!-- possible 'cs_type' values: cs63, cs66, cs612, cs616, cs620, cs625 -->
<!-- the default value should raise an error in case this was called without defining the type -->
<xacro:arg name="cs_type" default="cs63"/>
<!-- parameters -->
<xacro:arg name="tf_prefix" default="" />
<xacro:arg name="joint_limit_params" default="$(find eli_cs_robot_description)/config/$(arg cs_type)/joint_limits.yaml"/>
<xacro:arg name="kinematics_params" default="$(find eli_cs_robot_description)/config/$(arg cs_type)/default_kinematics.yaml"/>
<xacro:arg name="physical_params" default="$(find eli_cs_robot_description)/config/$(arg cs_type)/physical_parameters.yaml"/>
<xacro:arg name="visual_params" default="$(find eli_cs_robot_description)/config/$(arg cs_type)/visual_parameters.yaml"/>
<xacro:arg name="transmission_hw_interface" default=""/>
<xacro:arg name="safety_limits" default="false"/>
<xacro:arg name="safety_pos_margin" default="0.15"/>
<xacro:arg name="safety_k_position" default="20"/>
<!-- ros2_control related parameters -->
<xacro:arg name="headless_mode" default="false" />
<xacro:arg name="robot_ip" default="0.0.0.0" />
<xacro:arg name="script_filename" default=""/>
<xacro:arg name="output_recipe_filename" default=""/>
<xacro:arg name="input_recipe_filename" default=""/>
<xacro:arg name="local_ip" default="0.0.0.0"/>
<xacro:arg name="script_command_port" default="50004"/>
<xacro:arg name="reverse_port" default="50001"/>
<xacro:arg name="script_sender_port" default="50002"/>
<xacro:arg name="trajectory_port" default="50003"/>
<!-- tool communication related parameters-->
<xacro:arg name="use_tool_communication" default="false" />
<xacro:arg name="tool_voltage" default="0" />
<xacro:arg name="tool_parity" default="0" />
<xacro:arg name="tool_baud_rate" default="115200" />
<xacro:arg name="tool_stop_bits" default="1" />
<xacro:arg name="tool_tcp_port" default="54321" />
<!-- Simulation parameters -->
<xacro:arg name="use_fake_hardware" default="false" />
<xacro:arg name="fake_sensor_commands" default="false" />
<xacro:arg name="sim_gazebo" default="false" />
<xacro:arg name="sim_ignition" default="false" />
<xacro:arg name="simulation_controllers" default="" />
<!-- initial position for simulations (Fake Hardware, Gazebo, Ignition) -->
<xacro:arg name="initial_positions_file" default="$(find eli_cs_robot_description)/config/initial_positions.yaml"/>
<!-- convert to property to use substitution in function -->
<xacro:property name="initial_positions_file" default="$(arg initial_positions_file)"/>
<!-- create link fixed to the "world" -->
<link name="world" />
<!-- arm -->
<xacro:cs_robot
name="$(arg name)"
tf_prefix="$(arg tf_prefix)"
parent="world"
joint_limits_parameters_file="$(arg joint_limit_params)"
kinematics_parameters_file="$(arg kinematics_params)"
physical_parameters_file="$(arg physical_params)"
visual_parameters_file="$(arg visual_params)"
transmission_hw_interface="$(arg transmission_hw_interface)"
safety_limits="$(arg safety_limits)"
safety_pos_margin="$(arg safety_pos_margin)"
safety_k_position="$(arg safety_k_position)"
use_fake_hardware="$(arg use_fake_hardware)"
fake_sensor_commands="$(arg fake_sensor_commands)"
sim_gazebo="$(arg sim_gazebo)"
sim_ignition="$(arg sim_ignition)"
headless_mode="$(arg headless_mode)"
initial_positions="${xacro.load_yaml(initial_positions_file)}"
use_tool_communication="$(arg use_tool_communication)"
tool_voltage="$(arg tool_voltage)"
tool_parity="$(arg tool_parity)"
tool_baud_rate="$(arg tool_baud_rate)"
tool_stop_bits="$(arg tool_stop_bits)"
tool_tcp_port="$(arg tool_tcp_port)"
robot_ip="$(arg robot_ip)"
script_filename="$(arg script_filename)"
output_recipe_filename="$(arg output_recipe_filename)"
input_recipe_filename="$(arg input_recipe_filename)"
local_ip="$(arg local_ip)"
script_command_port="$(arg script_command_port)"
reverse_port="$(arg reverse_port)"
script_sender_port="$(arg script_sender_port)"
trajectory_port="$(arg trajectory_port)"
>
<origin xyz="0 0 0" rpy="0 0 0" /> <!-- position robot in the world -->
</xacro:cs_robot>
<xacro:if value="$(arg sim_gazebo)">
<!-- Gazebo plugins -->
<gazebo reference="world">
</gazebo>
<gazebo>
<plugin filename="libgazebo_ros2_control.so" name="gazebo_ros2_control">
<parameters>$(arg simulation_controllers)</parameters>
</plugin>
</gazebo>
</xacro:if>
<xacro:if value="$(arg sim_ignition)">
<!-- Gazebo plugins -->
<gazebo reference="world">
</gazebo>
<gazebo>
<plugin filename="libign_ros2_control-system.so" name="ign_ros2_control::IgnitionROS2ControlPlugin">
<parameters>$(arg simulation_controllers)</parameters>
<controller_manager_node_name>$(arg tf_prefix)controller_manager</controller_manager_node_name>
</plugin>
</gazebo>
</xacro:if>
</robot>

View File

@@ -0,0 +1,339 @@
<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro">
<!--
Base ELITE CS robot series xacro macro.
NOTE this is NOT a URDF. It cannot directly be loaded by consumers
expecting a flattened '.urdf' file. See the top-level '.xacro' for that
(but note that .xacro must still be processed by the xacro command).
This file models the base kinematic chain of a CS robot, which then gets
parameterised by various configuration files to convert it into a CS63,
CS66, CS612, CS616, CS620 or CS625.
NOTE the default kinematic parameters (i.e., link lengths, frame locations,
offsets, etc) do not correspond to any particular robot. They are defaults
only.
For accurate (and robot-specific) transforms, the 'kinematics_parameters_file'
parameter MUST point to a .yaml file containing the appropriate values for
the targeted robot.
- Chen Shichao
-->
<xacro:include filename="${mesh_path}/devices/elite_robot/urdf/inc/cs_transmissions.xacro" />
<xacro:include filename="${mesh_path}/devices/elite_robot/urdf/inc/cs_common.xacro" />
<xacro:macro name="cs_robot" params="
name
tf_prefix
parent
*origin
joint_limits_parameters_file
kinematics_parameters_file
physical_parameters_file
visual_parameters_file
generate_ros2_control_tag:=true
transmission_hw_interface:=hardware_interface/PositionJointInterface
safety_limits:=false
safety_pos_margin:=0.15
safety_k_position:=20
use_fake_hardware:=false
fake_sensor_commands:=false
sim_gazebo:=false
sim_ignition:=false
headless_mode:=false
initial_positions:=${dict(shoulder_pan_joint=0.0,shoulder_lift_joint=-1.57,elbow_joint=0.0,wrist_1_joint=-1.57,wrist_2_joint=0.0,wrist_3_joint=0.0)}
use_tool_communication:=false
tool_voltage:=0
tool_parity:=0
tool_baud_rate:=115200
tool_stop_bits:=1
tool_tcp_port:=54321
robot_ip:=0.0.0.0
script_filename:=to_be_filled_by_cs_robot_driver
output_recipe_filename:=to_be_filled_by_cs_robot_driver
input_recipe_filename:=to_be_filled_by_cs_robot_driver
reverse_port:=50001
script_sender_port:=50002
local_ip:=0.0.0.0
script_command_port:=50004
trajectory_port:=50003
mesh_path"
>
<!-- Load configuration data from the provided .yaml files -->
<xacro:read_model_data
joint_limits_parameters_file="${joint_limits_parameters_file}"
kinematics_parameters_file="${kinematics_parameters_file}"
physical_parameters_file="${physical_parameters_file}"
visual_parameters_file="${visual_parameters_file}"
force_abs_paths="true"
mesh_path="${mesh_path}"
/>
<xacro:if value="${generate_ros2_control_tag}">
<!-- ros2 control include -->
<xacro:include filename="${mesh_path}/devices/elite_robot/urdf/cs.ros2_control.xacro" />
<!-- ros2 control instance -->
<xacro:cs_ros2_control
name="${name}"
use_fake_hardware="${use_fake_hardware}"
initial_positions="${initial_positions}"
fake_sensor_commands="${fake_sensor_commands}"
headless_mode="${headless_mode}"
sim_gazebo="${sim_gazebo}"
sim_ignition="${sim_ignition}"
script_filename="${script_filename}"
output_recipe_filename="${output_recipe_filename}"
input_recipe_filename="${input_recipe_filename}"
tf_prefix="${tf_prefix}"
robot_ip="${robot_ip}"
use_tool_communication="${use_tool_communication}"
tool_voltage="${tool_voltage}"
tool_parity="${tool_parity}"
tool_baud_rate="${tool_baud_rate}"
tool_stop_bits="${tool_stop_bits}"
tool_tcp_port="${tool_tcp_port}"
reverse_port="${reverse_port}"
script_sender_port="${script_sender_port}"
local_ip="${local_ip}"
script_command_port="${script_command_port}"
trajectory_port="${trajectory_port}"
/>
</xacro:if>
<!-- Add URDF transmission elements (for ros_control) -->
<!--<xacro:cs_arm_transmission prefix="${prefix}" hw_interface="${transmission_hw_interface}" />-->
<!-- Placeholder for ros2_control transmission which don't yet exist -->
<!-- links - main serial chain -->
<link name="${tf_prefix}base_link"/>
<link name="${tf_prefix}base_link_inertia">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="base" type="visual"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="base" type="collision"/>
</geometry>
</collision>
<xacro:build_inertial mass="${base_mass}" cog="${prop_base_cog}" inertia="${prop_base_inertia}"/>
</link>
<link name="${tf_prefix}shoulder_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="shoulder" type="visual"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="shoulder" type="collision"/>
</geometry>
</collision>
<xacro:build_inertial mass="${shoulder_mass}" cog="${prop_shoulder_cog}" inertia="${prop_shoulder_inertia}"/>
</link>
<link name="${tf_prefix}upperarm_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="upperarm" type="visual"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="upperarm" type="collision"/>
</geometry>
</collision>
<xacro:build_inertial mass="${upperarm_mass}" cog="${prop_upperarm_cog}" inertia="${prop_upperarm_inertia}"/>
</link>
<link name="${tf_prefix}forearm_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="forearm" type="visual"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="forearm" type="collision"/>
</geometry>
</collision>
<xacro:build_inertial mass="${forearm_mass}" cog="${prop_forearm_cog}" inertia="${prop_forearm_inertia}"/>
</link>
<link name="${tf_prefix}wrist_1_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="wrist_1" type="visual"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="wrist_1" type="collision"/>
</geometry>
</collision>
<xacro:build_inertial mass="${wrist_1_mass}" cog="${prop_wrist_1_cog}" inertia="${prop_wrist_1_inertia}"/>
</link>
<link name="${tf_prefix}wrist_2_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="wrist_2" type="visual"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="wrist_2" type="collision"/>
</geometry>
</collision>
<xacro:build_inertial mass="${wrist_2_mass}" cog="${prop_wrist_2_cog}" inertia="${prop_wrist_2_inertia}"/>
</link>
<link name="${tf_prefix}wrist_3_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="wrist_3" type="visual"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<xacro:get_mesh name="wrist_3" type="collision"/>
</geometry>
</collision>
<xacro:build_inertial mass="${wrist_3_mass}" cog="${prop_wrist_3_cog}" inertia="${prop_wrist_3_inertia}"/>
</link>
<!-- base_joint fixes base_link to the environment -->
<joint name="${tf_prefix}base_joint" type="fixed">
<xacro:insert_block name="origin" />
<parent link="${parent}" />
<child link="${tf_prefix}base_link" />
</joint>
<!-- joints - main serial chain -->
<joint name="${tf_prefix}base_link-base_link_inertia" type="fixed">
<parent link="${tf_prefix}base_link" />
<child link="${tf_prefix}base_link_inertia" />
<origin xyz="0 0 0" rpy="0 0 0" />
</joint>
<joint name="${tf_prefix}shoulder_pan_joint" type="revolute">
<parent link="${tf_prefix}base_link_inertia" />
<child link="${tf_prefix}shoulder_link" />
<origin xyz="${shoulder_x} ${shoulder_y} ${shoulder_z}" rpy="${shoulder_roll} ${shoulder_pitch} ${shoulder_yaw}" />
<axis xyz="0 0 1" />
<limit lower="${shoulder_pan_lower_limit}" upper="${shoulder_pan_upper_limit}"
effort="${shoulder_pan_effort_limit}" velocity="${shoulder_pan_velocity_limit}"/>
<xacro:if value="${safety_limits}">
<safety_controller soft_lower_limit="${shoulder_pan_lower_limit + safety_pos_margin}" soft_upper_limit="${shoulder_pan_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
</xacro:if>
<dynamics damping="0" friction="0"/>
</joint>
<joint name="${tf_prefix}shoulder_lift_joint" type="revolute">
<parent link="${tf_prefix}shoulder_link" />
<child link="${tf_prefix}upperarm_link" />
<origin xyz="${upperarm_x} ${upperarm_y} ${upperarm_z}" rpy="${upperarm_roll} ${upperarm_pitch} ${upperarm_yaw}" />
<axis xyz="0 0 1" />
<limit lower="${shoulder_lift_lower_limit}" upper="${shoulder_lift_upper_limit}"
effort="${shoulder_lift_effort_limit}" velocity="${shoulder_lift_velocity_limit}"/>
<xacro:if value="${safety_limits}">
<safety_controller soft_lower_limit="${shoulder_lift_lower_limit + safety_pos_margin}" soft_upper_limit="${shoulder_lift_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
</xacro:if>
<dynamics damping="0" friction="0"/>
</joint>
<joint name="${tf_prefix}elbow_joint" type="revolute">
<parent link="${tf_prefix}upperarm_link" />
<child link="${tf_prefix}forearm_link" />
<origin xyz="${forearm_x} ${forearm_y} ${forearm_z}" rpy="${forearm_roll} ${forearm_pitch} ${forearm_yaw}" />
<axis xyz="0 0 1" />
<limit lower="${elbow_joint_lower_limit}" upper="${elbow_joint_upper_limit}"
effort="${elbow_joint_effort_limit}" velocity="${elbow_joint_velocity_limit}"/>
<xacro:if value="${safety_limits}">
<safety_controller soft_lower_limit="${elbow_joint_lower_limit + safety_pos_margin}" soft_upper_limit="${elbow_joint_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
</xacro:if>
<dynamics damping="0" friction="0"/>
</joint>
<joint name="${tf_prefix}wrist_1_joint" type="revolute">
<parent link="${tf_prefix}forearm_link" />
<child link="${tf_prefix}wrist_1_link" />
<origin xyz="${wrist_1_x} ${wrist_1_y} ${wrist_1_z}" rpy="${wrist_1_roll} ${wrist_1_pitch} ${wrist_1_yaw}" />
<axis xyz="0 0 1" />
<limit lower="${wrist_1_lower_limit}" upper="${wrist_1_upper_limit}"
effort="${wrist_1_effort_limit}" velocity="${wrist_1_velocity_limit}"/>
<xacro:if value="${safety_limits}">
<safety_controller soft_lower_limit="${wrist_1_lower_limit + safety_pos_margin}" soft_upper_limit="${wrist_1_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
</xacro:if>
<dynamics damping="0" friction="0"/>
</joint>
<joint name="${tf_prefix}wrist_2_joint" type="revolute">
<parent link="${tf_prefix}wrist_1_link" />
<child link="${tf_prefix}wrist_2_link" />
<origin xyz="${wrist_2_x} ${wrist_2_y} ${wrist_2_z}" rpy="${wrist_2_roll} ${wrist_2_pitch} ${wrist_2_yaw}" />
<axis xyz="0 0 1" />
<limit lower="${wrist_2_lower_limit}" upper="${wrist_2_upper_limit}"
effort="${wrist_2_effort_limit}" velocity="${wrist_2_velocity_limit}"/>
<xacro:if value="${safety_limits}">
<safety_controller soft_lower_limit="${wrist_2_lower_limit + safety_pos_margin}" soft_upper_limit="${wrist_2_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
</xacro:if>
<dynamics damping="0" friction="0"/>
</joint>
<joint name="${tf_prefix}wrist_3_joint" type="revolute">
<parent link="${tf_prefix}wrist_2_link" />
<child link="${tf_prefix}wrist_3_link" />
<origin xyz="${wrist_3_x} ${wrist_3_y} ${wrist_3_z}" rpy="${wrist_3_roll} ${wrist_3_pitch} ${wrist_3_yaw}" />
<axis xyz="0 0 1" />
<limit lower="${wrist_3_lower_limit}" upper="${wrist_3_upper_limit}"
effort="${wrist_3_effort_limit}" velocity="${wrist_3_velocity_limit}"/>
<xacro:if value="${safety_limits}">
<safety_controller soft_lower_limit="${wrist_3_lower_limit + safety_pos_margin}" soft_upper_limit="${wrist_3_upper_limit - safety_pos_margin}" k_position="${safety_k_position}" k_velocity="0.0"/>
</xacro:if>
<dynamics damping="0" friction="0"/>
</joint>
<link name="${tf_prefix}ft_frame"/>
<joint name="${tf_prefix}wrist_3_link-ft_frame" type="fixed">
<parent link="${tf_prefix}wrist_3_link"/>
<child link="${tf_prefix}ft_frame"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
</joint>
<!-- ROS-Industrial 'base' frame - base_link to CS 'Base' Coordinates transform -->
<link name="${tf_prefix}base"/>
<joint name="${tf_prefix}base_link-base_fixed_joint" type="fixed">
<origin xyz="0 0 0" rpy="0 0 0"/>
<parent link="${tf_prefix}base_link"/>
<child link="${tf_prefix}base"/>
</joint>
<!-- ROS-Industrial 'flange' frame - attachment point for EEF models -->
<link name="${tf_prefix}flange" />
<joint name="${tf_prefix}wrist_3-flange" type="fixed">
<parent link="${tf_prefix}wrist_3_link" />
<child link="${tf_prefix}flange" />
<origin xyz="0 0 0" rpy="0 0 0" />
</joint>
<!-- ROS-Industrial 'tool0' frame - all-zeros tool frame -->
<link name="${tf_prefix}tool0"/>
<joint name="${tf_prefix}flange-tool0" type="fixed">
<origin xyz="0 0 0" rpy="0 0 0"/>
<parent link="${tf_prefix}flange"/>
<child link="${tf_prefix}tool0"/>
</joint>
</xacro:macro>
</robot>

View File

@@ -0,0 +1,174 @@
<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro">
<!--
NOTE the macros defined in this file are NOT part of the public API of this
package. Users CANNOT rely on this file being available, or stored in
this location. Nor can they rely on the existence of the two macros.
The macros store the defined properties in the scope of the caller.
However, users MUST NOT rely on these properties, their contents or their
names.
Author: Chen Shichao
-->
<xacro:macro name="build_inertial" params="mass cog inertia">
<inertial>
<mass value="${mass}" />
<origin
xyz="${cog['x']} ${cog['y']} ${cog['z']}"
rpy="0 0 0" />
<inertia
ixx="${inertia['ixx']}"
ixy="${inertia['ixy']}"
ixz="${inertia['ixz']}"
iyy="${inertia['iyy']}"
iyz="${inertia['iyz']}"
izz="${inertia['izz']}" />
</inertial>
</xacro:macro>
<xacro:macro name="get_visual_params" params="name:=^ type:=^" >
<xacro:property name="visual_params" value="${sec_mesh_files[name][type]}" scope="parent"/>
</xacro:macro>
<!-- Simplification of getting meshes. Available types can be seen in the visual_parameters.yaml (At the time of writing: visual, collision) -->
<xacro:macro name="get_mesh_path" params="name:=^ type:=^" >
<xacro:get_visual_params />
<xacro:if value="${force_abs_paths}">
<xacro:property name="mesh" value="file://${mesh_path}/devices/elite_robot/${visual_params['mesh']['path']}" scope="parent"/>
</xacro:if>
<xacro:unless value="${force_abs_paths}">
<xacro:property name="mesh" value="package://${visual_params['mesh']['package']}/${visual_params['mesh']['path']}" scope="parent"/>
</xacro:unless>
</xacro:macro>
<xacro:macro name="get_mesh" params="name type" >
<xacro:get_mesh_path/>
<mesh filename="${mesh}"/>
</xacro:macro>
<xacro:macro name="read_model_data" params="joint_limits_parameters_file kinematics_parameters_file physical_parameters_file visual_parameters_file force_abs_paths mesh_path">
<xacro:property name="force_abs_paths" value="${force_abs_paths}" scope="parent"/>
<!-- Read .yaml files from disk, load content into properties -->
<xacro:property name="config_joint_limit_parameters" value="${xacro.load_yaml(joint_limits_parameters_file)}"/>
<xacro:property name="config_kinematics_parameters" value="${xacro.load_yaml(kinematics_parameters_file)}"/>
<xacro:property name="config_physical_parameters" value="${xacro.load_yaml(physical_parameters_file)}"/>
<xacro:property name="config_visual_parameters" value="${xacro.load_yaml(visual_parameters_file)}"/>
<xacro:property name="mesh_path" value="${mesh_path}" scope="parent"/>
<!-- Extract subsections from yaml dictionaries -->
<xacro:property name="sec_limits" value="${config_joint_limit_parameters['joint_limits']}"/>
<xacro:property name="sec_dh_parameters" value="${config_physical_parameters['dh_parameters']}"/>
<xacro:property name="sec_offsets" value="${config_physical_parameters['offsets']}"/>
<xacro:property name="sec_inertia_parameters" value="${config_physical_parameters['inertia_parameters']}" />
<xacro:property name="sec_mesh_files" value="${config_visual_parameters['mesh_files']}" scope="parent"/>
<xacro:property name="sec_kinematics" value="${config_kinematics_parameters['kinematics']}" />
<!-- JOINTS LIMIT PARAMETERS -->
<xacro:property name="shoulder_pan_lower_limit" value="${sec_limits['shoulder_pan_joint']['min_position']}" scope="parent"/>
<xacro:property name="shoulder_pan_upper_limit" value="${sec_limits['shoulder_pan_joint']['max_position']}" scope="parent"/>
<xacro:property name="shoulder_pan_velocity_limit" value="${sec_limits['shoulder_pan_joint']['max_velocity']}" scope="parent"/>
<xacro:property name="shoulder_pan_effort_limit" value="${sec_limits['shoulder_pan_joint']['max_effort']}" scope="parent"/>
<xacro:property name="shoulder_lift_lower_limit" value="${sec_limits['shoulder_lift_joint']['min_position']}" scope="parent"/>
<xacro:property name="shoulder_lift_upper_limit" value="${sec_limits['shoulder_lift_joint']['max_position']}" scope="parent"/>
<xacro:property name="shoulder_lift_velocity_limit" value="${sec_limits['shoulder_lift_joint']['max_velocity']}" scope="parent"/>
<xacro:property name="shoulder_lift_effort_limit" value="${sec_limits['shoulder_lift_joint']['max_effort']}" scope="parent"/>
<xacro:property name="elbow_joint_lower_limit" value="${sec_limits['elbow_joint']['min_position']}" scope="parent"/>
<xacro:property name="elbow_joint_upper_limit" value="${sec_limits['elbow_joint']['max_position']}" scope="parent"/>
<xacro:property name="elbow_joint_velocity_limit" value="${sec_limits['elbow_joint']['max_velocity']}" scope="parent"/>
<xacro:property name="elbow_joint_effort_limit" value="${sec_limits['elbow_joint']['max_effort']}" scope="parent"/>
<xacro:property name="wrist_1_lower_limit" value="${sec_limits['wrist_1_joint']['min_position']}" scope="parent"/>
<xacro:property name="wrist_1_upper_limit" value="${sec_limits['wrist_1_joint']['max_position']}" scope="parent"/>
<xacro:property name="wrist_1_velocity_limit" value="${sec_limits['wrist_1_joint']['max_velocity']}" scope="parent"/>
<xacro:property name="wrist_1_effort_limit" value="${sec_limits['wrist_1_joint']['max_effort']}" scope="parent"/>
<xacro:property name="wrist_2_lower_limit" value="${sec_limits['wrist_2_joint']['min_position']}" scope="parent"/>
<xacro:property name="wrist_2_upper_limit" value="${sec_limits['wrist_2_joint']['max_position']}" scope="parent"/>
<xacro:property name="wrist_2_velocity_limit" value="${sec_limits['wrist_2_joint']['max_velocity']}" scope="parent"/>
<xacro:property name="wrist_2_effort_limit" value="${sec_limits['wrist_2_joint']['max_effort']}" scope="parent"/>
<xacro:property name="wrist_3_lower_limit" value="${sec_limits['wrist_3_joint']['min_position']}" scope="parent"/>
<xacro:property name="wrist_3_upper_limit" value="${sec_limits['wrist_3_joint']['max_position']}" scope="parent"/>
<xacro:property name="wrist_3_velocity_limit" value="${sec_limits['wrist_3_joint']['max_velocity']}" scope="parent"/>
<xacro:property name="wrist_3_effort_limit" value="${sec_limits['wrist_3_joint']['max_effort']}" scope="parent"/>
<!-- DH PARAMETERS -->
<xacro:property name="d1" value="${sec_dh_parameters['d1']}" scope="parent"/>
<xacro:property name="a2" value="${sec_dh_parameters['a2']}" scope="parent"/>
<xacro:property name="a3" value="${sec_dh_parameters['a3']}" scope="parent"/>
<xacro:property name="d4" value="${sec_dh_parameters['d4']}" scope="parent"/>
<xacro:property name="d5" value="${sec_dh_parameters['d5']}" scope="parent"/>
<xacro:property name="d6" value="${sec_dh_parameters['d6']}" scope="parent"/>
<!-- kinematics -->
<xacro:property name="shoulder_x" value="${sec_kinematics['shoulder']['x']}" scope="parent"/>
<xacro:property name="shoulder_y" value="${sec_kinematics['shoulder']['y']}" scope="parent"/>
<xacro:property name="shoulder_z" value="${sec_kinematics['shoulder']['z']}" scope="parent"/>
<xacro:property name="shoulder_roll" value="${sec_kinematics['shoulder']['roll']}" scope="parent"/>
<xacro:property name="shoulder_pitch" value="${sec_kinematics['shoulder']['pitch']}" scope="parent"/>
<xacro:property name="shoulder_yaw" value="${sec_kinematics['shoulder']['yaw']}" scope="parent"/>
<xacro:property name="upperarm_x" value="${sec_kinematics['upperarm']['x']}" scope="parent"/>
<xacro:property name="upperarm_y" value="${sec_kinematics['upperarm']['y']}" scope="parent"/>
<xacro:property name="upperarm_z" value="${sec_kinematics['upperarm']['z']}" scope="parent"/>
<xacro:property name="upperarm_roll" value="${sec_kinematics['upperarm']['roll']}" scope="parent"/>
<xacro:property name="upperarm_pitch" value="${sec_kinematics['upperarm']['pitch']}" scope="parent"/>
<xacro:property name="upperarm_yaw" value="${sec_kinematics['upperarm']['yaw']}" scope="parent"/>
<xacro:property name="forearm_x" value="${sec_kinematics['forearm']['x']}" scope="parent"/>
<xacro:property name="forearm_y" value="${sec_kinematics['forearm']['y']}" scope="parent"/>
<xacro:property name="forearm_z" value="${sec_kinematics['forearm']['z']}" scope="parent"/>
<xacro:property name="forearm_roll" value="${sec_kinematics['forearm']['roll']}" scope="parent"/>
<xacro:property name="forearm_pitch" value="${sec_kinematics['forearm']['pitch']}" scope="parent"/>
<xacro:property name="forearm_yaw" value="${sec_kinematics['forearm']['yaw']}" scope="parent"/>
<xacro:property name="wrist_1_x" value="${sec_kinematics['wrist_1']['x']}" scope="parent"/>
<xacro:property name="wrist_1_y" value="${sec_kinematics['wrist_1']['y']}" scope="parent"/>
<xacro:property name="wrist_1_z" value="${sec_kinematics['wrist_1']['z']}" scope="parent"/>
<xacro:property name="wrist_1_roll" value="${sec_kinematics['wrist_1']['roll']}" scope="parent"/>
<xacro:property name="wrist_1_pitch" value="${sec_kinematics['wrist_1']['pitch']}" scope="parent"/>
<xacro:property name="wrist_1_yaw" value="${sec_kinematics['wrist_1']['yaw']}" scope="parent"/>
<xacro:property name="wrist_2_x" value="${sec_kinematics['wrist_2']['x']}" scope="parent"/>
<xacro:property name="wrist_2_y" value="${sec_kinematics['wrist_2']['y']}" scope="parent"/>
<xacro:property name="wrist_2_z" value="${sec_kinematics['wrist_2']['z']}" scope="parent"/>
<xacro:property name="wrist_2_roll" value="${sec_kinematics['wrist_2']['roll']}" scope="parent"/>
<xacro:property name="wrist_2_pitch" value="${sec_kinematics['wrist_2']['pitch']}" scope="parent"/>
<xacro:property name="wrist_2_yaw" value="${sec_kinematics['wrist_2']['yaw']}" scope="parent"/>
<xacro:property name="wrist_3_x" value="${sec_kinematics['wrist_3']['x']}" scope="parent"/>
<xacro:property name="wrist_3_y" value="${sec_kinematics['wrist_3']['y']}" scope="parent"/>
<xacro:property name="wrist_3_z" value="${sec_kinematics['wrist_3']['z']}" scope="parent"/>
<xacro:property name="wrist_3_roll" value="${sec_kinematics['wrist_3']['roll']}" scope="parent"/>
<xacro:property name="wrist_3_pitch" value="${sec_kinematics['wrist_3']['pitch']}" scope="parent"/>
<xacro:property name="wrist_3_yaw" value="${sec_kinematics['wrist_3']['yaw']}" scope="parent"/>
<!-- INERTIA PARAMETERS -->
<!-- mass -->
<xacro:property name="base_mass" value="${sec_inertia_parameters['base_mass']}" scope="parent"/>
<xacro:property name="shoulder_mass" value="${sec_inertia_parameters['shoulder_mass']}" scope="parent"/>
<xacro:property name="upperarm_mass" value="${sec_inertia_parameters['upperarm_mass']}" scope="parent"/>
<xacro:property name="forearm_mass" value="${sec_inertia_parameters['forearm_mass']}" scope="parent"/>
<xacro:property name="wrist_1_mass" value="${sec_inertia_parameters['wrist_1_mass']}" scope="parent"/>
<xacro:property name="wrist_2_mass" value="${sec_inertia_parameters['wrist_2_mass']}" scope="parent"/>
<xacro:property name="wrist_3_mass" value="${sec_inertia_parameters['wrist_3_mass']}" scope="parent"/>
<!-- center of mass -->
<xacro:property name="prop_base_cog" value="${sec_inertia_parameters['center_of_mass']['base_cog']}" scope="parent"/>
<xacro:property name="prop_shoulder_cog" value="${sec_inertia_parameters['center_of_mass']['shoulder_cog']}" scope="parent"/>
<xacro:property name="prop_upperarm_cog" value="${sec_inertia_parameters['center_of_mass']['upperarm_cog']}" scope="parent"/>
<xacro:property name="prop_forearm_cog" value="${sec_inertia_parameters['center_of_mass']['forearm_cog']}" scope="parent"/>
<xacro:property name="prop_wrist_1_cog" value="${sec_inertia_parameters['center_of_mass']['wrist_1_cog']}" scope="parent"/>
<xacro:property name="prop_wrist_2_cog" value="${sec_inertia_parameters['center_of_mass']['wrist_2_cog']}" scope="parent"/>
<xacro:property name="prop_wrist_3_cog" value="${sec_inertia_parameters['center_of_mass']['wrist_3_cog']}" scope="parent"/>
<!-- inertia -->
<xacro:property name="prop_base_inertia" value="${sec_inertia_parameters['inertia']['base']}" scope="parent"/>
<xacro:property name="prop_shoulder_inertia" value="${sec_inertia_parameters['inertia']['shoulder']}" scope="parent"/>
<xacro:property name="prop_upperarm_inertia" value="${sec_inertia_parameters['inertia']['upperarm']}" scope="parent"/>
<xacro:property name="prop_forearm_inertia" value="${sec_inertia_parameters['inertia']['forearm']}" scope="parent"/>
<xacro:property name="prop_wrist_1_inertia" value="${sec_inertia_parameters['inertia']['wrist_1']}" scope="parent"/>
<xacro:property name="prop_wrist_2_inertia" value="${sec_inertia_parameters['inertia']['wrist_2']}" scope="parent"/>
<xacro:property name="prop_wrist_3_inertia" value="${sec_inertia_parameters['inertia']['wrist_3']}" scope="parent"/>
</xacro:macro>
</robot>

View File

@@ -0,0 +1,73 @@
<?xml version="1.0"?>
<robot xmlns:xacro="http://wiki.ros.org/xacro">
<!--
NOTE the macro defined in this file is NOT part of the public API of this
package. Users CANNOT rely on this file being available, or stored in
this location. Nor can they rely on the existence of the macro.
-->
<xacro:macro name="cs_arm_transmission" params="prefix hw_interface">
<transmission name="${prefix}shoulder_pan_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${prefix}shoulder_pan_joint">
<hardwareInterface>${hw_interface}</hardwareInterface>
</joint>
<actuator name="${prefix}shoulder_pan_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="${prefix}shoulder_lift_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${prefix}shoulder_lift_joint">
<hardwareInterface>${hw_interface}</hardwareInterface>
</joint>
<actuator name="${prefix}shoulder_lift_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="${prefix}elbow_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${prefix}elbow_joint">
<hardwareInterface>${hw_interface}</hardwareInterface>
</joint>
<actuator name="${prefix}elbow_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="${prefix}wrist_1_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${prefix}wrist_1_joint">
<hardwareInterface>${hw_interface}</hardwareInterface>
</joint>
<actuator name="${prefix}wrist_1_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="${prefix}wrist_2_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${prefix}wrist_2_joint">
<hardwareInterface>${hw_interface}</hardwareInterface>
</joint>
<actuator name="${prefix}wrist_2_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
<transmission name="${prefix}wrist_3_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${prefix}wrist_3_joint">
<hardwareInterface>${hw_interface}</hardwareInterface>
</joint>
<actuator name="${prefix}wrist_3_motor">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>
</robot>