Cómo agregar el método del modelo de suspensión en Gazebo / cómo el modelo en Gazebo no se cae por la gravedad: modificar los modelos sdf y urdf

Tabla de contenido

1. Descripción del problema:

2. Solución:

2.1 modelo SDF:

2.2 modelo URDF:

2.3 Probar agregar modelo

 3. Agregue el modelo en Gazebo a través del programa Python


1. Descripción del problema:

Al usar ros para realizar experimentos de simulación, a veces es necesario agregar un archivo de modelo en el espacio para que flote en una determinada coordenada en el espacio, pero a menudo el modelo caerá directamente al suelo debido a la gravedad.

2. Solución:

Modifique el archivo del modelo para deshabilitar la etiqueta de gravedad

2.1 modelo SDF:

Encuentre el directorio de archivos de su modelo, si su archivo de modelo está en formato .sdf, busque la etiqueta de gravedad <gravedad> parte del código del modelo

 <gravity>1</gravity>

Cambia el número 1 a 0 para deshabilitar la gravedad

<gravity>0</gravity> <!-- 禁用重力 -->

Esto evitará que Gazebo aplique gravedad al modelo, haciéndolo levitar en el aire. Otras propiedades como la inercia y la colisión permanecen sin cambios, solo modifique <gravity>la etiqueta. Después de guardar el archivo, vuelve a cargar el modelo en Gazebo y quedará suspendido en el aire sin verse afectado por la gravedad.

Después de guardar el archivo y volver a agregar el modelo en Gazebo, se puede suspender en el aire;

2.2 modelo URDF:

Encuentre el directorio de archivos de su modelo, si su archivo de modelo está en formato .urdf, para hacer que el modelo quede suspendido en el aire sin verse afectado por la gravedad, puede establecer la propiedad de inercia del modelo en cero de manera apropiada.

En los archivos URDF, el atributo de inercia <inertial>se puede configurar en cada elemento de enlace (link). Asegúrese de establecer la propiedad de inercia en un valor cero apropiado en el enlace que desea flotar

Un ejemplo es el siguiente:

<link name="floating_link">
  <inertial>
    <mass value="0.0"/>
    <!-- Set all inertia values to zero -->
    <inertia ixx="0.0" ixy="0.0" ixz="0.0" iyy="0.0" iyz="0.0" izz="0.0"/>
  </inertial>
  <!-- Other visual, collision, and other elements -->
</link>

Al establecer el valor de masa en 0 y establecer todos los valores de inercia en 0, puede hacer que el enlace flote en el aire y no se vea afectado por la gravedad. Cabe señalar que si el enlace está conectado a otros enlaces, es posible que también deba verificar las propiedades de sus enlaces principales o secundarios para asegurarse de que todo el modelo cumpla con sus requisitos.

Asimismo, puede realizar algunos ajustes según sea necesario para lograr el equilibrio adecuado para su modelo. Después de realizar modificaciones, vuelva a cargar el archivo URDF en ROS y Gazebo, y su modelo debería estar suspendido en el aire sin verse afectado por la gravedad.

2.3 Probar agregar modelo

Use el programa para agregar el modelo en las coordenadas (1, 1, 1), puede ver que se puede suspender en este sistema de coordenadas

 3. Agregue el modelo en Gazebo a través del programa Python

Una cosa a tener en cuenta aquí es que después de que se deshabilita la etiqueta de gravedad del archivo del modelo, el modelo se encuentra en un estado de gravedad cero. Imagine el estado de un astronauta en una estación espacial, y combinado con el conocimiento de física de la escuela secundaria, siempre que hay una velocidad inicial, llevará a cabo Se mueve en línea recta a una velocidad constante y es difícil de detener.

Entonces, si agrega el modelo directamente con el mouse, existe una alta probabilidad de que haya una velocidad inicial ascendente. En este momento, se recomienda usar comandos de script adicionales para agregar el modelo. Aquí uso el programa Python

# -*- coding: utf-8 -*-
#!/usr/bin/env python

import os
import rospy
from gazebo_msgs.msg import ModelState
from gazebo_msgs.srv import DeleteModel, SpawnModel
from std_msgs.msg import Header
from geometry_msgs.msg import Pose, Point

# 初始化ROS节点
rospy.init_node('spawn_aruco_cubo_hover', anonymous=True)

# 定义生成模型的函数
def spawn_aruco_cubo_hover():
    model_name = "aruco_cubo_hover"
    model_path = "/home/sjh/project/Tiago_ws/src/pal_gazebo_worlds/models/aruco_cube_hover/aruco_cube_hover.sdf"
    initial_pose = Pose(position=Point(x=1, y=1, z=1))

    # 从文件加载模型
    with open(model_path, "r") as f:
        model_xml = f.read()

    # 调用Gazebo的SpawnModel服务
    spawn_model = rospy.ServiceProxy('/gazebo/spawn_sdf_model', SpawnModel)
    resp_sdf = spawn_model(model_name, model_xml, "", initial_pose, "world")

    if resp_sdf.success:
        rospy.loginfo("模型 '{}' 生成成功。".format(model_name))
    else:
        rospy.logerr("模型 '{}' 生成失败。".format(model_name))

# 调用生成模型的函数
if __name__ == '__main__':
    try:
        spawn_aruco_cubo_hover()
    except rospy.ROSInterruptException:
        pass

Al usar el programa, preste atención para modificar la ruta del modelo y las coordenadas especificadas en la función spawn_aruco_cubo_hover a lo que necesita

def spawn_aruco_cubo_hover():
    model_name = "你的模型的名称"
    model_path = "你的模型的路径"
    initial_pose = Pose(position=Point(x=1, y=1, z=1)) # xyz值就是指定坐标位置

Supongo que te gusta

Origin blog.csdn.net/weixin_45498383/article/details/132100415
Recomendado
Clasificación