ROS 中利用URDF 编写 Denso 机器人的一个简单模型——ROS机械臂学习笔记(一)

在ROS(Kinetic) 中利用URDF 编写 Denso 机器人的一个简单模型
Denso的URDF 模型主要是参照图1过来的,然后根据实际的情况进行了相应的修改。
denso机械臂

Denso机械臂的模型

在写模型过程中遇到的问题,在RVIZ 中的坐标系 红色为X,绿色为Y , 蓝色为Z 。rpy的数值是 沿着坐标系的箭头的方向,顺时针为正,逆时针为负。
有一点必须要注意的是:用URDF 生成的物体,如果没有做任何的旋转和位置变换的话,那么物体的坐标系的原点在自身物体的中心位置,而物体自身的坐标系和大地的参考坐标系是重合的,所以当你加载一个没有做任何变换的模型的时候,会看到物体的一半是在网格线的下面的。

在Link 属性中的 origin 条目中的 rpy 是连杆相对于自身的坐标系的旋转变换,三个系数依次对应 XYZ,这里和机器人学中的rpy值不太一样(重点);而 XYZ 则是是连杆的物体中心相对于自身的坐标系的原点的位置平移变换。
连杆之间的坐标系变换

 <link name="base_link">
        <visual>
            <geometry>
                <box size="0.1 0.1 0.15"/>
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0.075"/>
            <material name="blue"/>
        </visual>
    </link>

从这里可以看出base_link 相对于自身的坐标系是有一个位置变换的,沿着Z 方向上移动了 0.075,刚好是base_link的高度的一半,所以在图中看到的base_link是全部露出来的,而不是一半在网格线的下面的。

在Joint 属性中的 origin 条目中的 rpy 是 child link 的坐标系相对于 parent link坐标系的旋转变换;而 XYZ 则是 child link 的坐标系的原点相对于 parent link坐标系的原点的位置平移变换,先进行旋转再进行平移,XYZ轴的旋转按照顺序依次进行。另外还有一点值得注意的地方是这里的旋转和机器人学中的DH旋转变换不太一样,机器人学中的DH变换是相对于运动坐标系,而URDF中则是相对于静止坐标系进行旋转的。最后当joint属性中的 upper 和 lower 的平均值不为零时,child link 会相对于joint 中指定的旋转轴旋转 (upper+lower)/2 弧度。有的时候当你发现结果不对的时候,可以想想是不是设置关节角度上下限出了问题

一般来说,直接在URDF中修改成DH的坐标系显得很繁琐,正常应该是在Solidwork中建好模型之后,然后导出为URDF模型
连杆之间的坐标系变换

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

从这里可以看出shoulder_link 相对于 base_link 坐标系是有一个位置变换的,沿着Z 方向上移动了 0.15,刚好是base_link的高度,所以在图中看到的shoulder_link的坐标系是在base_link的上表面。

