Serie ROS: Capítulo 6 Modelado de robots

Directorio de artículos

6. Simulación de sistema de robot

1. Información general

**Simulación de sistema de robot:** es una tecnología que simula un sistema de robot físico a través de una computadora.En ROS, hay tres contenidos principales involucrados en la implementación de la simulación: modelado del robot (URDF), creación de un entorno de simulación (Gazebo) y percibir el entorno (Rviz) y otras implementaciones sistémicas.

Ventajas de la simulación:

La simulación juega un papel fundamental en el desarrollo de sistemas robóticos. En comparación con los robots físicos en I+D y pruebas, la simulación tiene las siguientes ventajas significativas:

1. **Bajo costo: **El costo actual de los robots sigue siendo alto, a menudo cientos de miles, y la simulación puede reducir en gran medida los costos y los riesgos.

2. **Eficiente: **El entorno creado es más diverso y flexible, lo que puede mejorar la eficiencia y la cobertura de las pruebas

3. ** Alta seguridad: ** En el entorno de simulación, no hay necesidad de considerar el problema del desgaste

Defectos de simulación:

El rendimiento del robot en el entorno de simulación y el entorno real es bastante diferente. En otras palabras, la simulación no puede simular completamente el mundo físico real, y hay algunas situaciones de "distorsión". Las razones son:

1. El motor de física utilizado por el emulador aún no puede simular de forma completa y precisa las condiciones físicas del mundo real.

2. El emulador construye la situación ideal absoluta del controlador conjunto (motor y caja de cambios), sensor y comunicación de señal Actualmente, no admite la simulación de defectos de hardware reales o algunos estados críticos.

2. El proceso básico de URDF integrado Rviz

Descripción del requisito:

Mostrar un robot de caja en Rviz

Proceso de implementación:

  1. Preparación: crear un nuevo paquete de funciones e importar dependencias
  2. Núcleo: escribir archivo urdf
  3. Núcleo: Integrar URDF y Rviz en el archivo de lanzamiento
  4. Mostrar modelo de robot en Rviz

1. Crear un paquete de funciones e importar dependencias

Cree un nuevo paquete de características con un nombre personalizado e importe paquetes dependientes: urdfconxacro

En el paquete de funciones actual, cree algunos directorios más:

urdf: directorio donde se almacenan los archivos urdf

meshes: archivo de representación del modelo de robot (aún no se ha utilizado)

config: archivo de configuración

launch: Almacenar archivos de inicio de lanzamiento

2. Escribir archivo URDF

Cree una nueva subcarpeta: (opcional), agregue un archivo urdfen la carpeta , copie el siguiente contenido:.urdf

<robot name="mycar">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
        </visual>
    </link>
</robot>
Copy

3. Integre URDF y Rviz en el archivo de lanzamiento

En launchel directorio, cree un nuevo archivo de inicio. El archivo de inicio debe iniciar Rviz e importar el archivo urdf. Después de que se inicia Rviz, puede cargar automáticamente el archivo de análisis urdfy mostrar el modelo de robot. La pregunta central: cómo importar el archivo urdf En ROS, puede utilizar La ruta del archivo urdf se establece en el servidor de parámetros, el nombre del parámetro utilizado es: robot_description, el código de ejemplo es el siguiente:

<launch>

    <!-- 设置参数 -->
    <param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" />

    <!-- 启动 rviz -->
    <node pkg="rviz" type="rviz" name="rviz" />

</launch>
Copy

4. Mostrar el modelo de robot en Rviz

