第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)

文章目录

  • 0 简单介绍
  • 1 URDF 语法详解_robot
    • 1.1 属性
    • 1.2 子标签
  • 2 URDF 语法详解_link
    • 2.1 属性
    • 2.2 子标签
    • 2.3 案例
      • 2.3.1 URDF文件 —— demo02_link.urdf
      • 2.3.2 launch文件 —— demo02_link.launch
      • 2.3.3 编译运行
  • 3 URDF语法详解_joint
    • 3.1 属性
    • 3.2 子标签
    • 3.3 案例
      • 3.3.1 URDF文件 —— demo03_joint.urdf
      • 3.3.2 launch文件 —— demo03_joint.launch
      • 3.3.3 图形显示问题解决(launch文件添加两个包)
      • 3.3.4 编译运行
      • 3.3.5 优化 URDF
        • 3.3.5.1 URDF文件 —— demo04_base_footprint.urdf(重要)
        • 3.3.5.2 launch文件 —— demo04_base_footprint.launch
        • 3.3.5.2 编译运行
      • 3.3.6 常见问题
  • 4 URDF 练习
    • 4.0 需求 - 实现流程
    • 4.1 launch文件 —— demo05_test.launch
    • 4.2 URDF 文件 —— demo05_test.urdf
      • 4.2.1 添加极小球体 base_footprint
      • 4.2.2 添加底盘 base_link 和 关节 link2footprint
      • 4.2.3 添加驱动轮 left/right_wheel 和 关节 left/right_joint
      • 4.2.4 添加万动轮 front/back_wheel 和 关节
      • 4.2.5 URDF 总程序 —— demo05_test.urdf
  • 5 URDF工具
    • 5.1 check_urdf 语法检查
    • 5.2 urdf_to_graphiz 结构查看

0 简单介绍

URDF 文件是一个标准的 XML 文件,在 ROS 中预定义了一系列的标签用于描述机器人模型,机器人模型可能较为复杂,但是 ROS 的 URDF 中机器人的组成却是较为简单,可以主要简化为两部分:连杆 (link标签) 与 关节 (joint标签),接下来我们就通过案例了解一下 URDF 中的不同标签:

  • robot 根标签,类似于 launch文件中的launch标签
  • link 连杆标签
  • joint 关节标签
  • gazebo 集成gazebo需要使用的标签
    关于gazebo标签,后期在使用 gazebo 仿真时,才需要使用到,用于配置仿真环境所需参数,比如: 机器人材料属性、gazebo插件等,但是该标签不是机器人模型必须的,只有在仿真时才需设置。

1 URDF 语法详解_robot

robot

  • urdf 中为了保证 xml 语法的完整性,使用了 robot 标签作为根标签,所有的 link 和 joint 以及其他标签都必须包含在 robot 标签内,在该标签内可以通过 name 属性设置机器人模型的名称

1.1 属性

name: 指定机器人模型的名称

1.2 子标签

其他标签都是子级标签

2 URDF 语法详解_link

  • 定义:urdf 中的 link 标签用于描述机器人某个部件(也即刚体部分)的外观和物理属性,比如:机器人底座、轮子、激光雷达、摄像头…每一个部件都对应一个 link, 在 link 标签内,可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性。

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第1张图片

  • Inertial:惯性矩阵,机器人起步和刹车时发生后仰或者前移(由于惯性导致),甚至翻车。设置重心、质量,不同维度的惯性参数。
  • Collision:碰撞参数,表示将物体包裹在一定的区域内(红色),如果障碍物进入某个区域,就说明发生碰撞。
  • Visual:可视化

2.1 属性

  • name —> 为连杆命名

2.2 子标签

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第2张图片

2.3 案例

  • 需求:分别生成长方体、圆柱与球体的机器人部件

2.3.1 URDF文件 —— demo02_link.urdf

  • 将 sim_demo 里面的两个文件 导入到 urdf01_rviz 里面的 config 文件夹中

