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都是同一个(上面的程序已经加入),例如:
这样就不会有无法定位初始坐标的问题了。
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" />
这样就不会有无法定位初始坐标的问题了。
相关文章推荐
- Android开发环境搭建和常见问题的解决方法
- 混合环境下WMI 远程连接常见问题解决方法(Remote access)
- VS环境常见问题及解决办法
- Android开发环境搭建及常见问题解决方法
- Android 搭建开发环境 常见问题与解决方法
- Android开发环境部署 及 常见问题解决
- linux环境下mysql5.6的安装、配置、使用及常见问题解决办法
- zookeeper的配置(Windows环境和Linux环境下)常见问题(zookeeper_server.pid: No such file or directory)解决
- Android 开发环境搭建及常见问题解决
- Win7系统64位环境下使用Apache——Apache2.2安装及常见问题解决
- Windows下PCI9054驱动程序开发环境搭建及常见问题解决
- mac下开发环境的常见问题解决方法
- Android开发环境搭建及常见问题解决方法
- ubuntu下Qt之android环境配置以及一些常见问题解决
- (整合)安卓开发环境搭建+常见问题解决
- win7环境使用vc6的常见问题解决方法
- java-HelloWorld-环境配置-常见问题解决
- jenkins集群测试环境原理、部署及常见问题解决
- <持续更新>ubuntu下开发环境常见问题解决
- AMH面板手工编译升级PHP5.6.9环境以及常见问题解决