Después de iniciar rviz, encontrará que no hay un modelo de robot en caja. Esto se debe a que el componente de visualización del robot no se agrega de forma predeterminada y debe agregarse manualmente. El método de adición es el siguiente:[Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-2XO1iRYZ-1670239754316) (http://www.autolabor.com.cn/) book/ROSTutorials/assets/01_URDF %E6%96%87%E4%BB%B6%E6%89%A7%E8%A1%8Crviz%E9%85%8D%E7%BD%AE01.png)][Enlace externo transferencia de imagen fallida, sitio de origen Puede haber un mecanismo anti-leeching, se recomienda guardar la imagen y subirla directamente (img-8XRxLmmk-1670239754320) (http://www.autolabor.com.cn/book/ROSTutorials/ activos/02_URDF%E6%96%87%E4%BB %B6%E6%89%A7%E8%A1%8Crviz%E9%85%8D%E7%BD%AE02.png)]inserte la descripción de la imagen aquí

Después de la configuración, se puede mostrar normalmente

5. Optimizar el inicio de rviz

Cuando el archivo se inicia repetidamente launch, la información de configuración del componente anterior a Rviz no se guardará automáticamente, y es necesario repetir la operación del paso 4. Para mayor comodidad de uso, se pueden utilizar los siguientes métodos para optimizar:

Primero, guarde la configuración actual en configel directorio [Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-hkr2wM0H-1670239754330) (http://www.autolabor.com.cn/) libro/ROSTutorials/assets/10_rviz %E9%85%8D%E7%BD%AE%E4%BF%9D%E5%AD%98.png)]
Luego, launchagregue parámetros a la configuración de inicio de Rviz en el archivo: args, el valor se establece en-d 配置文件路径

<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>
Copy

Al reiniciar, se puede incluir la configuración de componentes anterior, lo que es más conveniente y rápido de usar.

3. Explicación detallada de la sintaxis de URDF

  • La etiqueta raíz del robot, similar a la etiqueta de lanzamiento en el archivo de lanzamiento
  • enlace Etiqueta de enlace
  • etiqueta conjunta conjunta
  • cenador Las etiquetas necesarias para integrar el cenador

3.1 Explicación detallada de la sintaxis URDF 01_robot


robot

En urdf, para garantizar la integridad de la sintaxis xml, la etiqueta se utiliza robotcomo etiqueta raíz. Todos los enlaces, articulaciones y otras etiquetas deben incluirse en la etiqueta del robot. En esta etiqueta, el nombre del modelo de robot puede ser establecer a través del atributo de nombre

1. Atributos

nombre: especifica el nombre del modelo de robot

2. Subpestañas

Todas las demás etiquetas son etiquetas secundarias

3.2 Explicación detallada de la sintaxis de URDF 02_link


enlace

La etiqueta de enlace en urdf se usa para describir la apariencia y las propiedades físicas de una determinada parte del robot (es decir, la parte rígida), como por ejemplo: base del robot, ruedas, lidar, cámara... Cada parte corresponde a un enlace En la etiqueta de enlace, puede diseñar una serie de atributos como forma, tamaño, color, matriz de inercia, parámetros de colisión, etc. de la pieza.[Error en la transferencia de imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-sKElfjJs-1670239754331) (http://www.autolabor.com.cn/) libro/ROSTutorials/activos/% E5%AE%98%E6%96%B901_link.png)]

1. Atributos

  • nombre —> Nombre de la biela

2. Subpestañas

  • visual -> describir la apariencia (los datos correspondientes son visuales)
    • la geometría establece la forma del enlace
      • Etiqueta 1: caja (forma de caja)
        • Atributo: tamaño=largo (x) ancho (y) alto (z)
      • Etiqueta 2: cilindro (cilindro)
        • Atributo: radio = longitud del radio = altura
      • Etiqueta 3: esfera (esfera)
        • Atributo: radio = radio
      • Etiqueta 4: malla (añadir piel a la biela)
        • Atributo: nombre de archivo = ruta del recurso (formato: paquete: archivo )
    • El origen establece el desplazamiento y la inclinación en radianes.
      • Atributo 1: xyz=x offset y barato z offset
      • Atributo 2: rpy=x roll y pitch z yaw (la unidad es el radián)
    • Propiedades del material del conjunto metálico (color)
      • Nombre del Atributo
      • Etiquetas: color
        • Atributo: rgba=valor de peso rojo, verde, azul y transparencia (cada valor de peso y valor de transparencia [0,1])
  • colisión —> La propiedad de colisión de la biela
  • Inercial —> Matriz de inercia de la biela

3.3 Explicación detallada de la sintaxis URDF 03_joint


articulación

La etiqueta conjunta en urdf se usa para describir las propiedades cinemáticas y dinámicas de las articulaciones del robot, y también puede especificar el límite de seguridad del movimiento de la articulación.Las dos partes del robot (denominadas enlace principal y enlace secundario) son conectados en forma de "articulaciones". Conexión, diferentes articulaciones tienen diferentes formas de movimiento: rotación, deslizamiento, fijación, velocidad de rotación, limitación del ángulo de rotación... Por ejemplo: las ruedas instaladas en la base pueden girar 360 grados, mientras que la cámara puede estar completamente fijada en la base.

Los datos correspondientes a la etiqueta conjunta no son visibles en el modelo[Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-44yTaDfi-1670239754332) (http://www.autolabor.com.cn/) libro/ROSTutorials/activos/% E5%AE%98%E6%96%B902_link.png)]

1. Atributos

  • nombre —> Nombre de la articulación
  • tipo —> forma de movimiento conjunto
    • continuo: articulación giratoria, que puede girar infinitamente alrededor de un solo eje
    • giratoria: articulación giratoria, similar a continua, pero con límite de ángulo de rotación
    • prismáticos: articulaciones deslizantes, articulaciones que se mueven a lo largo de un eje determinado, con límites de posición
    • cepilladora: una junta plana que permite la traslación o rotación en una dirección ortogonal al plano
    • flotante: juntas flotantes, que permiten movimientos de traslación y rotación
    • fijos: juntas fijas, juntas especiales que no permiten el movimiento

2. Subpestañas

  • padre (requerido)

    El nombre del enlace principal es un atributo obligatorio:

    • enlace: el nombre del enlace principal, que es el nombre de este enlace en el árbol de la estructura del robot.
  • niño (requerido)

    El nombre del enlace secundario es un atributo obligatorio:

    • enlace: el nombre del enlace secundario, que es el nombre de este enlace en el árbol de la estructura del robot.
  • origen

    • Atributos: xyz=desplazamiento en cada eje rpy=arco de desplazamiento en cada eje.
  • eje

    • Atributo: xyz se usa para establecer qué eje de articulación se debe mover.

3.4 Ejercicios URDF


Descripción del requisito:

Cree un modelo de robot cilíndrico de cuatro ruedas, los parámetros del robot son los siguientes, el chasis es cilíndrico, el radio es de 10 cm y la altura es de 8 cm. Las cuatro ruedas están compuestas por dos ruedas motrices y dos ruedas de soporte universal. El radio de Las dos ruedas motrices son de 3,25 cm, el ancho es de 1,5 cm, las dos ruedas universales son esféricas, el radio es de 0,75 cm y la distancia entre el chasis y el suelo es de 1,5 cm (consistente con el diámetro de las ruedas universales)

Demostración de resultados esperados:imagen

1. Cree un nuevo archivo urdf e inicie

archivo urdf: implementación básica

<robot name="mycar">
    <!-- <优化项> -->
    <link name="base_footprint">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <sphere radius="0.001"/>
            </geometry>
        </visual>
    </link>
    <!-- <底盘> -->
    <link name="base_link">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <!-- <1.1立方体 长宽高>  -->
                <!-- <box size="0.5 0.2 0.1"/> -->
                <!-- <1.2圆柱 半径、高度> -->
                <cylinder radius="0.1" length="0.08"/>
                <!-- <1.3球体 半径> -->
                <!-- <sphere radius="2"/> -->
                <!-- <1.4皮肤> -->
                <!-- <mesh filename="package://urdf01_rviz/meshes/autolabor_mini.stl" /> -->
            </geometry>
            <!-- <2.偏移量与倾斜弧度> -->
            <!-- <xyz坐标 rpy旋转角度3.14=180度 1.57=90度翻滚、俯仰、偏航> -->
            <!-- <无特殊情况不要在此处对xyz进行操作,影响后期TF坐标变换,可在下方joint操作 rpy可以操作> -->
            <origin xyz="0.0 0.0 0.0" rpy="0.0  0.0 0.0"/>
            <!-- <3.颜色>red green blue a透明度 取值范围[0,1]-->
            <material name="baselink_color">
                <color rgba="0.7 0.3 0.2 0.8"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节 关联footprint & baselink> -->
    <joint name="baselink2basefootprint" type="fixed">
        <!-- <设置偏移量> -->
        <origin xyz="0.0 0.0 0.055" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_footprint"/>
        <!-- <子级 link> -->
        <!-- <关节z偏移量 = 车体高度/2 + 离地间距 > -->
        <child link="base_link"/>
        <!-- <fixed不需要设置关节旋转参考的坐标轴> -->
        <!-- <axis xyz="0.0 0.0 0.0"/> -->
        <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
    </joint>

    <!-- <驱动轮01> -->
    <link name="left_Wheel">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <!-- <1.1立方体>  -->
                <!-- <box size="0.02 0.05 0.05"/> -->
                <!-- <1.2圆柱> -->
                <cylinder radius="0.0325" length="0.015"/>
                <!-- <1.3球体> -->
                <!-- <sphere radius="0.0075"/> -->
                <!-- <1.4皮肤> -->
                <!-- <mesh filename="package://urdf01_rviz/meshes/autolabor_mini.stl" /> -->
            </geometry>
            <!-- <2.偏移量与倾斜弧度> -->
            <!-- <xyz坐标 rpy旋转角度3.14=180度 1.57=90度翻滚、俯仰、偏航> -->
            <!-- <先使用默认后期要修改 为防止下沉应该上移动一半的高度> -->
            <!-- <无特殊情况不要在此处对xyz进行操作,影响后期TF坐标变换,可在下方joint操作 rpy可以操作> -->
            <origin xyz="0.0 0.0 0.0" rpy="1.5708 0.0 0.0"/>
            <!-- <3.颜色>red green blue a透明度 取值范围[0,1]-->
            <material name="Whell03_color">
                <color rgba="0.0 0.0 0.0 0.8"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节  关联baselink& Wheel_01> -->
    <joint name="LeftWheel2baselink" type="continuous">
        <!-- <设置偏移量> -->
        <!-- <
            x 无偏移
            y 车体半径
            z 车体高度/2 + 离地 - 车轮半径
    
        > -->
        <origin xyz="0.0 0.1 -0.0225" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_link"/>
        <!-- <子级 link> -->
        <child link="left_Wheel"/>
        <!-- <设置关节旋转参考的坐标轴> -->
        <axis xyz="0.0 1.0 0.0"/>
        <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
    </joint>

    <!-- <驱动轮02> -->
    <link name="right_Wheel">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <!-- <1.1立方体>  -->
                <!-- <box size="0.02 0.05 0.05"/> -->
                <!-- <1.2圆柱> -->
                <cylinder radius="0.0325" length="0.015"/>
                <!-- <1.3球体> -->
                <!-- <sphere radius="0.0075"/> -->
                <!-- <1.4皮肤> -->
                <!-- <mesh filename="package://urdf01_rviz/meshes/autolabor_mini.stl" /> -->
            </geometry>
            <!-- <2.偏移量与倾斜弧度> -->
            <!-- <xyz坐标 rpy旋转角度3.14=180度 1.57=90度翻滚、俯仰、偏航> -->
            <!-- <先使用默认后期要修改 为防止下沉应该上移动一半的高度> -->
            <!-- <无特殊情况不要在此处对xyz进行操作,影响后期TF坐标变换,可在下方joint操作 rpy可以操作> -->
            <origin xyz="0.0 0.0 0.0" rpy="1.5708 0.0 0.0"/>
            <!-- <3.颜色>red green blue a透明度 取值范围[0,1]-->
            <material name="Whell03_color">
                <color rgba="0.0 0.0 0.0 0.8"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节  关联baselink& Wheel_02> -->
    <joint name="RightWheel2baselink" type="continuous">
        <!-- <设置偏移量> -->
        <!-- <
            x 无偏移
            y 车体半径
            z 车体高度/2 + 离地 - 车轮半径
    
        > -->
        <origin xyz="0.0 -0.1 -0.0225" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_link"/>
        <!-- <子级 link> -->
        <child link="right_Wheel"/>
        <!-- <设置关节旋转参考的坐标轴> -->
        <axis xyz="0.0 1.0 0.0"/>
        <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
    </joint>

    <!-- <万向轮01> -->
    <link name="front_Wheel">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <!-- <1.1立方体>  -->
                <!-- <box size="0.02 0.05 0.05"/> -->
                <!-- <1.2圆柱> -->
                <!-- <cylinder radius="0.0325" length="0.015"/> -->
                <!-- <1.3球体> -->
                <sphere radius="0.0075"/>
                <!-- <1.4皮肤> -->
                <!-- <mesh filename="package://urdf01_rviz/meshes/autolabor_mini.stl" /> -->
            </geometry>
            <!-- <2.偏移量与倾斜弧度> -->
            <!-- <xyz坐标 rpy旋转角度3.14=180度 1.57=90度翻滚、俯仰、偏航> -->
            <!-- <先使用默认后期要修改 为防止下沉应该上移动一半的高度> -->
            <!-- <无特殊情况不要在此处对xyz进行操作,影响后期TF坐标变换,可在下方joint操作 rpy可以操作> -->
            <origin xyz="0.0 0.0 0.0" rpy="0.0  0.0 0.0"/>
            <!-- <3.颜色>red green blue a透明度 取值范围[0,1]-->
            <material name="Whell01_color">
                <color rgba="0.0 0.0 0.0 0.8"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节  关联baselink& Wheel_Universal_01> -->
    <joint name="FrontWheel2baselink" type="continuous">
        <!-- <设置偏移量> -->
        <!-- <
            x 小于车体半径
            y 无偏移
            z 车体高度/2 + 离地 - 车轮半径
    
        > -->
        <origin xyz="0.08 0.0 -0.0475" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_link"/>
        <!-- <子级 link> -->
        <child link="front_Wheel"/>
        <!-- <设置关节旋转参考的坐标轴> -->
        <axis xyz="1.0 1.0 0.0"/>
        <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
    </joint>



    <!-- <万向轮02> -->
    <link name="back_Wheel">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <!-- <1.1立方体>  -->
                <!-- <box size="0.02 0.05 0.05"/> -->
                <!-- <1.2圆柱> -->
                <!-- <cylinder radius="0.0325" length="0.015"/> -->
                <!-- <1.3球体> -->
                <sphere radius="0.0075"/>
                <!-- <1.4皮肤> -->
                <!-- <mesh filename="package://urdf01_rviz/meshes/autolabor_mini.stl" /> -->
            </geometry>
            <!-- <2.偏移量与倾斜弧度> -->
            <!-- <xyz坐标 rpy旋转角度3.14=180度 1.57=90度翻滚、俯仰、偏航> -->
            <!-- <先使用默认后期要修改 为防止下沉应该上移动一半的高度> -->
            <!-- <无特殊情况不要在此处对xyz进行操作,影响后期TF坐标变换,可在下方joint操作 rpy可以操作> -->
            <origin xyz="0.0 0.0 0.0" rpy="0.0  0.0 0.0"/>
            <!-- <3.颜色>red green blue a透明度 取值范围[0,1]-->
            <material name="Whell02_color">
                <color rgba="0.0 0.0 0.0 0.8"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节  关联baselink& Wheel_Universal_02> -->
    <joint name="BackWheel2baselink" type="continuous">
        <!-- <设置偏移量> -->
        <!-- <设置偏移量> -->
        <!-- <
            x 小于车体半径
            y 无偏移
            z 车体高度/2 + 离地 - 车轮半径
    
        > -->
        <origin xyz="-0.08 0.0 -0.0475" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_link"/>
        <!-- <子级 link> -->
        <child link="back_Wheel"/>
        <!-- <设置关节旋转参考的坐标轴> -->
        <axis xyz="1.0 1.0 0.0"/>
        <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
    </joint>


</robot>

archivo de lanzamiento:

<launch>

    <!-- 设置参数 -->
    <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/urdf/demo05_test.urdf" />

    <!-- 启动 rviz -->
    <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="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
    <!-- 添加机器人状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />

</launch>

[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-PmcZuDCE-1670239754335) (C:\Users\Haotian\AppData\Roaming\Typora\ typora-user-images \1669983533650.png)]

3.5 Herramientas URDF


En ROS, se proporcionan algunas herramientas para facilitar la escritura de archivos URDF, como:

  • check_urdfcomando para verificar archivos urdf complejos en busca de problemas de sintaxis
  • urdf_to_graphizEl comando puede ver la estructura del modelo urdf y mostrar la relación jerárquica de diferentes enlaces

Por supuesto, antes de usar la herramienta, primero debe instalarla. El comando de instalación:sudo apt install liburdfdom-tools

1. verificación de sintaxis check_urdf

Ingrese el directorio al que pertenece el archivo urdf, llame: check_urdf urdf文件, si no se lanza ninguna excepción, el archivo es legal, de lo contrario es ilegal

inserte la descripción de la imagen aquí

experimento:

inserte la descripción de la imagen aquí

Tenga en cuenta que hacer clic derecho en la primera carpeta urdf permitirá completar la pestaña

2. vista de estructura urdf_to_graphiz

Ingrese el directorio al que pertenece el archivo urdf, llame a: urdf_to_graphiz urdf文件, se generará un archivo pdf en el directorio actual

inserte la descripción de la imagen aquí

4. Optimización de URDF_xacro


concepto

Xacro es la abreviatura de XML Macros, Xacro es un lenguaje de macros XML, que es XML programable.

principio

Xacro puede declarar variables, resolverlas a través de operaciones matemáticas, usar control de procesos para controlar la secuencia de ejecución y encapsular lógica fija mediante la implementación de funciones similares, exponiendo los datos variables requeridos en la lógica como parámetros, mejorando así el código. seguridad.

efecto

En comparación con la implementación pura de URDF, se pueden escribir archivos de modelo de robot que son más seguros, más compactos y más legibles, y se puede mejorar la eficiencia de escritura.

4.1 Experiencia Xacro_Quick


Descripción del requisito:

Usar xacro para optimizar la implementación de la rueda motriz en el caso de la sección anterior requiere el uso de variables para encapsular el radio y la altura del chasis, usar fórmulas matemáticas para calcular dinámicamente las coordenadas del punto de unión del chasis, usar macros Xacro para encapsule el código repetido de las ruedas y llame a la macro para crear dos ruedas (nota: aquí se demuestra el uso básico de Xacro, no es necesario generar URDF legal).

Preparar:

Cree un paquete de funciones e importe urdf y xacro.

1. Escritura de archivos Xacro

Escriba un archivo Xacro que encapsule propiedades (radio constante, altura, radio de rueda...) como variables y encapsule implementaciones repetidas (adición de ruedas) como funciones.

<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
<!-- <
    1.代码复用     Xacro 宏定义 (函数调用)
    2.参数设计     Xacro 变量
> -->
    <!-- 属性封装 -->
    <xacro:property name="wheel_radius" value="0.0325" />
    <xacro:property name="wheel_length" value="0.0015" />
    <xacro:property name="PI" value="3.1415927" />
    <xacro:property name="base_link_length" value="0.08" />
    <xacro:property name="lidi_space" value="0.015" />

    <!-- 宏 -->
    <xacro:macro name="wheel_func" params="wheel_name flag" >
        <link name="${wheel_name}_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
                </geometry>

                <origin xyz="0 0 0" rpy="${PI / 2} 0 0" />

                <material name="wheel_color">
                    <color rgba="0 0 0 0.3" />
                </material>
            </visual>
        </link>

        <!-- 3-2.joint -->
        <joint name="${wheel_name}2link" type="continuous">
            <parent link="base_link"  />
            <child link="${wheel_name}_wheel" />
            <!-- 
                x 无偏移
                y 车体半径
                z z= 车体高度 / 2 + 离地间距 - 车轮半径

            -->
            <origin xyz="0 ${0.1 * flag} ${(base_link_length / 2 + lidi_space - wheel_radius) * -1}" rpy="0 0 0" />
            <axis xyz="0 1 0" />
        </joint>

    </xacro:macro>
    <!-- <调用> -->
    <xacro:wheel_func wheel_name="left" flag="1" />
    <xacro:wheel_func wheel_name="right" flag="-1" />
</robot>

2. Convertir archivo Xacro a archivo urdf

Use la línea de comando para ingresar al directorio al que pertenece el archivo xacro y ejecute: rosrun xacro xacro xxx.xacro > xxx.urdf, el archivo xacro se analizará en un archivo urdf.

Nota: Este caso está escrito para generar un archivo URDF ilegal, el propósito es demostrar el uso mínimo y las ventajas de Xacro.

4.2 Explicación detallada de la gramática Xacro_


xacro proporciona una interfaz programable, similar a un lenguaje informático, que incluye implementaciones de sintaxis como declaración y llamada de variables, declaración y llamada de funciones. Al usar xacro para generar urdf, robotla declaración del espacio de nombres debe incluirse en la etiqueta raíz:xmlns:xacro="http://wiki.ros.org/xacro"

1. Atributos y operaciones aritméticas

Se utiliza para encapsular algunos campos en URDF, como: valor PAI, tamaño del coche, radio de la rueda...

definición de atributo

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

llamada de atributo

${属性名称}

Aritmética

${数学表达式}

2. Macro

Similar a la implementación de funciones, mejora la tasa de reutilización de código, optimiza la estructura del código y mejora la seguridad

definición de macros

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

    .....

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

</xacro:macro>

llamada macro

<xacro:宏名称 参数1=xxx 参数2=xxx/>

3. El archivo contiene

El robot se compone de múltiples partes, y diferentes partes se pueden empaquetar en archivos xacro separados. Finalmente, diferentes archivos se integran y combinan en un robot completo, que se puede implementar mediante la inclusión de archivos.

el archivo contiene

<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>

4.3 Ejemplo de proceso de uso de Xacro_ complete


Descripción del requisito:

Uso de Xacro para optimizar la versión URDF del modelo de chasis del automóvil

Demostración de resultados esperados:

imagen

1. Escribir archivo Xacro

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
   
    <xacro:property name="footprint_radius" value="0.001"/>
    
     <link name="base_footprint">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
            <sphere radius="${footprint_radius}"/>
            </geometry>
        </visual>
    </link>
    <xacro:property name="base_radius" value="0.1"/>
    <xacro:property name="base_length" value="0.08"/>
    <xacro:property name="lidi" value="0.015"/>
    <xacro:property name="base_joint_z" value="${base_length / 2 + lidi}"/>
    <!-- <底盘> -->
    <link name="base_link">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <cylinder radius="${base_radius}" length="${base_length}"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0  0.0 0.0"/>
            <material name="baselink_color">
                <color rgba="0.7 0.3 0.2 0.5"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节 关联footprint & baselink> -->
    <joint name="baselink2basefootprint" type="fixed">
        <!-- <设置偏移量> -->
        <origin xyz="0.0 0.0 ${base_joint_z}" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_footprint"/>
        <!-- <子级 link> -->
        <!-- <关节z偏移量 = 车体高度/2 + 离地间距 > -->
        <child link="base_link"/>
    </joint>

    <xacro:property name="wheel_radius" value="0.0325"/>
    <xacro:property name="wheel_length" value="0.015"/>
    <xacro:property name="PI" value="3.1415927"/>
    <!-- <结果是负数> -->
    <xacro:property name="wheel_joint_z" value="${(base_length / 2 + lidi - wheel_radius) * -1}"/>
   
    <xacro:macro name="wheel_func" params="wheel_name flag">
    <!-- <
        wheel_name : left or right
        flag : 1 or -1 right/left wheel
    > -->
    <!-- <驱动轮01> -->
        <link name="${wheel_name}">
            <!-- <可视化标签> -->
            <visual>
                <!-- <1.形状> -->
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}"/>
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0"/>
                <material name="whell03_color">
                    <color rgba="0.0 0.0 0.0 0.8"/>
                </material>
            </visual>
        </link>
        <!-- <joint关节  关联baselink& Wheel_01> -->
        <joint name="${wheel_name}2baselink" type="continuous">
            <!-- <设置偏移量> -->
            <!-- <
                x 无偏移
                y 车体半径
                z 车体高度/2 + 离地 - 车轮半径
            > -->
            <origin xyz="0.0 ${flag * 0.1} ${wheel_joint_z}" rpy="0.0 0.0 0.0"/>
            <!-- <父级 link> -->
            <parent link="base_link"/>
            <!-- <子级 link> -->
            <child link="${wheel_name}"/>
            <!-- <设置关节旋转参考的坐标轴> -->
            <axis xyz="0.0 1.0 0.0"/>
            <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
        </joint>
    </xacro:macro>
    <xacro:wheel_func wheel_name="base_l_wheel_joint" flag="1"/>
    <xacro:wheel_func wheel_name="base_r_wheel_joint" flag="-1"/>


    <xacro:property name="sup_wheel_radius" value="0.0075"/>
     <xacro:property name="sup_wheel_joint_x" value="${base_radius - sup_wheel_radius }"/>
     <!-- <结果是负数> -->
    <xacro:property name="sup_wheel_joint_z" value="${(base_length / 2 + lidi - sup_wheel_radius ) * -1}"/>


    <xacro:macro name="sup_wheel_func" params="name flag">
        <!-- <万向轮01> -->
        <link name="${name}_wheel">
            <!-- <可视化标签> -->
            <visual>
                <!-- <1.形状> -->
                <geometry>
                    <sphere radius="${sup_wheel_radius}"/>
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="0.0  0.0 0.0"/>
                <material name="whell01_color">
                    <color rgba="0.0 0.0 0.0 0.8"/>
                </material>
            </visual>
        </link>
        <!-- <joint关节  关联baselink& Wheel_Universal_01> -->
        <joint name="${name}2baselink" type="continuous">
            <!-- <设置偏移量> -->
                    <!-- <
                x 小于车体半径 自定义  底盘半径-万象轮半径=0.1-0.0075=0.0925
                y 无偏移
                z 车体高度/2 + 离地 - 车轮直径
            > -->
            <origin xyz="${sup_wheel_joint_x * flag } 0.0 ${sup_wheel_joint_z}" rpy="0.0 0.0 0.0"/>
            <!-- <父级 link> -->
            <parent link="base_link"/>
            <!-- <子级 link> -->
            <child link="${name}_wheel"/>
            <!-- <设置关节旋转参考的坐标轴> -->
            <axis xyz="1.0 1.0 1.0"/>
            <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
        </joint>
    </xacro:macro>
    <xacro:sup_wheel_func name="front" flag="1"/>
    <xacro:sup_wheel_func name="back" flag="-1"/>

</robot>

2. Integrar el archivo de lanzamiento

**Método 1:** primero convierta el archivo xacro en un archivo urdf y luego integre

Primero analice el archivo xacro en un archivo urdf: rosrun xacro xacro xxx.xacro > xxx.urdfluego integre directamente el archivo de inicio de acuerdo con el método de integración anterior;

**Método 2:** Cargue xacro directamente en el archivo de inicio ( recomendado )

Ejemplo de contenido de lanzamiento:

<launch>

    <!-- 设置参数 -->
    <!-- <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf" /> -->
     <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/demo05_car_base.xacro" />
    <!-- 启动 rviz -->
    <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="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
    <!-- 添加机器人状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />

</launch>

Código central:

 <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/demo05_car_base.xacro" />

robot_descriptionEl atributo se usa al cargar command, y el valor del atributo es para llamar al programa xacro del paquete de funciones xacro para analizar directamente el archivo xacro.

4.4 Explicación detallada de la sintaxis URDF 01_robot


Descripción del requisito:

Sobre la base del chasis delantero del automóvil, agregue cámaras y sensores de radar.

Demostración de resultados:

inserte la descripción de la imagen aquí

Realizar análisis:

El modelo de robot se compone de varias partes, y los diferentes componentes se pueden configurar en archivos separados y, finalmente, el ensamblaje de los componentes se puede realizar mediante la inclusión de archivos.

Proceso de implementación:

  1. Primero escribe el archivo xacro de cámara y radar.
  2. Luego escriba un archivo combinado para combinar el chasis, la cámara y el radar.
  3. Finalmente, inicie Rviz a través del archivo de inicio y muestre el modelo

1. Implementación del archivo Xacro de cámara y radar

Archivo xacro de cámara:

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <!-- <摄像头> -->
    <!-- <
        1.连杆属性:厚度(x)宽度(y) 高度(z)
        2.关节属性: x y z
    > -->

    <xacro:property name="camera_length" value="0.02"/>
    <xacro:property name="camera_width" value="0.05"/>
    <xacro:property name="camera_hight" value="0.05"/>

    <xacro:property name="joint_camera_x" value="0.08"/>
    <xacro:property name="joint_camera_y" value="0.0"/>
    <xacro:property name="joint_camera_z" value="${base_length / 2 +  camera_length / 2 + lidi }"/>
    
    <link name="camera">
      
        <visual>
        <geometry>
            <box size="${camera_length} ${camera_width} ${camera_hight}"/>
        </geometry>
        <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
        <material name="camera_black">
            <color rgba="0.0 0.0 0.0 1.0"/>
        </material>
        </visual>

    </link>
    <joint name="camera2base" type="fixed">
        <parent link="base_link"/>
        <child link="camera"/>
        <origin xyz="${joint_camera_x} ${joint_camera_y} ${joint_camera_z}" rpy="0.0 0.0 0.0"/>
    </joint>
    

</robot>

Archivo xacro radar:

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <!-- <雷达> -->
    <!-- <
        1.支撑尺寸:高度 半径
        2.关节属性: x y z

        1.雷达尺寸:高度 半径
        2.关节属性: x y z
    > -->
    <xacro:property name="support_radius" value="0.01"/>
    <xacro:property name="support_length" value="0.15"/>

    <xacro:property name="joint_support_x" value="0"/>
    <xacro:property name="joint_support_y" value="0"/>
    <!-- z=车体高度/2+支撑高度/2  -->
    <xacro:property name="joint_support_z" value="${support_length / 2+ base_length / 2 }"/>

    <xacro:property name="laser_radius" value="0.03"/>
    <xacro:property name="laser_length" value="0.05"/>

    <xacro:property name="joint_laser_x" value="0"/>
    <xacro:property name="joint_laser_y" value="0"/>
    <xacro:property name="joint_laser_z" value="${support_length / 2+ laser_length / 2}"/>
    <!-- 支架 -->
    <link name="support">
        <visual>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <geometry>
                <cylinder radius="${support_radius}" length="${support_length}"/>
            </geometry>
            <material name="yellow">
                <color rgba="0.8 0.5 0.0 0.5"/>
            </material>
        </visual>
    </link>

    <joint name="support2baselink" type="fixed">
        <parent link="base_link"/>
        <child link="support"/>
        <origin xyz="${joint_support_x} ${joint_support_y} ${joint_support_z}" rpy="0.0 0.0 0.0"/>
    </joint>
    <!-- 雷达 -->
    <link name="laser">
        <visual>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}"/>
            </geometry>
            <material name="laser">
                <color rgba="0.0 0.0 0.0 0.5"/>
            </material>
        </visual>
    </link>
    <joint name="laser2supportlink" type="fixed">
        <parent link="support"/>
        <child link="laser"/>
        <origin xyz="${joint_laser_x} ${joint_laser_y} ${joint_laser_z}" rpy="0 0 0"/>
    </joint>

</robot>


2. Combina el archivo xacro de la cámara del chasis y el radar.

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <!-- <文件包含> -->

    <xacro:include filename="demo05_car_base.urdf.xacro"/>
    <xacro:include filename="demo06_car_camera.urdf.xacro"/>
    <xacro:include filename="demo07_car_laser.urdf.xacro"/>

</robot>

3. iniciar archivo

<launch>

    <!-- 设置参数 -->
    <!-- <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf" /> -->
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/car.urdf.xacro" />
    <!-- 启动 rviz -->
    <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>

inserte la descripción de la imagen aquí

5. Controla el movimiento del modelo de robot en Rviz

**Arbotix:**Arbotix es una placa de control para controlar motores y servos, y proporciona un paquete de funciones ros correspondiente.Las funciones de este paquete de funciones no solo pueden controlar la placa de control real de Arbotix, sino que también proporcionan un controlador de velocidad diferencial , Actualice el estado conjunto del robot aceptando el comando de control de velocidad, que nos ayuda a realizar el movimiento del robot en rviz.

El controlador diferencial está en el paquete arbotix_python, y el paquete completo de arbotix también incluye una variedad de controladores, correspondientes a motores dynamixel, brazos robóticos de articulaciones múltiples y pinzas de diferentes formas.

A continuación, demuestre el uso de arbotix a través de un caso.

Descripción del requisito:

Controle el modelo de robot para hacer movimiento circular en rviz

Demostración de resultados:

inserte la descripción de la imagen aquí

Proceso de implementación:

  1. Instalar Arbotix
  2. Cree un nuevo paquete de funciones, prepare robots urdf, archivos xacro
  3. Agregar archivo de configuración de Arbotix
  4. Escriba un archivo de lanzamiento para configurar Arbotix
  5. Inicie el archivo de lanzamiento y controle el movimiento del modelo de robot

1. Instalar Arbotix

**Método 1:**Llamada de línea de comandos

sudo apt-get install ros-<<VersionName()>>-arbotix

Reemplace <<VsersionName()>> con el nombre de la versión actual de ROS. Si le indica que no se puede ubicar el paquete de funciones, utilice el método 2.

**Método 2:**Instalación del código fuente

Primero descargue el código fuente de github, luego llame a catkin_make para compilar

git clone https://github.com/vanadiumlabs/arbotix_ros.git

2. Crear un nuevo paquete de funciones y preparar el robot urdf y xacro

urdf y xacro se pueden implementar llamando a la conferencia anterior

3. Agregue los archivos de configuración requeridos por arbotix

Agregue los archivos de configuración necesarios de arbotix

# 该文件是控制器配置,一个机器人模型可能有多个控制器,比如: 底盘、机械臂、夹持器(机械手)....
# 因此,根 name 是 controller
controllers: {
    
    
   # 单控制器设置
   base_controller: {
    
    
          #类型: 差速控制器
       type: diff_controller,
       #参考坐标
       base_frame_id: base_footprint, 
       #两个轮子之间的间距
       base_width: 0.2,
       #控制频率
       ticks_meter: 2000, 
       #PID控制参数,使机器人车轮快速达到预期速度
       Kp: 12, 
       Kd: 12, 
       Ki: 0, 
       Ko: 50, 
       #加速限制
       accel_limit: 1.0 
    }
}

Ver también: http://wiki.ros.org/arbotix_python/diff_controller

4. Configure el nodo arbotix en el archivo de lanzamiento

iniciar código de muestra

<launch>

    <!-- 设置参数 -->
    <!-- <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf" /> -->
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/car.urdf.xacro" />
    <!-- 启动 rviz -->
    <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" />
    <!-- 添加集成 arbotix 运动控制节点,并加载参数 -->
    <node pkg="arbotix_python" type="arbotix_driver" name="driver" output="screen">
        <rosparam command="load" file="$(find urdf01_rviz)/config/control.yaml" />
        <param name="sim" value="true"/>
        <!-- 可以控制现实和仿真环境,因此需要设置为仿真 -->


    </node>

</launch>

Explicación del código:

Llamado al nodo arbotix_driver bajo el paquete de funciones arbotix_python

Cuando arbotix hace que el robot se ejecute, necesita obtener información del robot y puede cargar el archivo de configuración a través del archivo

En el entorno de simulación, debe configurar sim como verdadero

5. Inicie el archivo de lanzamiento y controle el movimiento del modelo de robot

**Iniciar lanzamiento:** roslaunch xxxx...lanzamiento

Error de inicio:

Joint state with name: "base_l_wheel_joint" was received but not found in URDF

Motivo: nombre diferente de la configuración de arbotix

demo05_car_base.urdf cambia los nombres de los nodos de unión de las ruedas izquierda y derecha a "base_l_wheel_joint" y "base_r_wheel_joint"

Convertir xacro a urdf: rosrun xacro xacro demo05_car_base.urdf.xacro > demo05.urdf

Convertir a pdf para ver: urdf_to_graphiz urdf/demo05.urdf

inserte la descripción de la imagen aquí

Configurar rviz:

inserte la descripción de la imagen aquí

Controla el movimiento del coche:

Llamar a la lista rostopic en este momento encontrará un tema familiar: /cmd_vel

inserte la descripción de la imagen aquí

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{
    
    linear: {
    
    x: 0.2, y: 0, z: 0}, angular: {
    
    x: 0, y: 0, z: 0.5}}'

Consulte también:

  • http://wiki.ros.org/arbotix

6. URDF integra Gazebo

URDF debe integrarse en Rviz o Gazebo para mostrar el modelo de robot visualizado

6.1 Proceso básico de integración de URDF y Gazebo

El proceso de integración de URDF y Gazebo es similar al de Rviz, los pasos principales son los siguientes:

  1. Crear un paquete de funciones e importar dependencias
  2. Escribir archivos URDF o Xacro
  3. Inicie Gazebo y muestre el modelo de robot

1. Cree un paquete de características

Crear un nuevo paquete de funciones e importar paquetes dependientes: urdf, xacro, gazebo_ros, gazebo_ros_control, gazebo_plugins

2. Escribir archivo URDF

Tenga en cuenta que cuando URDF necesita integrarse con Gazebo, es significativamente diferente de Rviz:

1. Se debe usar la etiqueta de colisión porque, dado que es un entorno de simulación, debe incluir la detección de colisiones, y la colisión proporciona la base para la detección de colisiones.

2. Se debe utilizar la etiqueta de inercia. Esta etiqueta marca la matriz de inercia de una determinada parte del cuerpo rígido del robot actual, que se utiliza para algunos cálculos de simulación relacionados con la mecánica.

3. La configuración de color también debe volver a etiquetarse con la etiqueta de la glorieta, ya que la configuración de color anterior incluye transparencia para facilitar la depuración y no existe tal opción en el entorno de simulación.

3. Inicie Gazebo y muestre el modelo.

Explicación del código:

<include file="$(find gazebo_ros)/launch/empty_world.launch" />
<!-- 启动 Gazebo 的仿真环境,当前环境为空环境 -->

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

<!-- 
    在 Gazebo 中加载一个机器人模型,该功能由 gazebo_ros 下的 spawn_model 提供:
    -urdf 加载的是 urdf 文件
    -model mycar 模型名称是 mycar
    -param robot_description 从参数 robot_description 中载入模型
    -x 模型载入的 x 坐标
    -y 模型载入的 y 坐标
    -z 模型载入的 z 坐标
-->

6.2 Configuraciones relacionadas con la glorieta integrada de URDF

En comparación con Rviz, Gazebo necesita hacer algunas modificaciones al integrar URDF. Por ejemplo, se deben agregar parámetros relacionados con los atributos de colisión y se deben agregar parámetros relacionados con la matriz de inercia. Además, si la configuración de color del robot en Rviz es directamente trasplantado, no se mostrará La configuración de color también debe cambiarse en consecuencia.

1.colisión

Si el enlace del robot tiene una forma geométrica estándar, se puede configurar para que sea coherente con el atributo visual del enlace.

2.inercial

La configuración de la matriz de inercia debe generarse dinámicamente en combinación con los parámetros de calidad y forma del enlace. En principio, a excepción de base_footprint, cada parte del cuerpo rígido del robot debe establecer una matriz de inercia, y la matriz de inercia debe Si define la inercia de la parte del cuerpo rígido a voluntad Matrix, puede hacer que el robot tiemble y se mueva en Gazebo.

3. Configuración de color

Para mostrar el color del enlace en la glorieta, se debe usar la etiqueta especificada:

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

**PD: **En la etiqueta del material, el valor establecido distingue entre mayúsculas y minúsculas, y el color se puede establecer en Rojo Azul Verde Negro...

6.3 Descripción de los requisitos prácticos de funcionamiento del Gazebo integrado de URDF:

Mostrar el modelo de robot anterior (versión xacro) en la glorieta

Demostración de resultados:
inserte la descripción de la imagen aquí

Proceso de implementación:

  1. Necesito escribir el archivo xacro que encapsula el algoritmo de matriz de inercia
  2. Agregue etiquetas de colisión e inercia a cada enlace en el modelo de robot y restablezca el atributo de color
  3. Inicie gazebo en el archivo de inicio y agregue el modelo de robot

1. Escriba el archivo xacro que encapsula el algoritmo de matriz de inercia

<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- Macro for inertia matrix -->
    <xacro:macro name="sphere_inertial_matrix" params="m r">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
                iyy="${2*m*r*r/5}" iyz="0" 
                izz="${2*m*r*r/5}" />
        </inertial>
    </xacro:macro>

    <xacro:macro name="cylinder_inertial_matrix" params="m r h">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
                iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
                izz="${m*r*r/2}" /> 
        </inertial>
    </xacro:macro>

    <xacro:macro name="Box_inertial_matrix" params="m l w h">
       <inertial>
               <mass value="${m}" />
               <inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
                   iyy="${m*(w*w + l*l)/12}" iyz= "0"
                   izz="${m*(w*w + h*h)/12}" />
       </inertial>
   </xacro:macro>
</robot>

2. Copie el archivo xacro relevante y establezca parámetros como la inercia de colisión y el color.

A. Chasis Archivo Xacro
<robot name="my_base"
    xmlns:xacro="http://www.ros.org/wiki/xacro">
    <!-- 封装变量、常量 -->
    <!-- PI 值设置精度需要高一些,否则后续车轮翻转量计算时,可能会出现肉眼不能察觉的车轮倾斜,从而导致模型抖动 -->

    <!-- 宏:黑色设置 -->
    <material name="black">
        <color rgba="0.0 0.0 0.0 1.0" />
    </material>

    <!-- 底盘属性 -->
    <xacro:property name="footprint_radius" value="0.001" />
    <xacro:property name="PI" value="3.1415926"/>
    <!-- base_footprint 半径  -->
    <xacro:property name="base_radius" value="0.1" />
    <!-- base_link 半径 -->
    <xacro:property name="base_length" value="0.08" />
    <!-- base_link 长 -->
    <xacro:property name="lidi" value="0.015" />
    <!-- 离地间距 -->
    <xacro:property name="base_mass" value="0.5" />
    <!-- 质量  -->
    <!-- 驱动轮属性 -->
    <xacro:property name="wheel_radius" value="0.0325" />
    <!-- 半径 -->
    <xacro:property name="wheel_length" value="0.015" />
    <!-- 宽度 -->
    <xacro:property name="wheel_mass" value="0.05" />
    <!-- 质量  -->
    <!-- 支撑轮属性 -->
    <xacro:property name="sup_wheel_radius" value="0.0075" />
    <!-- 支撑轮半径 -->
    <xacro:property name="sup_wheel_mass" value="0.03" />
    <!-- 质量  -->
    <!-- 底盘 -->
    <link name="base_footprint">
        <visual>
            <geometry>
                <sphere radius="${footprint_radius}" />
            </geometry>
        </visual>
    </link>
    <link name="base_link">
        <visual>
            <geometry>
                <cylinder radius="${base_radius}" length="${base_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_radius}" length="${base_length}" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
        </collision>
        <xacro:cylinder_inertial_matrix m="${base_mass}" r="${base_radius}" h="${base_length}" />
    </link>
    <joint name="base_link2base_footprint" type="fixed">
        <parent link="base_footprint" />
        <child link="base_link" />
        <origin xyz="0 0 ${lidi + base_length / 2 }" />
    </joint>
    <gazebo reference="base_link">
        <material>Gazebo/Yellow</material>
    </gazebo>
    <!-- 驱动轮 -->
    <!-- 驱动轮宏实现 -->
    <xacro:macro name="wheel_func" params="name flag">
        <link name="${name}_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
                <material name="black" />
            </visual>
            <collision>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
            </collision>
            <xacro:cylinder_inertial_matrix m="${wheel_mass}" r="${wheel_radius}" h="${wheel_length}" />

        </link>
        <joint name="${name}_wheel2base_link" type="continuous">
            <parent link="base_link" />
            <child link="${name}_wheel" />
            <origin xyz="0 ${flag * base_radius} ${-(lidi + base_length / 2 - wheel_radius) }" />
            <axis xyz="0 1 0" />
        </joint>

        <gazebo reference="${name}_wheel">
            <material>Gazebo/Red</material>
        </gazebo>
    </xacro:macro>
    <xacro:wheel_func name="left" flag="1" />
    <xacro:wheel_func name="right" flag="-1" />
    <!-- 支撑轮 -->
    <!-- 支撑轮宏 -->
    <xacro:macro name="sup_wheel_func" params="name flag">
        <link name="${name}_wheel">
            <visual>
                <geometry>
                    <sphere radius="${sup_wheel_radius}" />
                </geometry>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <material name="black" />
            </visual>
            <collision>
                <geometry>
                    <sphere radius="${sup_wheel_radius}" />
                </geometry>
                <origin xyz="0 0 0" rpy="0 0 0" />
            </collision>
            <xacro:sphere_inertial_matrix m="${sup_wheel_mass}" r="${sup_wheel_radius}" />
        </link>

        <joint name="${name}_wheel2base_link" type="continuous">
            <parent link="base_link" />
            <child link="${name}_wheel" />
            <origin xyz="${flag * (base_radius - sup_wheel_radius)} 0 ${-(base_length / 2 + lidi / 2)}" />
            <axis xyz="1 1 1" />
        </joint>
        <gazebo reference="${name}_wheel">
            <material>Gazebo/Red</material>
        </gazebo>
    </xacro:macro>
    <xacro:sup_wheel_func name="front" flag="1" />
    <xacro:sup_wheel_func name="back" flag="-1" />
</robot>

Nota: Si el modelo de robot tiembla, se desliza, se mueve lentamente en Gazebo, etc., verifique

  1. Si la matriz de inercia está configurada y si la configuración es correcta y razonable
  2. El giro de la rueda debe depender del valor de PI, si la precisión del valor de PI es baja, también puede conducir a la situación anterior
B. Cámara archivo Xacro
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <!-- <摄像头> -->
    <!-- <
        1.连杆属性:厚度(x)宽度(y) 高度(z)
        2.关节属性: x y z
    > -->

    <xacro:property name="camera_length" value="0.02"/>
    <xacro:property name="camera_width" value="0.05"/>
    <xacro:property name="camera_hight" value="0.05"/>
    <xacro:property name="camera_mass" value="0.01"/>

    <xacro:property name="joint_camera_x" value="0.08"/>
    <xacro:property name="joint_camera_y" value="0.0"/>
    <xacro:property name="joint_camera_z" value="${base_length / 2 +  camera_length / 2 + lidi }"/>

    <link name="camera">
        <visual>
            <geometry>
                <box size="${camera_length} ${camera_width} ${camera_hight}"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <material name="camera_black">
                <color rgba="0.0 0.0 0.0 1.0"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <box size="${camera_length} ${camera_width} ${camera_hight}"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
        </collision>
        <xacro:Box_inertial_matrix m="${camera_mass}" l="${camera_length}" w="${camera_width}" h="${camera_hight}" />
    </link>

    <joint name="camera2base" type="fixed">
        <parent link="base_link"/>
        <child link="camera"/>
        <origin xyz="${joint_camera_x} ${joint_camera_y} ${joint_camera_z}" rpy="0.0 0.0 0.0"/>
    </joint>
    <gazebo reference="camera">
        <material>
            Gazebo/Blue 
        </material>
    </gazebo>

</robot>
C. Archivo Radar Xacro
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <!-- <雷达> -->
    <!-- <
        1.支撑尺寸:高度 半径
        2.关节属性: x y z


        1.雷达尺寸:高度 半径
        2.关节属性: x y z
    > -->
    <xacro:property name="suport_radius" value="0.01"/>
    <xacro:property name="suport_length" value="0.15"/>
    <xacro:property name="suport_mass" value="0.10"/>

    <xacro:property name="joint_suport_x" value="0"/>
    <xacro:property name="joint_suport_y" value="0"/>
    <xacro:property name="joint_suport_z" value="${suport_length / 2+ base_length / 2 }"/>

    <xacro:property name="laser_radius" value="0.03"/>
    <xacro:property name="laser_length" value="0.05"/>
    <xacro:property name="laser_mass" value="0.15"/>

    <xacro:property name="joint_laser_x" value="0"/>
    <xacro:property name="joint_laser_y" value="0"/>
    <xacro:property name="joint_laser_z" value="${suport_length / 2+ laser_length / 2}"/>

    <link name="suport_link">
        <visual>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <geometry>
                <cylinder radius="${suport_radius}" length="${suport_length}"/>
            </geometry>
            <material name="suport_link">
                <color rgba="1.0 0.0 1.0 0.6"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="${suport_radius}" length="${suport_length}"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
        </collision>
        <xacro:cylinder_inertial_matrix m="${suport_mass}" r="${suport_radius}" h="${suport_length}"/>
    </link>

    <joint name="suport2baselink" type="fixed">
        <parent link="base_link"/>
        <child link="suport_link"/>
        <origin xyz="${joint_suport_x} ${joint_suport_y} ${joint_suport_z}" rpy="0.0 0.0 0.0"/>
    </joint>
    <gazebo reference="suport_link">
        <material>
                Gazebo/Grey 
        </material>
    </gazebo>


    <link name="laser">
        <visual>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}"/>
            </geometry>
            <material name="laser">
                <color rgba="0.5 0.7 1.0 0.8"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
        </collision>
        <xacro:cylinder_inertial_matrix m="${laser_mass}" r="${laser_radius}" h="${laser_length}"/>
    </link>

    <joint name="laser2suportlink" type="fixed">
        <parent link="suport_link"/>
        <child link="laser"/>
        <origin xyz="${joint_laser_x} ${joint_laser_y} ${joint_laser_z}" rpy="0 0 0"/>
    </joint>
    <gazebo reference="laser">
        <material>
                Gazebo/Black 
        </material>
    </gazebo>