<robot name = "mycar">
    <link name = "base_link">
        
        <visual>
            
            <geometry>
                
                
                
                
                
                
                
                <mesh filename = "package://urdf01_rviz/meshes/autolabor_mini.stl"/>
            geometry>

            
            
            <origin xyz = "0 0 0" rpy = "1.57 0 1.57" />

            
            
            <material name = "car_color">
                <color rgba = "0 1 0 1" />
            material>
        visual>
    link>
robot>

2.3.2 launch文件 —— demo02_link.launch

<launch>
    
    <param name = "robot_description" textfile = "$(find urdf01_rviz)/urdf/urdf/demo02_link.urdf" />
    
    <node pkg = "rviz" type = "rviz" name = "rviz" args = "-d $(find urdf01_rviz)/config/show_mycar.rviz"/>
launch>

2.3.3 编译运行

cd demo03_ws/
source ./devel/setup.bash
roslaunch urdf01_rviz demo02_link.launch
  • rpy = “0 0 0”

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第3张图片

  • rpy = “1.57 0 1.57” 弧度制
    第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第4张图片

3 URDF语法详解_joint

  • 定义:urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性,还可以指定关节运动的安全极限,机器人的两个部件(分别称之为 parent linkchild link)以"关节"的形式相连接,不同的关节有不同的运动形式:旋转、滑动、固定、旋转速度、旋转角度限制…,比如:安装在底座上的轮子可以360度旋转,而摄像头则可能是完全固定在底座上。

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第5张图片

  • axis 可以指定旋转方向

3.1 属性

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第6张图片

3.2 子标签

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第7张图片

  • origin 就是 上图的紫色部分,joint 关于 parent_link 的位置关系

3.3 案例

  • 需求:创建机器人模型,底盘为长方体,在长方体的前面添加一摄像头,摄像头可以沿着 Z 轴 360 度旋转。

3.3.1 URDF文件 —— demo03_joint.urdf

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第8张图片

  • 底盘(下面的矩形):x 长 0.3,y 宽 0.2,z 高 0.1
  • 关节偏移量(相对于原点位置):x方向 0.12 ,y方向 0,z方向 0.05
  • 摄像头:x 0,y 0,z 0.025, z方向上移摄像头一半的高度,否则会半沉
  • urdf文件里使用中文注释可能会报错,使用 melodic版本的话,需要去掉 urdf 文件里面的中文注释。

<robot name = "mycar">
    
    <link name = "base_link">
        <visual>
            <geometry>
                <box size = "0.3 0.2 0.1" />
            geometry>
            <origin xyz = "0 0 0" rpy = "0 0 0" />
            <material name = "car_color">
                <color rgba = "0.8 0.5 0 0.5" />
            material>
        visual>
    link>
    
     <link name = "camera">
        <visual>
            <geometry>
                <box size = "0.02 0.05 0.05" />
            geometry>
            
            <origin xyz = "0 0 0.025" rpy = "0 0 0" />
            <material name = "camera_color">
                <color rgba = "0 0 1 0.5" />
            material>
        visual>
    link>
    
    <joint name = "camera2base" type = "continuous">
        
        <parent link = "base_link" />
        
        <child link = "camera" />
        
        <origin xyz = "0.12 0 0.05" rpy = "0 0 0" />
        
        <axis xyz = "0 0 1" />
    joint>
robot>

3.3.2 launch文件 —— demo03_joint.launch

<launch>
    
    <param name = "robot_description" textfile = "$(find urdf01_rviz)/urdf/urdf/demo03_joint.urdf" />
    
    <node pkg = "rviz" type = "rviz" name = "rviz" args = "-d $(find urdf01_rviz)/config/show_mycar.rviz"/>
    
    
    <node pkg = "joint_state_publisher" type = "joint_state_publisher" name = "joint_state_publisher" />
    
    <node pkg = "robot_state_publisher" type = "robot_state_publisher" name = "robot_state_publisher" />
    
    <node pkg = "joint_state_publisher_gui" type = "joint_state_publisher_gui" name = "joint_state_publisher_gui"/>
