1 构建机械臂的xacro模型
创建一个6机械臂的xacro模型文件,完整gazebo模型如下所示:首先,定义6个link的形状以及末端夹具的大小: <!– link1 properties –><xacro:property name=”link0_radius” value=”0.05″/><xacro:property name=”link0_length” value=”0.04″/><xacro:property name=”link0_mass” value=”1″/><!– link1 properties –><xacro:property name=”link1_radius” value=”0.03″/><xacro:property name=”link1_length” value=”0.10″/><xacro:property name=”link1_mass” value=”1″/><!– link2 properties –><xacro:property name=”link2_radius” value=”0.03″/><xacro:property name=”link2_length” value=”0.14″/><xacro:property name=”link2_mass” value=”0.8″/><!– link3 properties –><xacro:property name=”link3_radius” value=”0.03″/><xacro:property name=”link3_length” value=”0.15″/><xacro:property name=”link3_mass” value=”0.8″/><!– link4 properties –><xacro:property name=”link4_radius” value=”0.025″/><xacro:property name=”link4_length” value=”0.06″/><xacro:property name=”link4_mass” value=”0.7″/><!– link5 properties –><xacro:property name=”link5_radius” value=”0.03″/><xacro:property name=”link5_length” value=”0.06″/><xacro:property name=”link5_mass” value=”0.7″/><!– link6 properties –><xacro:property name=”link6_radius” value=”0.04″/><xacro:property name=”link6_length” value=”0.02″/><xacro:property name=”link6_mass” value=”0.6″/><!– gripper –><xacro:property name=”gripper_length” value=”0.03″/><xacro:property name=”gripper_width” value=”0.01″/><xacro:property name=”gripper_height” value=”0.06″/><xacro:property name=”gripper_mass” value=”0.5″/>
<
接着,需要设置每一个Link的详细参数以及两个Link连接处的joint的类型和旋转轴:<!–Gripper frame –><xacro:property name=”grasp_frame_radius” value=”0.001″/><!–Macrofor inertia matrix –><xacro:macro name=”cylinder_inertial_matrix” params=”m r h”><inertial><mass value=”${m}”/><inertia ixx=”${m*(3*r*r+h*h)/12}” ixy =”0″ ixz =”0″ iyy=”${m*(3*r*r+h*h)/12}” iyz =”0″ izz=”${m*r*r/2}”/></inertial></xacro:macro><xacro:macro name=”box_inertial_matrix” params=”m w h d”><inertial><mass value=”${m}”/><inertia ixx=”${m*(h*h+d*d)/12}” ixy =”0″ ixz =”0″ iyy=”${m*(w*w+d*d)/12}” iyz =”0″ izz=”${m*(w*w+h*h)/12}”/></inertial></xacro:macro><!–///////////////////////////////////// ARM BASE //////////////////////////////////////////////–><xacro:macro name=”arm_base” params=”parent xyz rpy”><joint name=”${parent}_arm_joint” type=”fixed”><origin xyz=”${xyz}” rpy=”${rpy}”/><parent link=”${parent}”/><child link=”base_link”/></joint><link name=”base_link”><visual><origin xyz=”0 0 0″ rpy=”0 0 0″/><geometry><box size=”0.001 0.001 0.001″/></geometry></visual></link><joint name=”base_joint” type=”fixed”><origin xyz=”0 0 ${link0_length/2}” rpy=”0 0 0″/><parent link=”base_link”/><child link=”link0″/></joint><!–///////////////////////////////////// LINK0 //////////////////////////////////////////////–><link name=”link0″><visual><origin xyz=”0 0 0″ rpy=”0 0 0″/><geometry><cylinder radius=”${link0_radius}” length=”${link0_length}”/></geometry><material name=”White”/></visual><collision><origin xyz=”0 0 0″ rpy=”0 0 0″/><geometry><cylinder radius=”${link0_radius}” length=”${link0_length}”/></geometry></collision><cylinder_inertial_matrix m=”${link0_mass}” r=”${link0_radius}” h=”${link0_length}”/></link><joint name=”joint1″ type=”revolute”><parent link=”link0″/><child link=”link1″/><origin xyz=”0 0 ${link0_length/2}” rpy=”0 ${M_PI/2} 0″/><axis xyz=”-1 0 0″/><limit effort=”300″ velocity=”1″ lower=”${-M_PI}” upper=”${M_PI}”/></joint><!–///////////////////////////////////// LINK1 //////////////////////////////////////////////–><link name=”link1″><visual><origin xyz=”-${link1_length/2} 0 0″ rpy=”0 ${M_PI/2} 0″/><geometry><cylinder radius=”${link1_radius}” length=”${link1_length}”/></geometry><material name=”Blue”/></visual><collision><origin xyz=”-${link1_length/2} 0 0″ rpy=”0 ${M_PI/2} 0″/><geometry><cylinder radius=”${link1_radius}” length=”${link1_length}”/></geometry></collision><cylinder_inertial_matrix m=”${link1_mass}” r=”${link1_radius}” h=”${link1_length}”/></link><joint name=”joint2″ type=”revolute”><parent link=”link1″/><child link=”link2″/><origin xyz=”-${link1_length} 0 0.0″ rpy=”-${M_PI/2} 0 ${M_PI/2}”/><axis xyz=”1 0 0″/><limit effort=”300″ velocity=”1″ lower=”${-M_PI}” upper=”${M_PI}”/></joint><!–/////////////////////////////////////// LINK2 //////////////////////////////////////////////–><link name=”link2″><visual><origin xyz=”0 0 ${link2_length/2}” rpy=”0 0 0″/><geometry><cylinder radius=”${link2_radius}” length=”${link2_length}”/></geometry><material name=”White”/></visual><collision><origin xyz=”0 0 ${link2_length/2}” rpy=”0 0 0″/><geometry><cylinder radius=”${link2_radius}” length=”${link2_length}”/></geometry></collision><cylinder_inertial_matrix m=”${link2_mass}” r=”${link2_radius}” h=”${link2_length}”/></link><joint name=”joint3″ type=”revolute”><parent link=”link2″/><child link=”link3″/><origin xyz=”0 0 ${link2_length}” rpy=”0 ${M_PI} 0″/><axis xyz=”-1 0 0″/><limit effort=”300″ velocity=”1″ lower=”${-M_PI}” upper=”${M_PI}”/></joint><!–///////////////////////////////// LINK3 /////////////////////////////////////////////////////–><link name=”link3″><visual><origin xyz=”0 0 -${link3_length/2}” rpy=”0 0 0″/><geometry><cylinder radius=”${link3_radius}” length=”${link3_length}”/></geometry><material name=”Blue”/></visual><collision><origin xyz=”0 0 -${link3_length/2}” rpy=”0 0 0″/><geometry><cylinder radius=”${link3_radius}” length=”${link3_length}”/></geometry></collision><cylinder_inertial_matrix m=”${link3_mass}” r=”${link3_radius}” h=”${link3_length}”/></link><joint name=”joint4″ type=”revolute”><parent link=”link3″/><child link=”link4″/><origin xyz=”0.0 0.0 -${link3_length}” rpy=”0 ${M_PI/2} ${M_PI}”/><axis xyz=”1 0 0″/><limit effort=”300″ velocity=”1″ lower=”${-M_PI}” upper=”${M_PI}”/></joint><!–/////////////////////////////////// LINK4 ////////////////////////////////////////////////–><link name=”link4″><visual><origin xyz=”${link4_length/2} 0 0″ rpy=”0 ${M_PI/2} 0″/><geometry><cylinder radius=”${link4_radius}” length=”${link4_length}”/></geometry><material name=”Black”/></visual><collision><origin xyz=”${link4_length/2} 0 0″ rpy=”0 ${M_PI/2} 0″/><geometry><cylinder radius=”${link4_radius}” length=”${link4_length}”/></geometry></collision><cylinder_inertial_matrix m=”${link4_mass}” r=”${link4_radius}” h=”${link4_length}”/></link><joint name=”joint5″ type=”revolute”><parent link=”link4″/><child link=”link5″/><origin xyz=”${link4_length} 0.0 0.0″ rpy=”0 ${M_PI/2} 0″/><axis xyz=”1 0 0″/><limit effort=”300″ velocity=”1″ lower=”${-M_PI}” upper=”${M_PI}”/></joint><!–////////////////////////////////// LINK5 /////////////////////////////////////////////////–><link name=”link5″><visual><origin xyz=”0 0 ${link4_length/2}” rpy=”0 0 0″/><geometry><cylinder radius=”${link5_radius}” length=”${link5_length}”/></geometry><material name=”White”/></visual><collision><origin xyz=”0 0 ${link4_length/2} ” rpy=”0 0 0″/><geometry><cylinder radius=”${link5_radius}” length=”${link5_length}”/></geometry></collision><cylinder_inertial_matrix m=”${link5_mass}” r=”${link5_radius}” h=”${link5_length}”/></link><joint name=”joint6″ type=”revolute”><parent link=”link5″/><child link=”link6″/><origin xyz=”0 0 ${link4_length}” rpy=”${1.5*M_PI} -${M_PI/2} 0″/><axis xyz=”1 0 0″/><limit effort=”300″ velocity=”1″ lower=”${-2*M_PI}” upper=”${2*M_PI}”/></joint><!–//////////////////////////////// LINK6 /////////////////////////////////////////////////–><link name=”link6″><visual><origin xyz=”${link6_length/2} 0 0 ” rpy=”0 ${M_PI/2} 0″/><geometry><cylinder radius=”${link6_radius}” length=”${link6_length}”/></geometry><material name=”Blue”/></visual><collision><origin xyz=”${link6_length/2} 0 0″ rpy=”0 ${M_PI/2} 0″/><geometry><cylinder radius=”${link6_radius}” length=”${link6_length}”/></geometry></collision><cylinder_inertial_matrix m=”${link6_mass}” r=”${link6_radius}” h=”${link6_length}”/></link><joint name=”finger_joint1″ type=”prismatic”><parent link=”link6″/><child link=”gripper_finger_link1″/><origin xyz=”${link6_length} -0.03 0″ rpy=”0 0 0″/><axis xyz=”0 1 0″/><limit effort=”100″ lower=”0″ upper=”0.06″ velocity=”0.02″/></joint><!–////////////////////////////////////// gripper //////////////////////////////////////////////–><!– LEFT GRIPPER AFT LINK –><link name=”gripper_finger_link1″><visual><origin xyz=”${gripper_height/2} 0 0″ rpy=”0 ${M_PI/2} 0″/><geometry><box size=”${gripper_length} ${gripper_width} ${gripper_height}”/></geometry><material name=”White”/></visual><collision><origin xyz=”${gripper_height/2} 0 0″ rpy=”0 ${M_PI/2} 0″/><geometry><box size=”${gripper_length} ${gripper_width} ${gripper_height}”/></geometry></collision><box_inertial_matrix m=”${gripper_mass}” w=”${gripper_width}” h=”${gripper_height}” d=”${gripper_length}”/></link><joint name=”finger_joint2″ type=”fixed”><parent link=”link6″/><child link=”gripper_finger_link2″/><origin xyz=”${link6_length} 0.03 0″ rpy=”0 0 0″/></joint><!– RIGHT GRIPPER AFT LINK –><link name=”gripper_finger_link2″><visual><origin xyz=”${gripper_height/2} 0 0″ rpy=”0 ${M_PI/2} 0″/><geometry><box size=”${gripper_length} ${gripper_width} ${gripper_height}”/></geometry><material name=”White”/></visual><collision><origin xyz=”${gripper_height/2} 0 0″ rpy=”0 ${M_PI/2} 0″/><geometry><box size=”${gripper_length} ${gripper_width} ${gripper_height}”/></geometry></collision><box_inertial_matrix m=”${gripper_mass}” w=”${gripper_width}” h=”${gripper_height}” d=”${gripper_length}”/></link><!–Grasping frame –><link name=”grasping_frame”/><joint name=”grasping_frame_joint” type=”fixed”><parent link=”link6″/><child link=”grasping_frame”/><origin xyz=”${gripper_height} 0 0″ rpy=”0 0 0″/></joint>
<
注意:可以看到其中joint1和joint4的旋转轴和其他的不同,是因为后面在moveit中通过拖拽末端设置目标位姿时,必须至少包含2个这种旋转joint才能实现任意拖拽,否则机械臂是不能被拖动的。
最后,为每一个joint添加一个硬件仿真接口:<!–Transmissionsfor ROS Control–><xacro:macro name=”transmission_block” params=”joint_name”><transmission name=”${joint_name}_trans”><type>transmission_interface/SimpleTransmission</type><joint name=”${joint_name}”><hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface></joint><actuator name=”${joint_name}_motor”><hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission></xacro:macro><xacro:transmission_block joint_name=”joint1″/><xacro:transmission_block joint_name=”joint2″/><xacro:transmission_block joint_name=”joint3″/><xacro:transmission_block joint_name=”joint4″/><xacro:transmission_block joint_name=”joint5″/><xacro:transmission_block joint_name=”joint6″/><xacro:transmission_block joint_name=”finger_joint1″/><!– ros_control plugin –><gazebo><plugin name=”gazebo_ros_control” filename=”libgazebo_ros_control.so”><robotNamespace>/arm</robotNamespace></plugin></gazebo></xacro:macro>
<
这样机械臂的模型就建立好了,还需要注意的是,机械臂底座的质量一定要大些。
免责声明:文章内容来自互联网,本站不对其真实性负责,也不承担任何法律责任,如有侵权等情况,请与本站联系删除。
转载请注明出处:ROS机械臂控制之跟踪二维码-ros机械臂抓取 https://www.yhzz.com.cn/a/8683.html