</robot>
D. Archivo Xacro combinando chasis, cámara y radar
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <xacro:include filename="inertia.xacro"/>

    <!-- <文件包含> -->

    <xacro:include filename="demo05_car_base.urdf.xacro"/>
    <xacro:include filename="demo06_car_camera.urdf.xacro"/>
    <xacro:include filename="demo07_car_laser.urdf.xacro"/>

</robot>

3. Ejecutar en mirador

archivo de lanzamiento:

<launch>
    <!-- <需要在参数服务器中载入urdf> -->
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf02_gazebo)/urdf/car.urdf.xacro" />
    <!-- <启动Gazebo仿真环境> -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(find urdf02_gazebo)/worlds/box_house.world" />
    </include>
    <!-- <在Gazebo中添加机器人模型> -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
</launch>

inserte la descripción de la imagen aquí

6.4 Construcción del entorno de simulación de Gazebo

Hay dos formas de crear implementaciones de simulación en Gazebo:

  • Método 1: agregue directamente componentes integrados para crear un entorno de simulación
  • Método 2: dibujar manualmente el entorno de simulación (más flexible)

También puede descargar y usar directamente complementos de entornos de simulación mejorados oficiales o de terceros.

1. Agregue componentes integrados para crear un entorno de simulación

1.1 Inicie Gazebo y agregue componentes