<?xml version="1.0"?>
<robot name="myfirstrobot">
    <material name="blue">
        <color rgba="0 0 0.8 0.6"/>
    </material>

    <material name="white">
        <color rgba="1 1 1 0.6"/>
    </material>

  <material name="orange">
    <color rgba="1 0.4 0.1 0.6"/>
  </material>

    <!-- Base Link -->
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.1 0.1 0.15"/>
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0.075"/>
            <material name="blue"/>
        </visual>
    </link>

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

    <link name="shoulder_link">
        <visual>
            <geometry>
                <cylinder length="0.125" radius="0.08"/>
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0.0625"/>
            <material name="white"/>
        </visual>
        <collision>
           <origin rpy="0 0 0" xyz="0 0 0.0625"/>
           <geometry>
              <cylinder length="0.125" radius="0.08"/>
           </geometry>
       </collision>
       <inertial>
          <mass value="1"/>
          <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0"/>
       </inertial>
   </link>
  <gazebo reference="shoulder_link">
    <material>Gazebo/White</material>
  </gazebo>

    <joint name="joint2" type="revolute">
        <parent link="shoulder_link"/>
        <child link="elbow_link"/>
        <origin rpy="1.570795 0 0" xyz="0 0 0.125"/>
        <axis xyz="0 0 1"/>
        <limit effort="300" lower="-2.094395066" upper="2.094395066" velocity="1"/>  
        <dynamics damping="50" friction="1"/>
    </joint>

    <link name="elbow_link">
        <visual>
            <geometry>
                 <box size="0.06 0.06 0.21"/>
            </geometry>
            <origin rpy="-1.570795 0 0" xyz="0 0.105 0"/>
            <material name="orange"/>
        </visual>
        <collision>
           <origin rpy="-1.570795 0 0" xyz="0 0.105 0"/>
           <geometry>
             <box size="0.06 0.06 0.21"/>
           </geometry>
       </collision>
       <inertial>
          <mass value="1"/>
          <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0"/>
       </inertial>
  </link>
  <gazebo reference="elbow_link">
    <material>Gazebo/orange</material>
  </gazebo>

   <joint name="joint3" type="revolute">
        <parent link="elbow_link"/>
        <child link="wrist_link"/>
        <origin rpy="0 0 1.570795" xyz="0 0.21 0"/>
        <axis xyz="0 0 1"/>
        <limit effort="300" lower="-1.2217304" upper="1.2217304" velocity="1"/> 
        <dynamics damping="50" friction="1"/>
    </joint>

    <link name="wrist_link">
        <visual>
            <geometry>
                 <box size="0.06 0.06 0.176"/>
            </geometry>
            <origin rpy="1.570795 0 0" xyz="0.03 0 0"/>
            <material name="orange"/>
        </visual>
       <collision>
           <origin rpy="1.570795 0 0" xyz="0.03 0 0"/>
           <geometry>
             <box size="0.06 0.06 0.176"/>
          </geometry>
      </collision>
      <inertial>
         <mass value="1"/>
         <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0"/>
      </inertial>
  </link>
  <gazebo reference="wrist_link">
    <material>Gazebo/orange</material>
  </gazebo>
   
    <joint name="joint4" type="revolute">
        <parent link="wrist_link"/>
        <child link="shoulder_r_link"/>
        <origin rpy="1.570795 -3.1415926 0" xyz="0.03 -0.088 0"/>
        <axis xyz="0 0 1"/>
        <limit effort="300" lower="-2.79252675555" upper="2.79252675555" velocity="1"/> 
        <dynamics damping="50" friction="1"/>
    </joint>

    <link name="shoulder_r_link">
        <visual>
            <geometry>
                 <cylinder length="0.122" radius="0.03"/>
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0.061"/>
            <material name="red"/>
        </visual>
        <collision>
            <origin rpy="0 0 0" xyz="0 0 0.061"/>
            <geometry>
                <cylinder length="0.122" radius="0.03"/>
            </geometry>
       </collision>
       <inertial>
           <mass value="1"/>
           <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0"/>
       </inertial>
  </link>
  <gazebo reference="shoulder_r_link">
    <material>Gazebo/red</material>
  </gazebo>

   <joint name="joint5" type="revolute">
        <parent link="shoulder_r_link"/>
        <child link="elbow_r_link"/>
        <origin rpy="1.570795 0 -1.570795" xyz="0 0 0.119"/>
        <axis xyz="1 0 0"/>
        <limit effort="300" lower="-2.094395066" upper="2.094395066" velocity="1"/>  
        <dynamics damping="50" friction="1"/>
    </joint>

    <link name="elbow_r_link">
        <visual>
            <geometry>
                 <cylinder length="0.070" radius="0.03"/>
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 -0.005"/>
            <material name="orange"/>
        </visual>
        <collision>
            <origin rpy="0 0 0" xyz="0 0 -0.005"/>
            <geometry>
                <cylinder length="0.070" radius="0.03"/>
            </geometry>
       </collision>
       <inertial>
          <mass value="1"/>
          <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0"/>
       </inertial>
  </link>
  <gazebo reference="elbow_r_link">
    <material>Gazebo/orange</material>
  </gazebo>

    <joint name="joint6" type="continuous">
        <parent link="elbow_r_link"/>
        <child link="wrist_r_link"/>
        <origin rpy="-1.570795 0 -1.570795" xyz="0 0 -0.04"/>
        <axis xyz="0 1 0"/>
        <dynamics damping="50" friction="1"/>
    </joint>

    <link name="wrist_r_link">
        <visual>
            <geometry>
                 <cylinder length="0.020" radius="0.03"/>
            </geometry>
            <origin rpy="1.570795 0 0" xyz="0 0 0"/>
            <material name="red"/>
        </visual>
        <collision>
            <origin rpy="1.570795 0 0" xyz="0 0 0"/>
            <geometry>
                <cylinder length="0.020" radius="0.03"/>
            </geometry>
       </collision>
      <inertial>
          <mass value="1"/>
          <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0"/>
      </inertial>
  </link>
  <gazebo reference="wrist_r_link">
    <material>Gazebo/red</material>
  </gazebo>
</robot>
  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,在ROS2,我们可以使用URDF(Unified Robot Description Format)来描述机器人模型和运动学参数。以下是一个简单URDF文件示例: ``` <?xml version="1.0"?> <robot name="my_robot"> <link name="base_link"> <visual> <geometry> <box size="0.5 0.5 0.5"/> </geometry> </visual> </link> <link name="link1"> <visual> <geometry> <cylinder radius="0.1" length="0.4"/> </geometry> </visual> <inertial> <mass value="1.0"/> <origin rpy="0 0 0.2" xyz="0 0 0.2"/> <inertia ixx="0.1" ixy="0" ixz="0" iyy="0.1" iyz="0" izz="0.1"/> </inertial> </link> <joint name="joint1" type="revolute"> <parent link="base_link"/> <child link="link1"/> <origin rpy="0 0 0" xyz="0 0 0.25"/> <axis xyz="0 0 1"/> <limit lower="-3.1415" upper="3.1415"/> </joint> </robot> ``` 在这个URDF文件,我们定义了一个名为“my_robot”的机器人,它由两个链接(base_link和link1)和一个旋转关节(joint1)组成。其,base_link是机器人的基座,link1是机器人的一个部件,joint1是连接base_link和link1的旋转关节。 链接和关节的定义包括其名称、类型、位置、方向、形状、惯性等参数。例如,我们可以看到,在link1的定义,我们使用<cylinder>元素定义了其形状,使用<inertial>元素定义了其惯性参数。 在定义机器人模型后,我们还需要定义其运动学参数。这通常包括每个关节的角度、速度和加速度限制,以及机器人的DH参数等。我们可以使用ROS2的robot_state_publisher节点来计算机器人的运动学参数,并将其发布到ROS2的tf2系统,以便其他节点访问和使用。 总之,使用ROS2的URDF文件可以很方便地描述机器人模型和运动学参数,并与ROS2的其他节点集成,实现机器人的控制、感知、规划等功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独坐寒江边

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值