launch>
  • 下载关节控制结点的包
sudo apt-get install ros-melodic-joint-state-publisher-gui
  • 如果界面出现抖动,可以注释 joint_state_publisher
  • 蓝色进度条可以控制摄像头旋转
    第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第9张图片

3.3.3 图形显示问题解决(launch文件添加两个包)

不加 关节状态节点 和 机器人状态节点 出现的问题

  • 表现:设置头显示位置与颜色异常
  • 提示:No transform from [camera] to [base_link] 缺少 camera 到 base_link 的坐标变换
  • 原因:rviz 显示 URDF 时,必须发布不同部件之间的 坐标系 关系
  • 解决:ROS中提供了关于机器人模型显示的坐标发布相关节点(两个)
  • rosrun joint_state_publisher joint_state_publisher
  • rosrun robot_state_publisher robot_state_publisher

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第10张图片

3.3.4 编译运行

cd demo03_ws/
source ./devel/setup.bash
roslaunch urdf01_rviz demo03_joint.launch

3.3.5 优化 URDF

  • 问题:机器人黄色方块是下沉在地下。
  • 前面实现的机器人模型是半沉到地下的,因为默认情况下: 底盘的中心点位于地图原点上,所以会导致这种情况产生,可以使用的优化策略,将初始 link 设置为一个尺寸极小的 link(比如半径为 0.001m 的球体,或边长为 0.001m 的立方体),然后再在初始 link 上添加底盘等刚体,这样实现,虽然仍然存在初始link半沉的现象,但是基本可以忽略了。这个初始 link 一般称之为 base_footprint。

3.3.5.1 URDF文件 —— demo04_base_footprint.urdf(重要)

  • 需要删除中文解释,才不会报错

<robot name = "mycar">
    
    <link name = "base_footprint">
        <visual>
            <geometry>
                <box size = "0.001 0.001 0.001" />
            geometry>
        visual>
    link>

    
    <link name = "base_link">
        <visual>
            <geometry>
                <box size = "0.3 0.2 0.1" />
            geometry>
            <origin xyz = "0 0 0" rpy = "0 0 0" />
            <material name = "car_color">
                <color rgba = "0.8 0.5 0 0.5" />
            material>
        visual>
    link>

    
     <link name = "camera">
        <visual>
            <geometry>
                <box size = "0.02 0.05 0.05" />
            geometry>
            
            <origin xyz = "0 0 0.025" rpy = "0 0 0" />
            <material name = "camera_color">
                <color rgba = "0 0 1 0.5" />
            material>
        visual>
    link>

    
    <joint name = "link2footprint" type = "fixed">
        
        <parent link = "base_footprint" />
        
        <child link = "base_link" />
        
        <origin xyz = "0 0 0.05" rpy = "0 0 0" />
    joint>

    
    <joint name = "camera2base" type = "continuous">
        
        <parent link = "base_link" />
        
        <child link = "camera" />
        
        <origin xyz = "0.12 0 0.05" rpy = "0 0 0" />
        
        <axis xyz = "0 0 1" />
    joint>
robot>

3.3.5.2 launch文件 —— demo04_base_footprint.launch

<launch>
    
    <param name = "robot_description" textfile = "$(find urdf01_rviz)/urdf/urdf/demo04_base_footprint.urdf" />
    
    <node pkg = "rviz" type = "rviz" name = "rviz" args = "-d $(find urdf01_rviz)/config/show_mycar.rviz"/>
    
    
    <node pkg = "joint_state_publisher" type = "joint_state_publisher" name = "joint_state_publisher" />
    
    <node pkg = "robot_state_publisher" type = "robot_state_publisher" name = "robot_state_publisher" />
launch>

3.3.5.2 编译运行