inserte la descripción de la imagen aquí

1.2 Guardar el entorno de simulación

inserte la descripción de la imagen aquí

Después de agregar, seleccione archivo -> Guardar mundo como para seleccionar la ruta de guardado (en el paquete de funciones: directorio de mundos), personalice el nombre del archivo y establezca el sufijo en .world

1.3 inicio
<launch>

    <!-- 将 Urdf 文件的内容加载到参数服务器 -->
    <param name="robot_description" command="$(find xacro)/xacro $(find demo02_urdf_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro" />
    <!-- 启动 gazebo -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(find demo02_urdf_gazebo)/worlds/hello.world" />
    </include>

    <!-- 在 gazebo 中显示机器人模型 -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
</launch>
Copy

argCódigo principal: después de iniciar el mundo vacío, cargue el entorno de simulación personalizado de acuerdo con

<include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find demo02_urdf_gazebo)/worlds/hello.world" />
</include>
Copy

2. Personaliza el entorno de simulación

2.1 Comenzar mirador Abra el panel de construcción y dibuje el entorno de simulación

inserte la descripción de la imagen aquí

2.2 Salvar el entorno construido

Haga clic en: archivo en la esquina superior izquierda —> Guardar (en el paquete de función de ruta de guardado: modelos)

Luego archivar —> Salir del editor de edificios

