在某宝上买了个机械臂,想用来和ros系统通讯玩一玩。我简单学习了一下硬件,现在开始软件方面的学习。第一步先在ros系统中对机械臂进行虚拟仿真,因此需要导入模型。手写六自由度机械臂的urdf或者xacro文件太费劲,好在SolidWorks出了一款sw_urdf_exporter插件,可以自动生成urdf及展示用的launch文件,非常方便。

sw_urdf_exporter插件

下载链接及安装详情可以看官方文档

安装完成后,进入sw界面加载该插件

六自由度机械臂python控制_urdf

六自由度机械臂python控制_机械臂_02


点选SW2URDF插件选项框并点击确定,插件即可成功加载。

给机械臂添加坐标系和旋转轴

机械臂如图所示

六自由度机械臂python控制_ROS_03


第一步,添加点,该点作为后面坐标原点的位置参考点。参考几何体->点,然后根据几何关系选定点的位置。

六自由度机械臂python控制_六自由度机械臂python控制_04

第二步,添加轴,该轴即为joint的转轴,与即将建立的坐标系的z轴重合。参考几何体->基准轴,同样根据几何关系选定基准轴位置。

六自由度机械臂python控制_六自由度机械臂python控制_05

第三步,添加坐标系。参考几何体->坐标系,坐标系原点位置为第一步添加的点的位置,z轴与第二步添加的基准轴重合。

六自由度机械臂python控制_六自由度机械臂python控制_06


最终建立的坐标系如图所示,其中坐标系3是base_link上的坐标系,z轴的方向需要与机械臂直立的方向一致,否则会在rviz中倒立显示。坐标系4、5、6、8、9为机械臂连杆上的五个旋转joint坐标系,坐标系10为旋转的finger坐标系。

六自由度机械臂python控制_urdf_07

在URDF界面设置坐标系和旋转轴

工具->File->Export as Urdf,下面是具体界面。其中,Link Components部分选择该link部分包含的零件,Number of Child links即为子连杆的数量,这里每个link的子连杆均为1。

六自由度机械臂python控制_urdf_08


各关节类型均为revolute,各选项点选完毕后,点击“preview and export”

六自由度机械臂python控制_ROS_09

六自由度机械臂python控制_ROS_10


在点击“preview and export”后,会出现如下界面,按图示填写每个关节的限位值,注意是弧度。该界面中的内容可以后期在生成的urdf文件中修改。

六自由度机械臂python控制_ROS_11

生成package包

注意该包文件需要是小写字母命名。

六自由度机械臂python控制_xml_12

将生成的包复制到工作空间内,新建myrobot_description.urdf.xacro文件,内容如下:

<?xml version="1.0"?>
<robot name="myrobot_description" xmlns:xacro="http://www.ros.org/wiki/xacro">
……
原myrobot_description.urdf文件的内容
……
 <!--/// gazebo -->
      <!-- Transmissions for ROS Control -->
    <xacro:macro name="transmission_block" params="joint_name">
        <transmission name="tran1">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${joint_name}">
                <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
            </joint>
            <actuator name="motor1">
                <hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>
    
    <xacro:transmission_block joint_name="base_link_to_link_02"/>
    <xacro:transmission_block joint_name="link_02_to_link_03"/>
    <xacro:transmission_block joint_name="link_03_to_link_04"/>
    <xacro:transmission_block joint_name="link_04_to_link_05"/>
    <xacro:transmission_block joint_name="link_05_to_link_06"/>
    <xacro:transmission_block joint_name="finger_joint"/>

    <!-- ros_control plugin -->
    <gazebo>
        <plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
            <robotNamespace>/myrobot_description</robotNamespace>
        </plugin>
    </gazebo>

</robot>

display.launch内容如下:

<launch>
  <arg
    name="urdf_file" default="$(find xacro)/xacro.py '$(find myrobot_description)/urdf/myrobot_description.urdf.xacro'" />
  <arg
    name="gui"
    default="True" />
  <param
    name="robot_description"
    command="$(arg urdf_file)" />
  <param
    name="use_gui"
    value="$(arg gui)" />
  <node
    name="joint_state_publisher"
    pkg="joint_state_publisher"
    type="joint_state_publisher" />
  <node
    name="robot_state_publisher"
    pkg="robot_state_publisher"
    type="state_publisher" />
  <node
    name="rviz"
    pkg="rviz"
    type="rviz"
    args="-d $(find myrobot_description)/urdf.rviz" />
</launch>
测试

使用命令

roslaunch display.launch

六自由度机械臂python控制_xml_13

六自由度机械臂python控制_六自由度机械臂python控制_14


图纸我已经上传了,下面是链接供大家下载使用~
另外提醒一点,这个模型在ros中建模tf树会出现问题,后面我是1:1按照图纸的尺寸,用SolidWorks重新建了个机械臂。如果可能大家还是自己建一个,很简单,知道每个轴尺寸即可~