es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo establecer una variable de tipo int en XML?

Estoy trabajando en un archivo SDF escrito en XML que se utiliza para describir un brazo robótico. Hay muchas partes repetidas en el robot y estoy tratando de declarar una variable de tipo int y reutilizarla en diferentes partes del código. Sin embargo, parece que no puedo hacer que el código funcione correctamente en un simulador.

Este es un fragmento de mi código (he omitido algunas partes no relacionadas del código):

<?xml version='1.0'?>
<sdf version='1.7'>

<!DOCTYPE model [<!ENTITY basesize "1 1 0.1">]>

  <model name='working_arm'>
    <link name='base'>
      <visual name='base_visual'>
        <pose>0 0 0.05 0 -0 0</pose>
        <geometry>
          <box>
            <size>&basesize;</size>
          </box>
        </geometry>
      </visual>

  </model>
</sdf>

Creo que esto falla porque las entidades solo se pueden declarar como cadenas y el tamaño no acepta cadenas. Sin embargo, no puedo encontrar ninguna documentación sobre cómo especificar que la entidad declarada sea un número entero.

Reemplazar &basesize; con esta entrada manual funciona, por lo que sé que no es un problema con otras partes del código:

<size>1 1 0.1</size>

Editar:
¿Algo así? Porque todavía no parece funcionar.

<?xml version='1.0'?>

<!DOCTYPE sdf [<!ENTITY basesize "1 1 0.1">]>    
<sdf version='1.7'>
  <model name='working_arm'>
    <link name='base'>
      <visual name='base_visual'>
        <pose>0 0 0.05 0 -0 0</pose>
        <geometry>
          <box>
            <size>&basesize;</size>
          </box>
        </geometry>
      </visual>

  </model>
</sdf>
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una solución podría ser usar elementos de parámetros en lugar de entidades. Los parámetros pueden declararse como enteros y reutilizarse en todo el archivo SDF. Aquí tienes un ejemplo:

    <?xml version='1.0'?>
    
    <sdf version='1.7'>
      <model name='working_arm'>
        <link name='base'>
          <visual name='base_visual'>
            <pose>0 0 0.05 0 -0 0</pose>
            <geometry>
              <box>
                <size>
                  <x>$(basesize_x)</x>
                  <y>$(basesize_y)</y>
                  <z>$(basesize_z)</z>
                </size>
              </box>
            </geometry>
          </visual>
    
      </model>
    
      <world name="test_world">
        <include>
          <uri>model://working_arm</uri>
          <pose>0 0 1 0 0 0</pose>
          <plugin name="parameters" filename="libparameters.so"></plugin>
          <static>true</static>
          <param name="basesize_x" type="int" value="1">
          <param name="basesize_y" type="int" value="1">
          <param name="basesize_z" type="double" value="0.1">
        </include>
      </world>
    </sdf>
    

    Aquí, usamos la sintaxis $(param_name) para acceder a los valores de los parámetros. En el ejemplo de arriba, declaramos tres parámetros llamados basesize_x, basesize_y y basesize_z de tipos enteros y dobles, respectivamente. Luego podemos acceder a los valores de estos parámetros en el archivo SDF como $(basesize_x), $(basesize_y) y $(basesize_z), respectivamente.

    También incluimos el complemento Parameters, que nos permite establecer los valores de los parámetros cuando lanzamos el simulador. Por ejemplo, si estamos utilizando Gazebo, podemos iniciar la simulación con:

    gazebo --verbose /ruta/al/archivo.sdf --verbose -s libparameters.so --param basesize_x:=2
    

    Esto establece el valor de basesize_x en 2 cuando lanzamos el simulador. Podemos establecer los valores de los otros parámetros de manera similar.

Comments are closed.