2.3 Guardar como archivo mundial

Puede agregar algunos complementos como el método 1 y luego guardarlo como un archivo mundial (en el paquete de función de ruta de guardado: mundos)

inserte la descripción de la imagen aquí

2.4 inicio

de la misma manera 1

3. Usa complementos oficiales

En la actualidad, los accesorios de simulación proporcionados por Gazebo son limitados, y el soporte oficial también se puede descargar para proporcionar implementaciones de simulación más abundantes. Las implementaciones específicas son las siguientes:

3.1 Descargar la biblioteca de modelos oficial
git clone https://github.com/osrf/gazebo_models

Era: hg clone https://bitbucket.org/osrf/gazebo_modelspero ya no está disponible

NOTA: Este proceso puede llevar mucho tiempo.

3.2 Copie la biblioteca de modelos en la glorieta

Copie el contenido de la carpeta gazebo_models obtenido en /usr/share/gazebo-*/models

3.3 Aplicación

Reinicie Gazebo, seleccione insertar en la barra de menú izquierda para seleccionar e insertar accesorios relevantes

7 Aplicación integral de URDF, Gazebo y Rviz

Simule los sensores del robot a través de Gazebo y luego muestre los datos percibidos por estos sensores en Rviz. Los contenidos principales incluyen:

  • Pantalla de información de control de movimiento y odómetro
  • Simulación y visualización de información de radar
  • Simulación y visualización de la información de la cámara
  • simulación y visualización de información kinect

