您的位置:首页 > 其它

ROS环境下机器人建模(XACRO)及常见问题解决

2016-11-15 09:37 357 查看
在ROS环境下进行机器人建模最常用的方法就是使用URDF文件对机器人进行描述,URDF文件形成通常有三种途径:

1.直接使用URDF的XML tag进行文件编写。

2.使用XACRO建模后转换成URDF文件(更简洁灵活,利于程序复用)。

3.使用三维软件Solidworks进行三维绘图后使用SW2URDF 插件转换成URDF文件(插件对不同的SW兼容性不好,不易安装成功)。

本次建模使用上述的第二种方法。模型为一个四自由度机械手,具体的建模程序如下:

-------------------------------------------------------分割线---------------------------------------

<?xml version="1.0"?>
<robot name="dobot_arm" xmlns:xacro="http://www.ros.org/wiki/xacro">

<!-- Include materials -->

<material name="Black">
<color rgba="0.0 0.0 0.0 1.0"/>
</material>

<material name="Red">
<color rgba="0.8 0.0 0.0 1.0"/>
</material>

<material name="White">
<color rgba="1.0 1.0 1.0 1.0"/>
</material>

<!-- Constants -->
<property name="deg_to_rad" value="0.01745329251994329577"/>
<property name="M_PI" value="3.14159"/>
<property name="x" value="0.0125"/>

<!-- base link properties -->
<property name="base_len" value="0.168" />
<property name="base_width" value="0.168" />
<property name="base_height" value="0.055" />

<!-- shoulder link properties -->
<property name="shoulder_radius" value="0.06" />
<property name="shoulder_len" value="0.085" />

<!-- bigarm link properties -->
<property name="bigarm_radius" value="0.03" />
<property name="bigarm_len" value="0.135" />

<!-- forearm link properties -->
<property name="forearm_radius" value="0.03" />
<property name="forearm_len" value="0.147" />

<!-- chuck link properties -->
<property name="chuck_len" value="0.08" />
<property name="chuck_width" value="0.03" />
<property name="chuck_height" value="0.03" />

<!-- inertial matrix macro definition -->
<xacro:macro name="inertial_matrix" params="mass">
<inertial>
<mass value="${mass}" />
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0" />
</inertial>
</xacro:macro>

<!-- transmission block macro definition -->
<xacro:macro name="transmission_block" params="joint_name">
<transmission name="tran1">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${joint_name}">
<hardwareInterface>PositionJointInterface</hardwareInterface>
</joint>
<actuator name="motor1">
<hardwareInterface>PositionJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>

<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
<virtual_joint name="fixed_frame" type="fixed" parent_frame="base_link" child_link="base_link" />

<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -->

<!-- BASE LINK -->
<link name="base_link">
<visual>
<origin xyz="0 0 0.0275" rpy="0 0 0" />
<geometry>
<box size="${base_len} ${base_width} ${base_height}" />
</geometry>
<material name="White" />
</visual>

<collision>
<origin xyz="0 0 0.0275" rpy="0 0 0" />
<geometry>
<box size="${base_len} ${base_width} ${base_height}" />
</geometry>
</collision>>
<xacro:inertial_matrix mass="1"/>
</link>

<gazebo reference="base_link">
<material>Gazebo/White</material>
</gazebo>

<joint name="shoulder_joint" type="revolute">
<parent link="base_link"/>
<child link="shoulder_link"/>
<origin xyz="0 0 0.055" rpy="0 0 0" />
<axis xyz="0 0 1" />
<limit effort="300" velocity="1" lower="-2.35619449" upper="2.35619449"/>
<dynamics damping="50" friction="1"/>
</joint>

<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -->

<!-- SHOULDER LINK -->
<link name="shoulder_link" >
<visual>
<origin xyz="0 0 0.0425" rpy="0 0 0" />
<geometry>
<cylinder radius="${shoulder_radius}" length="${shoulder_len}"/>
</geometry>
<material name="Red" />
</visual>