cd demo03_ws/
source ./devel/setup.bash
roslaunch urdf01_rviz demo04_base_footprint.launch
  • rviz 中 初始的参考系 Fixed Frame 修改为 base_footprint

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第11张图片

3.3.6 常见问题

问题1:命令行输出如下错误提示

UnicodeEncodeError: 'ascii' codec can't encode characters in position 463-464: ordinal not in range(128)
[joint_state_publisher-3] process has died [pid 4443, exit code 1, cmd /opt/ros/melodic/lib/joint_state_publisher/joint_state_publisher __name:=joint_state_publisher __log:=/home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3.log].
log file: /home/rosmelodic/.ros/log/b38967c0-0acb-11eb-aee3-0800278ee10c/joint_state_publisher-3*.log
  • rviz中提示坐标变换异常,导致机器人部件显示结构异常
  • 原因:编码问题导致的
  • 解决:去除URDF中的中文注释
    问题2:[ERROR] [1584370263.037038]: Could not find the GUI, install the
    ‘joint_state_publisher_gui’ package
  • 解决:sudo apt install ros-noetic-joint-state-publisher-gui

4 URDF 练习

  • link偏移量是物体中心和大地坐标系原点的偏移
  • joint偏移量是两个link坐标系之间的偏移量

4.0 需求 - 实现流程

  • 设计要求:创建一个四轮圆柱状机器人模型,机器人参数如下,底盘为圆柱状,半径 10cm,高 8cm,四轮由两个驱动轮和两个万向支撑轮组成,两个驱动轮半径为 3.25cm,轮胎宽度1.5cm,两个万向轮为球状,半径 0.75cm,底盘离地间距为 1.5cm(与万向轮直径一致)

4.1 launch文件 —— demo05_test.launch

<launch>
    
    <param name = "robot_description" textfile = "$(find urdf01_rviz)/urdf/urdf/demo05_test.urdf" />

    
    <node pkg = "rviz" type = "rviz" name = "rviz" args = "-d $(find urdf01_rviz)/config/show_mycar.rviz"/>

    
    <node pkg = "joint_state_publisher" type = "joint_state_publisher" name = "joint_state_publisher" />

    
    <node pkg = "robot_state_publisher" type = "robot_state_publisher" name = "robot_state_publisher" />

    
    <node pkg = "joint_state_publisher_gui" type = "joint_state_publisher_gui" name = "joint_state_publisher_gui" />
launch>

4.2 URDF 文件 —— demo05_test.urdf

4.2.1 添加极小球体 base_footprint

 
    <link name = "base_footprint">
        <visual>
            <geometry>
                <sphere radius = "0.001" />
            geometry>
            <material name = "car_color">
                <color rgba = "1 0 0 0.5" /> 红色
            material>
        visual>
    link>

4.2.2 添加底盘 base_link 和 关节 link2footprint

  • 底盘为圆柱状,半径 10cm,高 8cm
  • 底盘离地间距为 1.5cm,这个主要由关节偏移量实现,关节连接 base_footprint和底盘的集合中心。关节z上的设置 = 车体高度/2 + 离地高度 = 0.04 + 0.015 = 0.055

    
    
    <link name = "base_link">
        <visual>
            <geometry>
                <cylinder radius = "0.1" length = "0.08" />
            geometry>
            <origin xyz = "0 0 0" rpy = "0 0 0"/>
            <material name = "baselink_color">
                <color rgba = "1 0.5 0.2 0.5" />
            material>
        visual>
    link>
    
    <joint name = "link2footprint" type = "fixed"> 
        <parent link = "base_footprint" />
        <child link = "base_link" />
        
        <origin xyz = "0 0 0.055" rpy = "0 0 0" />
    joint>