7.1 Control de movimiento del robot y pantalla de información del cuentakilómetros

El modelo de robot se puede mostrar normalmente en la glorieta, entonces, ¿cómo controlar el movimiento del robot como en rviz? Aquí, el componente en ros debe estar involucrado: ros_control.

1. Introducción a ros_control

**Escenario:** Cómo implementar el mismo conjunto de programas ROS en diferentes sistemas de robots, por ejemplo: en la etapa de desarrollo, para mejorar la eficiencia, se prueba en la plataforma de simulación y, cuando se implementa, existen diferentes plataformas de robots La realización de diferentes plataformas es Si hay diferencias, ¿cómo garantizar la portabilidad de los programas ROS? La solución integrada de ROS es ros_control.

**ros_control:** es un conjunto de paquetes que incluye interfaz de controlador, administrador de controlador, transporte e interfaz de hardware. ros_control es un conjunto de middleware para el control de robots, que es un conjunto de especificaciones. Siempre que se implementen diferentes plataformas de robots de acuerdo con este conjunto de especificaciones, pueden garantizar la compatibilidad con los programas ROS. A través de este conjunto de especificaciones, un diseño de arquitectura conectable se realiza, mejorando en gran medida la eficiencia y la flexibilidad del diseño del programa.

Gazebo ha implementado la interfaz relacionada de ros_control, si necesita controlar el movimiento del robot en el mirador, puede llamar directamente a la interfaz relacionada