<collision>
<origin xyz="0 0 0.0425" rpy="0 0 0" />
<geometry>
<cylinder radius="${shoulder_radius}" length="${shoulder_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>

<gazebo reference="shoulder_link">
<material>Gazebo/Red</material>
</gazebo>

<joint name="bigarm_joint" type="revolute">
<parent link="shoulder_link"/>
<child link="bigarm_link"/>
<origin xyz="0 0 0.085" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="300" velocity="1" lower="0.0" upper="1.483529864195" />
<dynamics damping="50" friction="1"/>
</joint>

<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -->

<!-- BIGARM LINK -->
<link name="bigarm_link" >
<visual>
<origin xyz="0 0 0.0675" rpy="0 0 0" />
<geometry>
<cylinder radius="${bigarm_radius}" length="${bigarm_len}"/>
</geometry>
<material name="White" />
</visual>

<collision>
<origin xyz="0 0 0.0675" rpy="0 0 0" />
<geometry>
<cylinder radius="${bigarm_radius}" length="${bigarm_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>

<gazebo reference="bigarm_link">
<material>Gazebo/White</material>
</gazebo>

<joint name="forearm_joint" type="revolute">
<parent link="bigarm_link"/>
<child link="forearm_link"/>
<origin xyz="0 0 0.135" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="300" velocity="1" lower="-0.1745329251994329577" upper="1.65806278939" />
<dynamics damping="50" friction="1"/>
</joint>

<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -->

<!--FOREARM LINK -->
<link name="forearm_link" >
<visual>
<origin xyz="0 0 0.0735" rpy="0 0 0" />
<geometry>
<cylinder radius="${forearm_radius}" length="${forearm_len}"/>
</geometry>
<material name="Black" />
</visual>

<collision>
<origin xyz="0 0 0.0735" rpy="0 0 0" />
<geometry>
<cylinder radius="${forearm_radius}" length="${forearm_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>

<gazebo reference="forearm_link">
<material>Gazebo/Black</material>
</gazebo>

<joint name="chuck_joint" type="revolute">
<parent link="forearm_link"/>
<child link="chuck_link"/>
<origin xyz="0 0 0.147" rpy="0
4000
0 0" />
<axis xyz="0 1 0" />
<limit effort="300" velocity="1" lower="-1.5707963267948966" upper="1.5707963267948966" />
<dynamics damping="50" friction="1"/>
</joint>

<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -->

<!--FOREARM LINK -->
<link name="chuck_link" >
<visual>
<origin xyz="0.02 0 0.0155" rpy="0 0 0" />
<geometry>
<box size="${chuck_len} ${chuck_width} ${chuck_height}" />
</geometry>
<material name="Red" />
</visual>

<collision>
<origin xyz="0 0 0.0155" rpy="0 0 0" />
<geometry>
<box size="${chuck_len} ${chuck_width} ${chuck_height}" />
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>

<gazebo reference="chuck_link">
<material>Gazebo/Red</material>
</gazebo>

<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
<!-- Transmissions for ROS Control -->
<xacro:transmission_block joint_name="shoulder_joint"/>
<xacro:transmission_block joint_name="bigarm_joint"/>
<xacro:transmission_block joint_name="forearm_joint"/>
<xacro:transmission_block joint_name="chuck_joint"/>
<!-- ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -->
<!-- ros_control plugin -->
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/dobot_arm</robotNamespace>
</plugin>
</gazebo>
</robot>

-------------------------------------------------------分割线------------------------------------------------------

建模完成后使用launch文件在RViz插件下查看自己的模型,launch文件的使用请参考相关博客,此处不展开。


      在查看模型时容易遇到的一个问题是RVIZ显示如下错误:

No tf data. Actual error: Fixed Frame [map] does not exist......

解决办法就是在固定的第一个LINK上增加一个虚拟额Joint,使其父LINK和子LINK都是同一个(上面的程序已经加入),例如:

<virtual_joint name="fixed_frame" type="fixed" parent_frame="base_link" child_link="base_link" />


这样就不会有无法定位初始坐标的问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ROS URDF XACRO RViz