4.2.3 添加驱动轮 left/right_wheel 和 关节 left/right_joint

  • 两个驱动轮半径为 3.25cm,轮胎宽度1.5cm
  • 正常情况下圆柱面朝上,这里驱动轮在左右,需要修改欧拉角,沿x轴翻滚90度,约为1.57弧度。
  • 关节 z 偏移值: 0.04 + 0.015 - 0.0325 = 0.055 - 0.0325 = 0.0225,在下面为负数
  • 计算公式:z = 车体高度 / 2 + 离地间距 - 车轮半径
  • 关节xyz取值的参考坐标是底盘 base_link,所以 z 偏移值为负, -0.0225
  • 关节 y 偏移值:0.1 车体半径
    第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第12张图片
  • 驱动轮在调试中抖动,是因为开了两个joint_state_publisher,一个是静态,一个是动态,造成tf冲突。

    
    
    <link name = "left_wheel">
        <visual>
            <geometry>
                <cylinder radius = "0.0325" length = "0.015" />
            geometry>
            
            <origin xyz = "0 0 0" rpy = "1.5708 0 0"/>
            <material name = "wheel_color">
                <color rgba = "0 0 0 0.3" />
            material>
        visual>
    link>
    <link name = "right_wheel">
        <visual>
            <geometry>
                <cylinder radius = "0.0325" length = "0.015" />
            geometry>
            
            <origin xyz = "0 0 0" rpy = "1.5708 0 0"/>
            <material name = "wheel_color">
                <color rgba = "0 0 0 0.3" />
            material>
        visual>
    link>
    
    <joint name = "lest2link" type = "continuous">
        <parent link = "base_link" />
        <child link = "left_wheel" />
        
        <origin xyz = "0 0.1 -0.0225" rpy = "0 0 0" />
        
        <axis xyz = "0 1 0" />
    joint>
    
    <joint name = "right2link" type = "continuous">
        <parent link = "base_link" />
        <child link = "right_wheel" />
        
        <origin xyz = "0 -0.1 -0.0225" rpy = "0 0 0" />
        
        <axis xyz = "0 1 0" />
    joint>

4.2.4 添加万动轮 front/back_wheel 和 关节

  • 两个万向轮为球状,半径 0.75cm,沿着 x 轴放置
  • 关节z偏移值:0.04 + 0.015 - 0.0075 = 0.0475
  • 关节x偏移值:0.08 小于底盘半径
    第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第13张图片
 
    
    
    <link name = "front_wheel">
        <visual>
            <geometry>
                <sphere radius = "0.0075" />
            geometry>
            <origin xyz = "0 0 0" rpy = "0 0 0"/>
            <material name = "wheel_color">
                <color rbga = "0 0 0 0.3" />
            material>
        visual>
    link>
    <link name = "back_wheel">
        <visual>
            <geometry>
                <sphere radius = "0.0075" />
            geometry>
            <origin xyz = "0 0 0" rpy = "0 0 0"/>
            <material name = "wheel_color">
                <color rbga = "0 0 0 0.3" />
            material>
        visual>
    link>
    
    <joint name = "front2link" type = "continuous">
        <parent link = "base_link" />
        <child link = "front_wheel" />
        
        <origin xyz = "0.08 0 -0.0475" rpy = "0 0 0" />
        
        <axis xyz = "0 1 0" />
    joint>
       <joint name = "back2link" type = "continuous">
        <parent link = "base_link" />
        <child link = "back_wheel" />
        
        <origin xyz = "-0.08 0 -0.0475" rpy = "0 0 0" />
        
        <axis xyz = "0 1 0" />
    joint>

4.2.5 URDF 总程序 —— demo05_test.urdf

