ROS:机器人描述(URDF、XACRO)

ROS:机器人描述(URDFXACRO

Urdf语法详解

Urdf教程:https://wiki.ros.org/urdf/Tutorials/Create%20your%20own%20urdf%20file

 

1.创建一个树型结构

Urdf中采用linkjoint构成树状的结构来描述机器人。

 

首先需要定义一个base_link,在坐标系的原点。

2.添加位置

Urdf中通过orgin标签来定义link所在的位置。

<?xml version="<?xml version="1.0"?>
<robot name="test_robot">
  <link name="base_link" />
  <link name="link2" />
  <link name="link3" />
  <link name="link4" />

 <joint name="joint1" type="continuous">
    <parent link="base_link"/>
    <child link="link2"/>
    <origin xyz="0.3 0 0" rpy="1 0 0" />
  </joint>

 <joint name="joint2" type="continuous">
    <parent link="base_link"/>
    <child link="link3"/>
    <origin xyz="0 0.3 0" rpy="0 1 0" />
  </joint>

 <joint name="joint3" type="continuous">
    <parent link="base_link"/>
    <child link="link4"/>
    <origin xyz="0 0 0.3" rpy="0 0 1" />
  </joint>
</robot>


origin:xyzparent link为原点,child link的三维坐标系位置。

origin:rpy child linkz轴旋转的滚动角(roll),绕y轴方向旋转的俯仰(pitch)角,和绕x轴旋转的偏转(yaw).

图中以base_link为基准,红色为x轴,绿色为y轴,蓝色为z轴。

 

 

3.添加link外观

Deometry定义link形状

Material 定义link材料

Origin 定义link相对于自己原来的位置的变化

 

<link name="base_link">
    <visual>
        <geometry>
          <box size="0.25 .16 .05"/>
        </geometry>
        <origin rpy="0 0 0" xyz="0 0 0"/>
        <material name="blue">
          <color rgba="0 0 .8 1"/>
        </material>
     </visual>
  </link>

 

4.添加限制

Collision标签(碰撞)

Collision的内容与visiual中内容一样。

Axis joint定义旋转轴,例如(0 0 1)为以z轴旋转,(1 1 1)为以向量1 1 1为轴旋转,不指定以x轴旋转。

Limit 标签,限制joint的旋转范围。

<limit lower="-3.14" upper="3.14" effort="150.0" velocity="3.15"/>, 从标签中可以看到上下限以及速度力矩等都是可以指定的.

 

建立一个smartcar模型

1.新建一个smartcar

catkin_create_pkg smartcar  std_msgs rospy roscpp urdf

2.包文件夹下新建urdf文件夹,且在urdf文件夹下新建smartcar.urdf文件

依据上面的语法创建的内容为

<?xml version="1.0"?>
<robot name="test_robot">
  <link name="base_link">
    <visual>
        <geometry>
          <box size="0.25 .16 .05"/>
        </geometry>
        <origin rpy="0 0 0" xyz="0 0 0"/>
        <material name="blue">
          <color rgba="0 0 .8 1"/>
        </material>
     </visual>
  </link>

   <link name="wheel_1">
    <visual>
      <geometry>
        <cylinder length=".02" radius="0.025"/>
      </geometry>
      <material name="red">
        <color rgba="1 0 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="joint1" type="continuous">
    <axis xyz="0 0 1"/>
    <parent link="base_link"/>
    <child link="wheel_1"/>
    <origin rpy="1.5707 0 0" xyz="0.08 0.1 -0.03"/>
    <limit effort="100" velocity="100"/>
    <joint_properties damping="0.0" friction="0.0"/>
  </joint>

  <link name="wheel_2">
    <visual>
      <geometry>
        <cylinder length=".02" radius="0.025"/>
      </geometry>
      <material name="black">
        <color rgba="0 0 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="joint2" type="continuous">
    <axis xyz="0 0 1"/>
    <parent link="base_link"/>
    <child link="wheel_2"/>
    <origin rpy="1.57075 0  0" xyz="0.08 -0.1 -0.03"/>
    <limit effort="100" velocity="100"/>
    <joint_properties damping="0.0" friction="0.0"/>
  </joint>

<link name="wheel_3">
    <visual>
      <geometry>
        <cylinder length=".02" radius="0.025"/>
      </geometry>
      <material name="red">
        <color rgba="1 0 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="joint_3" type="continuous">
    <axis xyz="0 0 1"/>
    <parent link="base_link"/>
    <child link="wheel_3"/>
    <origin rpy="1.57075 0 0" xyz="-0.08 0.1 -0.03"/>
    <limit effort="100" velocity="100"/>
    <joint_properties damping="0.0" friction="0.0"/>
  </joint>

  <link name="wheel_4">
    <visual>
      <geometry>
        <cylinder length=".02" radius="0.025"/>
      </geometry>
      <material name="black">
        <color rgba="0 0 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="joint_4" type="continuous">
    <axis xyz="0 0 1"/>
    <parent link="base_link"/> 
    <child link="wheel_4"/>
    <origin rpy="1.57075 0 0" xyz="-0.08 -0.1 -0.03"/>
    <limit effort="100" velocity="100"/>
    <joint_properties damping="0.0" friction="0.0"/>
  </joint>
</robot>


 

检查urdf文件语法:

check_urdf smartcar.urdf

可视化模型:

roslaunch urdf_tutorial display.launch model:=path/to/your/xxx.urdf gui:=true

 

3.新建launch文件夹,且在launch文件夹下新建smartcar_rviz.launch文件

仿照上面的display.launch文件,编辑smartcar_rviz.launch文件

smartcar_rviz.launch

<launch>
    <arg name="model" />
    <arg name="gui" default="False" />
    <arg name="rvizconfig" default="$(find urdf_tutorial)/rviz/urdf.rviz" />
    <param name="robot_description" command="$(find xacro)/xacro.py $(find smartcar_description)/urdf/smartcar.urdf" />
    <param name="use_gui" value="$(arg gui)"/>
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>


出来的效果与上一步中可视化的效果相同。

以下是一个简单的ROS导航机器人模型URDF代码,可以作为参考: ```xml <?xml version="1.0"?> <robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <!-- Define links --> <link name="base_link"/> <link name="laser_link"/> <link name="wheel_l_link"/> <link name="wheel_r_link"/> <!-- Define joints --> <joint name="base_laser_joint" type="fixed"> <parent link="base_link"/> <child link="laser_link"/> </joint> <joint name="base_wheel_l_joint" type="continuous"> <parent link="base_link"/> <child link="wheel_l_link"/> <origin xyz="0 0 0.1" rpy="0 0 0"/> <axis xyz="0 1 0"/> </joint> <joint name="base_wheel_r_joint" type="continuous"> <parent link="base_link"/> <child link="wheel_r_link"/> <origin xyz="0 0 -0.1" rpy="0 0 0"/> <axis xyz="0 1 0"/> </joint> <!-- Define sensors --> <sensor name="laser" type="ray" always_on="true" update_rate="10"> <pose xyz="0 0 0.1" rpy="0 0 0"/> <visualize>true</visualize> <plugin name="gazebo_ros_laser" filename="libgazebo_ros_laser.so"> <topicName>/scan</topicName> <frameName>laser_link</frameName> </plugin> </sensor> <!-- Define robot description --> <xacro:macro name="robot_description"> <robot> <link name="base_link"/> <link name="laser_link"/> <link name="wheel_l_link"/> <link name="wheel_r_link"/> <joint name="base_laser_joint" type="fixed"> <parent link="base_link"/> <child link="laser_link"/> </joint> <joint name="base_wheel_l_joint" type="continuous"> <parent link="base_link"/> <child link="wheel_l_link"/> <origin xyz="0 0 0.1" rpy="0 0 0"/> <axis xyz="0 1 0"/> </joint> <joint name="base_wheel_r_joint" type="continuous"> <parent link="base_link"/> <child link="wheel_r_link"/> <origin xyz="0 0 -0.1" rpy="0 0 0"/> <axis xyz="0 1 0"/> </joint> <sensor name="laser" type="ray" always_on="true" update_rate="10"> <pose xyz="0 0 0.1" rpy="0 0 0"/> <visualize>true</visualize> <plugin name="gazebo_ros_laser" filename="libgazebo_ros_laser.so"> <topicName>/scan</topicName> <frameName>laser_link</frameName> </plugin> </sensor> </robot> </xacro:macro> </robot> ``` 这个机器人模型定义了一个基于两个轮子和一个激光雷达的机器人。`base_link`是机器人的主体,`laser_link`是激光雷达的支架,`wheel_l_link`和`wheel_r_link`是左右两个轮子的支架。 在`base_link`和`laser_link`之间定义了一个固定类型的连接`base_laser_joint`,在`base_link`和两个轮子之间分别定义了一个连续类型的连接`base_wheel_l_joint`和`base_wheel_r_joint`。 激光雷达定义在`laser`标签,插件`gazebo_ros_laser`用于将激光雷达模拟数据发布到`/scan`话题。 你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

CHAO_^

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

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

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

打赏作者

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

抵扣说明:

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

余额充值