第六章-ROS机器人系统仿真

第六章-ROS机器人系统仿真

学习来源:

  • 官方文档:http://wiki.ros.org/
  • Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程
  • 《机器人学导论》

本文仅作学习笔记和回顾使用

学习目标

  • 了解机器人系统仿真的原理和应用场景

  • urdf语法、xacro语法优化

  • camera、laser的仿真实现

  • urdf、rviz、gazebo集成使用,完成机器人系统的全套仿真

正文

  • urdf+rviz
  • urdf语法
  • xacro优化
  • urdf+gazebo
  • 实操案例

机器人一般价格不菲,为了降低机器人学习、调试成本,在ROS中提供了系统的机器人仿真实现,通过仿真,可以实现大部分需求

惯性矩阵

  • 参考:《机器人学导论》

第六章-ROS机器人系统仿真_第1张图片

  • 推导
    第六章-ROS机器人系统仿真_第2张图片

第六章-ROS机器人系统仿真_第3张图片

机器人仿真

定义

通过计算机对实体机器人系统进行模拟的技术,在 ROS 中,仿真实现涉及的内容主要有三:对机器人建模(URDF)、创建仿真环境(Gazebo)以及感知环境(Rviz)等系统性实现

作用

  • 仿真优势

    • 低成本
    • 高效
    • 高安全性
  • 仿真缺陷

    • 仿真器所使用的物理引擎目前还不能够完全精确模拟真实世界的物理情况

    • 仿真器构建的是关节驱动器(电机&齿轮箱)、传感器与信号通信的绝对理想情况,目前不支持模拟实际硬件缺陷或者一些临界状态等情形

三个组件

URDF

URDF统一(标准化)机器人描述格式,可以以一种 XML 的方式描述机器人的部分结构,比如底盘、摄像头、激光雷达、机械臂以及不同关节的自由度…,该文件可以被 C++ 内置的解释器转换成可视化的机器人模型,是 ROS 中实现机器人仿真的重要组件

rviz

RViz 是ROS的三维可视化工具。它的主要目的是以三维方式显示ROS消息,可以将 数据进行可视化表达。例如:可以显示机器人模型,可以无需编程就能表达激光测距仪(LRF)传感器中的传感 器到障碍物的距离,RealSense、Kinect或Xtion等三维距离传感器的点云数据(PCD, Point Cloud Data),从相机获取的图像值等

gazebo

Gazebo是一款3D动态模拟器,用于显示机器人模型并创建仿真环境,能够在复杂的室内和室外环境中准确有效地模拟机器人。与游戏引擎提供高保真度的视觉模拟类似,Gazebo提供高保真度的物理模拟,其提供一整套传感器模型,以及对用户和程序非常友好的交互方式。

urdf+rviz

1.创建功能包,导入依赖

新建几个目录:

  • urdf: 存储 urdf 文件的目录

  • meshes:机器人模型渲染文件(暂不使用)

  • config: 配置文件

  • launch: 存储 launch 启动文件

2.编写 URDF 文件

3.在 launch 文件中集成 URDF 与 Rviz

  • 将urdf文件导入参数服务器中
  • 启动rviz
<launch>

    
    <param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" />

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

launch>

4.在 Rviz 中显示机器人模型

  • fixed farme 换成底盘坐标系
  • add robotmodel

5.优化 rviz 启动

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

urdf语法

  • robot 根标签,类似于 launch文件中的launch标签
  • link 连杆标签
  • joint 关节标签
  • gazebo 集成gazebo需要使用的标签

实例说明:

<robot name="robot">
    <link name="base_link">
          <visual>
            <geometry>
              <cylinder radius="${base_link_radius}" length="${base_link_length}" />
            geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="yellow">
              <color rgba="0.5 0.3 0.0 0.5" />
            material>
          visual>
          <collision>
            <geometry>
              <cylinder radius="${base_link_radius}" length="${base_link_length}" />
            geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
          collision>
          <xacro:cylinder_inertial_matrix m="${base_link_m}" r="${base_link_radius}" h="${base_link_length}" />

        link>


        <joint name="base_link2base_footprint" type="fixed">
          <parent link="base_footprint" />
          <child link="base_link" />
          <origin xyz="0 0 ${earth_space + base_link_length / 2 }" />
        joint>
        <gazebo reference="base_link">
            <material>Gazebo/Yellowmaterial>
        gazebo>
robot>

xacro优化

定义

Xacro 是 XML Macros 的缩写,Xacro 是一种 XML 宏语言,是可编程的 XML。

原理