2. Proceso de implementación de control de movimiento (Gazebo)

Heredado, el proceso básico de control de movimiento:

  1. Para el modelo de robot que se ha creado, escriba un archivo xacro separado para agregar transmisiones y controladores al modelo de robot
  2. Integrar este archivo en el archivo xacro
  3. Inicie Gazebo y emita el mensaje /cmd_vel para controlar el movimiento del robot
2.1 Agregar transmisión y controlador a la articulación

Configuración diferencial de dos ruedas

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

    <!-- 传动实现:用于连接控制器与关节 -->
    <xacro:macro name="joint_trans" params="joint_name">
        <!-- Transmission is important to link the joints and the controller -->
        <transmission name="${joint_name}_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${joint_name}">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="${joint_name}_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>

    <!-- 每一个驱动轮都需要配置传动装置 参考demo05 joint name ${name}2link    名字一定要打对,否则后续启动gazebo不会出现cmd_vel-->
    <xacro:joint_trans joint_name="left2link" />
    <xacro:joint_trans joint_name="right2link" />

    <!-- 控制器 -->
    <gazebo>
        <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
            <rosDebugLevel>Debug</rosDebugLevel>
            <publishWheelTF>true</publishWheelTF>
            <robotNamespace>/</robotNamespace>
            <publishTf>1</publishTf>
            <publishWheelJointState>true</publishWheelJointState>
            <alwaysOn>true</alwaysOn>
            <updateRate>100.0</updateRate>
            <legacyMode>true</legacyMode>
            <leftJoint>left2link</leftJoint>            <!-- 左轮 -->
            <rightJoint>right2link</rightJoint>            <!-- 右轮 -->
            <wheelSeparation>${base_radius * 2}</wheelSeparation>            <!-- 车轮间距 -->
            <wheelDiameter>${wheel_radius * 2}</wheelDiameter>            <!-- 车轮直径 -->
            <broadcastTF>1</broadcastTF>
            <wheelTorque>30</wheelTorque>
            <wheelAcceleration>1.8</wheelAcceleration>
            <commandTopic>cmd_vel</commandTopic>            <!-- 运动控制话题 -->
            <odometryFrame>odom</odometryFrame>
            <odometryTopic>odom</odometryTopic>            <!-- 里程计话题 -->
            <robotBaseFrame>base_footprint</robotBaseFrame>            <!-- 根坐标系 -->
        </plugin>
    </gazebo>