<robot name = "mycar">
    
    <link name = "base_footprint">
        <visual>
            <geometry>
                <sphere radius = "0.001" />
            geometry>
            <material name = "car_color">
                <color rgba = "1 0 0 0.5" />
            material>
        visual>
    link>

    
    
    
    <link name = "base_link">
        <visual>
            <geometry>
                <cylinder radius = "0.1" length = "0.08" />
            geometry>
            <origin xyz = "0 0 0" rpy = "0 0 0"/>
            <material name = "baselink_color">
                <color rgba = "1 0.5 0.2 0.5" />
            material>
        visual>
    link>
    
    <joint name = "link2footprint" type = "fixed">
        <parent link = "base_footprint" />
        <child link = "base_link" />
        
        <origin xyz = "0 0 0.055" rpy = "0 0 0" />
    joint>

    
    
    
    <link name = "left_wheel">
        <visual>
            <geometry>
                <cylinder radius = "0.0325" length = "0.015" />
            geometry>
            
            <origin xyz = "0 0 0" rpy = "1.5708 0 0"/>
            <material name = "wheel_color">
                <color rgba = "0 0 0 0.3" />
            material>
        visual>
    link>
    <link name = "right_wheel">
        <visual>
            <geometry>
                <cylinder radius = "0.0325" length = "0.015" />
            geometry>
            
            <origin xyz = "0 0 0" rpy = "1.5708 0 0"/>
            <material name = "wheel_color">
                <color rgba = "0 0 0 0.3" />
            material>
        visual>
    link>
    
    <joint name = "lest2link" type = "continuous">
        <parent link = "base_link" />
        <child link = "left_wheel" />
        
        <origin xyz = "0 0.1 -0.0225" rpy = "0 0 0" />
        
        <axis xyz = "0 1 0" />
    joint>
    
    <joint name = "right2link" type = "continuous">
        <parent link = "base_link" />
        <child link = "right_wheel" />
        
        <origin xyz = "0 -0.1 -0.0225" rpy = "0 0 0" />
        
        <axis xyz = "0 1 0" />
    joint>

    
    
    
    <link name = "front_wheel">
        <visual>
            <geometry>
                <sphere radius = "0.0075" />
            geometry>
            <origin xyz = "0 0 0" rpy = "0 0 0"/>
            <material name = "wheel_color">
                <color rbga = "0 0 0 0.3" />
            material>
        visual>
    link>
    <link name = "back_wheel">
        <visual>
            <geometry>
                <sphere radius = "0.0075" />
            geometry>
            <origin xyz = "0 0 0" rpy = "0 0 0"/>
            <material name = "wheel_color">
                <color rbga = "0 0 0 0.3" />
            material>
        visual>
    link>
    
    <joint name = "front2link" type = "continuous">
        <parent link = "base_link" />
        <child link = "front_wheel" />
        
        <origin xyz = "0.08 0 -0.0475" rpy = "0 0 0" />
        
        <axis xyz = "0 1 0" />
    joint>
       <joint name = "back2link" type = "continuous">
        <parent link = "base_link" />
        <child link = "back_wheel" />
        
        <origin xyz = "-0.08 0 -0.0475" rpy = "0 0 0" />
        
        <axis xyz = "0 1 0" />
    joint>
robot>

5 URDF工具

在 ROS 中,提供了一些工具来方便 URDF 文件的编写,比如:

  • check_urdf命令可以检查复杂的 urdf 文件是否存在语法问题
  • urdf_to_graphiz命令可以查看 urdf 模型结构,显示不同 link 的层级关系
    当然,要使用工具之前,首先需要安装,安装命令:sudo apt install liburdfdom-tools

5.1 check_urdf 语法检查

进入urdf 文件所属目录,调用:check_urdf urdf 文件,如果不抛出异常,说明文件合法,否则非法。

  • 右击 urdf 文件,在终端中打开
    第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第14张图片
check_urdf demo05_test.urdf 显示层级关系

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第15张图片

5.2 urdf_to_graphiz 结构查看

  • 进入urdf 文件所属目录,调用:urdf_to_graphiz urdf文件,当前目录下会生成 pdf 文件
urdf_to_graphiz demo05_test.urdf 

在这里插入图片描述

evince mycar.pdf

在这里插入图片描述

第 6 章 机器人仿真系统 2 —— URDF 语法详解 urdf01_rviz(重要)_第16张图片

你可能感兴趣的:(ROS,理论与实践,机器人,自动驾驶,人工智能)