Xacro 可以声明变量,可以通过数学运算求解,使用流程控制控制执行顺序,还可以通过类似函数的实现,封装固定的逻辑,将逻辑中需要的可变的数据以参数的方式暴露出去,从而提高代码复用率以及程序的安全性。

作用

较之于纯粹的 URDF 实现,可以编写更安全、精简、易读性更强的机器人模型文件,且可以提高编写效率。

语法

xacro 提供了可编程接口,在使用 xacro 生成 urdf 时,根标签robot中必须包含命名空间声明:xmlns:xacro="http://wiki.ros.org/xacro"

  • 属性与算数运算

定义

<xacro:property name="xxxx" value="yyyy" />

属性调用

${属性名称}

算数运算

${数学表达式}

类似于函数实现,提高代码复用率,优化代码结构,提高安全性

宏定义

<xacro:macro name="宏名称" params="参数列表(多参数之间使用空格分隔)">

    .....

    参数调用格式: ${参数名}

xacro:macro>

宏调用

<xacro:宏名称 参数1=xxx 参数2=xxx/>
  • 文件包含

机器人由多部件组成,不同部件可能封装为单独的 xacro 文件,最后再将不同的文件集成,组合为完整机器人,可以使用文件包含实现

文件包含

<robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro">
      <xacro:include filename="my_base.xacro" />
      <xacro:include filename="my_camera.xacro" />
      <xacro:include filename="my_laser.xacro" />
      ....
robot>

实例

小车雷达的配置

<robot name="my_laser" xmlns:xacro="http://wiki.ros.org/xacro">

    
    <xacro:property name="support_length" value="0.15" /> 
    <xacro:property name="support_radius" value="0.01" /> 
    <xacro:property name="support_x" value="0.0" /> 
    <xacro:property name="support_y" value="0.0" /> 
    <xacro:property name="support_z" value="${base_link_length / 2 + support_length / 2}" /> 

    <link name="support">
        <visual>
            <geometry>
                <cylinder radius="${support_radius}" length="${support_length}" />
            geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="red">
                <color rgba="0.8 0.2 0.0 0.8" />
            material>
        visual>
    link>

    <joint name="support2base_link" type="fixed">
        <parent link="base_link" />
        <child link="support" />
        <origin xyz="${support_x} ${support_y} ${support_z}" />
    joint>


    
    <xacro:property name="laser_length" value="0.05" /> 
    <xacro:property name="laser_radius" value="0.03" /> 
    <xacro:property name="laser_x" value="0.0" /> 
    <xacro:property name="laser_y" value="0.0" /> 
    <xacro:property name="laser_z" value="${support_length / 2 + laser_length / 2}" /> 

    
    <link name="laser">
        <visual>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}" />
            geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="black" />
        visual>
    link>

    <joint name="laser2support" type="fixed">
        <parent link="support" />
        <child link="laser" />
        <origin xyz="${laser_x} ${laser_y} ${laser_z}" />
    joint>
robot>

urdf+gazebo

launch集合

<launch>

    
    <param name="robot_description" textfile="$(find demo02_urdf_gazebo)/urdf/urdf01_helloworld.urdf" />

    
    <include file="$(find gazebo_ros)/launch/empty_world.launch" />

    
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
launch>

相关设置

  • collision

碰撞系数

  • inertial

惯性矩阵

机器人的每个刚体部分都需要设置惯性矩阵,且惯性矩阵必须经计算得出,如果随意定义刚体部分的惯性矩阵,那么可能会导致机器人在 Gazebo 中出现抖动,移动等现象

  • 颜色设置

在 gazebo 中显示 link 的颜色,必须要使用指定的标签:

<gazebo reference="link节点名称">
     <material>Gazebo/Bluematerial>
gazebo>

实操案例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t49ymJRd-1644560402645)(C:\Users\86136\Desktop\2022_学习\2markdown\demo4-ros学习\图片素材\3.jpg)]

总结

unch>


#### 相关设置

* collision

碰撞系数

* inertial

惯性矩阵

机器人的每个刚体部分都需要设置惯性矩阵,且惯性矩阵必须经计算得出,如果随意定义刚体部分的惯性矩阵,那么可能会导致机器人在 Gazebo 中出现抖动,移动等现象

* 颜色设置

在 gazebo 中显示 link 的颜色,必须要使用指定的标签:

```xml

     Gazebo/Blue

实操案例

第六章-ROS机器人系统仿真_第4张图片

总结

  • 机器人仿真入门√
  • 下一步 路径规划进阶 冲冲冲!!!!

第六章-ROS机器人系统仿真_第5张图片

你可能感兴趣的:(ROS学习,自动驾驶,人工智能,机器学习)