</robot>

2.2 Agregar archivo xacro
<!-- 摄像头 -->
<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
  <!-- 被引用的link -->
  <gazebo reference="camera">
    <!-- 类型设置为 camara -->
    <sensor type="camera" name="camera_node">
      <update_rate>30.0</update_rate> <!-- 更新频率 -->
      <!-- 摄像头基本信息设置 -->
      <camera name="head">
        <horizontal_fov>1.3962634</horizontal_fov>
        <image>
          <width>1280</width>
          <height>720</height>
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.02</near>
          <far>300</far>
        </clip>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.007</stddev>
        </noise>
      </camera>
      <!-- 核心插件 -->
      <plugin name="gazebo_camera" filename="libgazebo_ros_camera.so">
        <alwaysOn>true</alwaysOn>
        <updateRate>0.0</updateRate>
        <cameraName>/camera</cameraName>
        <imageTopicName>image_raw</imageTopicName>
        <cameraInfoTopicName>camera_info</cameraInfoTopicName>
        <frameName>camera</frameName>
        <hackBaseline>0.07</hackBaseline>
        <distortionK1>0.0</distortionK1>
        <distortionK2>0.0</distortionK2>
        <distortionK3>0.0</distortionK3>
        <distortionT1>0.0</distortionT1>
        <distortionT2>0.0</distortionT2>
      </plugin>
    </sensor>
  </gazebo>
</robot>

<!-- kinetic -->
<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
    <gazebo reference="suport_link">  
      <sensor type="depth" name="camera">
        <always_on>true</always_on>
        <update_rate>20.0</update_rate>
        <camera>
          <horizontal_fov>${60.0*PI/180.0}</horizontal_fov>
          <image>
            <format>R8G8B8</format>
            <width>640</width>
            <height>480</height>
          </image>
          <clip>
            <near>0.05</near>
            <far>8.0</far>
          </clip>
        </camera>
        <plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
          <cameraName>camera</cameraName>
          <alwaysOn>true</alwaysOn>
          <updateRate>10</updateRate>
          <imageTopicName>rgb/image_raw</imageTopicName>
          <depthImageTopicName>depth/image_raw</depthImageTopicName>
          <pointCloudTopicName>depth/points</pointCloudTopicName>
          <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
          <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
          <frameName>support_depth</frameName>
          <baseline>0.1</baseline>
          <distortion_k1>0.0</distortion_k1>
          <distortion_k2>0.0</distortion_k2>
          <distortion_k3>0.0</distortion_k3>
          <distortion_t1>0.0</distortion_t1>
          <distortion_t2>0.0</distortion_t2>
          <pointCloudCutoff>0.4</pointCloudCutoff>
        </plugin>
      </sensor>
    </gazebo>

</robot>


<!-- laser-->
<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">

  <!-- 雷达 -->
  <gazebo reference="laser"><!-- mingzi -->
    <sensor type="ray" name="rplidar">
      <pose>0 0 0 0 0 0</pose>
      <visualize>true</visualize>
      <update_rate>5.5</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>360</samples>
            <resolution>1</resolution>
            <min_angle>-3</min_angle>
            <max_angle>3</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.10</min>
          <max>30.0</max>
          <resolution>0.01</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
        <topicName>/scan</topicName><!-- hua ti -->
        <frameName>laser</frameName><!-- leidazuobiaoxi -->
      </plugin>
    </sensor>
  </gazebo>
</robot>


2.3 integración de archivos xacro

Finalmente, el archivo xacro anterior debe integrarse en el archivo del modelo de robot general. El ejemplo de código es el siguiente:

<!-- 组合小车底盘与摄像头 -->
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <xacro:include filename="inertia.xacro"/>

    <!-- <文件包含> -->


    <xacro:include filename="demo05_car_base.urdf.xacro"/>
    <xacro:include filename="demo06_car_camera.urdf.xacro"/>
    <xacro:include filename="demo07_car_laser.urdf.xacro"/>

    <xacro:include filename="gazebo/move.xacro"/>

    <xacro:include filename="gazebo/laser.xacro"/>
    <xacro:include filename="gazebo/camera.xacro"/>
    <xacro:include filename="gazebo/kinect.xacro"/>



</robot>

Núcleo actual: archivo xacro que contiene la configuración del controlador y la unidad

<xacro:include filename="move.xacro" />
2.4 Inicie la glorieta y controle el movimiento del robot

archivo de lanzamiento:

<launch>
    <!-- <需要在参数服务器中载入urdf> -->
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf02_gazebo)/urdf/car.urdf.xacro" />
    <!-- <启动Gazebo仿真环境> -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(find urdf02_gazebo)/worlds/box_house.world" />
    </include>
    <!-- <在Gazebo中添加机器人模型> -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
</launch>

Inicie el archivo de inicio, use la lista de temas para ver la lista de temas, encontrará que hay más /cmd_vel y luego suelte el control de mensajes vmd_vel

Use el control de comando (o puede escribir un control de nodo individual)

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

El coche funciona normalmente en Gazebo

3. Rviz ver información del odómetro

En el entorno de simulación de Gazebo, la información del odómetro del robot y la orientación del movimiento no se pueden obtener, y la información del odómetro del robot y la orientación del movimiento se pueden mostrar a través de Rviz

Odómetro: el estado de pose del robot en relación con el sistema de coordenadas del punto de partida (coordenada X, coordenada Y, coordenada Z y orientación).

3.1 Iniciar Rviz

iniciar archivo

<launch>

    <!-- 设置点云图tf变换参数 -->
    <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /suport_link /support_depth" />

    <!-- 启动 rviz -->
    <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.2 Agregar componentes

Después de ejecutar el archivo de inicio, agregue el componente de icono en Rviz:

inserte la descripción de la imagen aquí

correr:

roslaunch urdf02_gazebo demo03_env.launch 
roslaunch urdf02_gazebo demo04_sensor.launch 
rosrun teleop_twist_keyboard teleop_twist_keyboard.py _speed:=0.3 _turn:=0.5
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist "linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.3" 

Nota: El nombre debe escribirse correctamente, de lo contrario, cmd_vel no aparecerá en el inicio posterior de la glorieta

8. Resumen de este capítulo

URDF es un archivo xml que se usa para describir el modelo de robot. Se pueden usar diferentes etiquetas para representar diferentes significados. URDF escribe la redundancia del código del modelo de robot. Xacro puede optimizar la implementación de URDF, y la implementación del código es más ágil, eficiente y fácil de leer. Es fácil confundir Rviz y Gazebo, aquí nos enfocamos en las diferencias entre los dos siguientes:

rviz es una herramienta de visualización 3D , que enfatiza la visualización de datos existentes;

Gazebo es una plataforma de simulación física en 3D , con énfasis en la creación de un entorno de simulación virtual.

rviz requiere datos existentes .

rviz proporciona muchos complementos, estos complementos pueden mostrar información como imágenes, modelos, rutas, etc., pero la premisa es que estos datos se han publicado en forma de temas y parámetros. Lo que hace rviz es suscríbase a estos datos y complete la representación visual, para que el desarrollo sea más fácil para el lector comprender el significado de los datos.

Gazebo no es una herramienta de visualización, enfatiza la simulación, no necesita datos, pero crea datos .

Podemos crear un mundo de robots en la glorieta de forma gratuita, que no solo puede simular la función de movimiento del robot, sino también simular los datos del sensor del robot. Y estos datos se pueden mostrar en rviz, por lo que cuando se usa un cenador, a menudo se usa junto con rviz. Cuando no disponemos de hardware de robot o el entorno experimental es difícil de construir, la simulación suele ser una herramienta muy útil.

En resumen, si ya tiene una plataforma de hardware de robot y puede completar las funciones requeridas en ella, el uso de rviz debería poder satisfacer las necesidades de desarrollo.

Si no tiene hardware de robot, o desea realizar algunas pruebas de algoritmos y aplicaciones en un entorno de simulación, Gazebo+rviz debería ser lo que necesita.

Además, rviz también puede crear un entorno de simulación simple con otros paquetes de funciones, como rviz+ArbotiX.

Supongo que te gusta

Origin blog.csdn.net/TianHW103/article/details/128191905
Recomendado
Clasificación