Serie ROS: Capítulo 4 (2)

4. Gestión de operaciones de ROS

Este capítulo es principalmente para resolver el sistema ROS profundo multinivel, asociando diferentes paquetes de funciones, iniciando una gran cantidad de nodos ROS, paquetes de funciones, nodos, temas, duplicación de parámetros y problemas de comunicación entre nodos en diferentes hosts;

  • Domine la sintaxis de uso de los paquetes de metafunciones;
  • Domine la sintaxis de uso de los archivos de lanzamiento;
  • Comprender qué es la cobertura del espacio de trabajo de ROS y qué riesgos de seguridad existen;
  • Domine el método de procesamiento cuando se duplica el nombre del nodo;
  • Domina el método de manejo cuando el nombre del tema está duplicado;
  • Domine el método de procesamiento cuando se duplica el nombre del parámetro;
  • Puede realizar comunicación distribuida ROS.

1. Paquete de funciones meta de ROS

Metapackage es un concepto de sistema de gestión de archivos de Linux. Es un paquete virtual en ROS, que no tiene contenido sustantivo, sino que depende de otros paquetes de software, de esta manera se pueden combinar otros paquetes.

efecto:

El paquete de metafunciones depende de algunos otros paquetes de funciones en ROS, y otras dependencias se instalarán al instalar este paquete;

Proceso de implementación:

  1. Haga clic con el botón derecho en src y seleccione Crear paquete Catkin;
  2. Ingrese el nombre del paquete de funciones plumbing_my, agregue un paquete de funciones que no dependa de la dependencia del paquete de funciones y agregue el paquete de dependencia en package.xml después de presionar Enter:

<exec_depend>plomería_pub_sub</exec_depend>
<exec_depend>plomería_servidor_cliente</exec_depend>
<exec_depend>plomería_param_servidor</exec_depend>

Agregar solicitud de paquete de características meta:

<export>
 <!-- Other tools can request additional information be placed here -->
 <metapackage/>
</export>
  1. Modifique CMakeLists.txt, el contenido es el siguiente:

    cmake_minimum_required(VERSION 3.0.2)
    project(demo)
    find_package(catkin REQUIRED)
    catkin_metapackage()
    

    Nota: La última línea en CMakeLists.txt no puede tener una nueva línea, y solo hay cuatro líneas de código, y la segunda línea es el nombre del paquete de funciones.

    Solo compila y ejecuta;

2. El nodo ROS ejecuta y administra los archivos de lanzamiento

El archivo de lanzamiento es un archivo en formato XML, que puede iniciar múltiples nodos locales y remotos, y también puede establecer parámetros en el servidor de parámetros;
función:

Simplifique la configuración y el inicio de nodos y mejore la eficiencia de inicio de los programas ROS

Uso:
Tome la pequeña tortuga como ejemplo:

  1. Cree un nuevo archivo de inicio
    Agregue un directorio de inicio en el paquete de funciones, cree un nuevo archivo xxxx.launch en el directorio y edite el archivo de inicio:
<launch>
    <node pkg="turtlesim" type="turtlesim_node"     name="myTurtle" output="screen" />
    <node pkg="turtlesim" type="turtle_teleop_key"  name="myTurtleContro" output="screen" />
</launch>
  1. archivo de inicio de llamada
roslaunch 包名 xxx.launch

**Nota: ** Cuando el comando roslaunch ejecuta el archivo de inicio, determinará automáticamente si hay roscore y, de no ser así, llame a roscore; ctrl+shift+~ para iniciar rápidamente la terminal

2.1 archivo de lanzamiento: etiqueta de lanzamiento

La etiqueta es la etiqueta raíz de todos los archivos de inicio y actúa como contenedor para otras etiquetas.

Atributos:

deprecated = "Declaración en desuso"

efecto:

Informar al usuario que el archivo de inicio actual está obsoleto y no se ejecutará

Etiquetas de subconjunto:

Todas las demás etiquetas son hijos de lanzamiento.

Ejemplo de código:

<launch deprecated = "当前版本已经过时,请停止使用!">
    <node pkg="turtlesim" type="turtlesim_node"     name="myTurtle" output="screen" />
    <node pkg="turtlesim" type="turtle_teleop_key"  name="myTurtleContro" output="screen" />
</launch>

2.2 archivo de lanzamiento: etiqueta de nodo

La etiqueta se utiliza para especificar el nodo ROS, que es la etiqueta más común. Cabe señalar que: el comando roslaunch no puede garantizar iniciar el nodo en el orden de declaración del nodo (el inicio del nodo es multiproceso )

Atributos:

Atributos Función
pkg="nombre del paquete" el paquete al que pertenece el nodo
tipo = "tipo de nodo" Tipo de nodo (ejecutable con el mismo nombre)
nombre = "Nombre de nodo" NodeName (el nombre del nodo en la topología de red ROS)
argumentos="xxx xxx xxx" (opcional) Pasar parámetros al nodo
máquina = "nombre de la máquina" Inicie el nodo en la máquina especificada
respawn="verdadero|falso" (opcional) Si reiniciar automáticamente si el nodo sale
respawn_delay="N" (opcional) Si la reaparición es verdadera, inicie el nodo después de un retraso de N segundos
requerido="verdadero|falso" (opcional) Si el nodo debe, si es cierto, entonces si el nodo sale, todo el roslaunch se eliminará
ns="xxx" (opcional) Inicie el nodo en el espacio de nombres especificado xxx
clear_params="verdadero|falso" (opcional) Antes de comenzar, borre todos los parámetros del espacio privado del nodo
salida="registro|pantalla" (opcional) El objetivo de envío de registro, se puede configurar para registrar el archivo de registro o la pantalla de pantalla, el valor predeterminado es registro

Etiquetas de subconjunto:

  • configuración de variables de entorno env
  • reasignar reasigna nombres de nodos
  • configuración de parámetros de rosparam
  • configuración de parámetros

Ejemplo de código:

<?xml version="1.0"?>
<launch>
<!-- <launch deprecated="此文件已经过时,不建议使用!"> -->

    <!-- 启动的节点 -->
    <!-- respawn="true" 节点关闭后自动重启 -->
    <!-- respawn_delay="10" 在respawn设置为true后可以通过delay延时自动启动节点  -->
    <!-- required="true"  节点退出后关闭整个roslaunch -->
    <!-- 当上述三个在一行时,可能会出现错误提示The traceback for the exception was written to the log file -->
    <!-- ns="hello"可以在指定命名空间启动节点  避免重名问题 -->
    <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen" />

    <!-- 键盘控制节点 -->
    <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>


</launch>

2.3archivo de lanzamiento: incluir etiqueta

Atributos:

  • file="$(buscar el nombre del paquete)/xxx/xxx.launch"

    rutas de archivo para incluir

  • ns="xxx" (opcional)

    Importar archivos en el espacio de nombres especificado

efecto:

Se utiliza para importar archivos de lanzamiento en otros formatos xml al archivo actual

Etiquetas de subconjunto:

  • configuración de variables de entorno env
  • arg para pasar argumentos al archivo incluido

Ejemplo de código:

<launch>
    <!-- 包含文件路径   $(find 功能包名)/xxx/yyy.launch   -->
    <include file="$(find launch01_basic)/launch/start_turtle.launch"/>
</launch>

2.4archivo de lanzamiento: etiqueta de reasignación

Atributos:

  • file="$(buscar el nombre del paquete)/xxx/xxx.launch"

    rutas de archivo para incluir

  • ns="xxx" (opcional)

    Importar archivos en el espacio de nombres especificado

efecto:

para cambiar el nombre del tema

Etiquetas de subconjunto:

  • ninguno

Ejemplo de código:

<?xml version="1.0"?>
<launch>
<!-- <launch deprecated="此文件已经过时,不建议使用!"> -->

    <!-- 启动的节点 -->
    <!-- respawn="true" 节点关闭后自动重启 -->
    <!-- respawn_delay="10" 在respawn设置为true后可以通过delay延时自动启动节点  -->
    <!-- required="true"  节点退出后关闭整个roslaunch -->
    <!-- 当上述三个在一起时,会出现错误提示The traceback for the exception was written to the log file -->
    <!-- ns="hello"可以在指定命名空间启动节点  避免重名问题 -->
    <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen" >
        <remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
    </node>
    <!-- 键盘控制节点 -->
    <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>   
</launch>

Función de implementación de código:

El nombre del tema enviado por el nodo de control del teclado incorporado de ros es /cmd_vel, y la interfaz gráfica de usuario de la tortuga se suscribe a /turtle1/cmd_vel. Debido a que los nombres de los temas son inconsistentes, no es posible usar directamente el nodo de control del teclado para controlar la tortuga. gui, por lo que el nodo que genera la tortuga gui debe ser La etiqueta redefine el nombre del tema, es decir, /turtle1/cmd_vel se cambia a /cmd_vel"; puede usar rostopic list para ver la lista de comunicación del tema actual.

Use rqt_graph para obtener la comunicación del tema actual más claramente

2.5archivo de lanzamiento: etiqueta de parámetro

Atributos:

  • name="espacio de nombres/nombre del parámetro"

    El nombre del parámetro, que puede contener un espacio de nombres.

  • valor="xxx" (opcional)

    Defina el valor del parámetro; si se omite aquí, debe especificar un archivo externo como origen del parámetro

  • type="str|int|doble|bool|yaml" (opcional)

    Especifique el tipo de parámetro, si no se especifica, roslaunch intentará determinar el tipo de parámetro, las reglas son las siguientes:

    • Si el número que contiene '.' no se analiza como un tipo de punto flotante, de lo contrario, es un tipo entero
    • "verdadero" y "falso" son valores booleanos (sin distinción entre mayúsculas y minúsculas)
    • otra cosa es una cadena

efecto:

Aplicado a la configuración de parámetros en el servidor de parámetros, la fuente del parámetro se puede definir con un valor en la etiqueta, o también se puede cargar desde un archivo externo. Cuando está en la etiqueta del nodo, es equivalente a un espacio de nombres privado.

Etiquetas de subconjunto:

  • ninguno

Ejemplo de código:

<?xml version="1.0"?>
<launch>
<!-- <launch deprecated="此文件已经过时,不建议使用!"> -->

    <!-- 启动的节点 -->
    <!-- respawn="true" 节点关闭后自动重启 -->
    <!-- respawn_delay="10" 在respawn设置为true后可以通过delay延时自动启动节点  -->
    <!-- required="true"  节点退出后关闭整个roslaunch -->
    <!-- 当上述三个在一起时,会出现错误提示The traceback for the exception was written to the log file -->
    <!-- ns="hello"可以在指定命名空间启动节点  避免重名问题 -->
    <!-- param标签 使用:向参数服务器设置参数 -->
    <!-- param标签格式1 会在参数前私有命名,node节点名称 -->
    <param name="param_A"  type="int" value="100"/>
    <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen" >
        <remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
        <!-- param标签格式2 launch目录下,node标签外 -->
        <param name="param_B" type="double" value="3.14"/>
    </node>
    <!-- 键盘控制节点 -->
    <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>   
</launch>

Función de implementación de código:

Establezca los parámetros en el parámetro param, puede verlo en la lista de rosparam y obtener los parámetros a través de rosparam get /xxx

2.6archivo de lanzamiento: etiqueta rosparam

Atributos:

  • command="load | dump | delete" (opcional, carga predeterminada)

    Cargar, exportar o eliminar parámetros

  • archivo = “$ (buscar xxxxx)/xxx/yyy…”

    archivo yaml para cargar o exportar

  • param="nombre del parámetro"

  • ns="espacio de nombres" (opcional)

efecto:

Importe parámetros de archivos yaml o exporte parámetros a archivos yaml, y también se puede usar para eliminar parámetros. Si se define bajo la etiqueta de nodo, se considerará privado

Etiquetas de subconjunto:

  • ninguno

Ejemplo de código:

inicio_tortuga.lanzamiento

<?xml version="1.0"?>
<launch>
    <!-- <launch deprecated="此文件已经过时,不建议使用!"> -->

    <!-- 启动的节点 -->
    <!-- respawn="true" 节点关闭后自动重启 -->
    <!-- respawn_delay="10" 在respawn设置为true后可以通过delay延时自动启动节点  -->
    <!-- required="true"  节点退出后关闭整个roslaunch -->
    <!-- 当上述三个在一起时,会出现错误提示The traceback for the exception was written to the log file -->
    <!-- ns="hello"可以在指定命名空间启动节点  避免重名问题 -->
    <!-- param标签 使用:向参数服务器设置参数 -->
    <!-- param标签格式1 launch目录下,node标签外 -->
    <param name="param_A" type="int" value="100"/>
    <!-- rosparam 使用:操作参数服务器数据 -->
    <!-- rosparam格式1: launch 下,node 外 -->
    <!-- 加载参数 -->
    <rosparam command="load" file="$(find launch01_basic)/launch/params.yaml"/>

    <!-- 导出参数 -->
    <!-- <rosparam command="dump" file="$(find launch01_basic)/launch/params_out.yaml"/> -->

    
    <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen">
        <remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
        <!-- param标签格式2 node标签内  会在参数前私有命名,node节点名称-->
        <param name="param_B" type="double" value="3.14"/>
        <!--rosparam格式2: node 内 -->
        <rosparam command="load" file="$(find launch01_basic)/launch/params.yaml"/>

    </node>
    <!-- 键盘控制节点 -->
    <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>
</launch>

volcado.lanzamiento

<?xml version="1.0"?>
<launch>
    <rosparam command="dump" file="$(find launch01_basic)/launch/params_out.yaml"/>
    <!-- 删除参数 -->
    <rosparam command="delete" param="bg_B"/> 
</launch>

Función de implementación de código:

Use el comando rosparam para establecer los parámetros en el parámetro param, puede verlo en la lista de rosparam y obtener los parámetros a través de rosparam get /xxx

Aviso:

1. Al configurar los tres colores primarios en el archivo yaml, se debe agregar un espacio después de los dos puntos; de lo contrario, se informará un error.

2. rosparam tiene prioridad, y rosparam se ejecutará primero, por lo que si los datos de exportación no son el parámetro de destino, puede configurar otro archivo de inicio para exportar el archivo yaml

2.7archivo de lanzamiento: etiqueta de grupo (grupo)

Atributos:

  • ns="espacio de nombres" (opcional)

  • clear_params="verdadero|falso" (opcional)

    Antes de comenzar, si desea eliminar todos los parámetros del espacio de nombres del grupo (usar con precaución... esta función es peligrosa)

efecto:

Los nodos se pueden agrupar, con el atributo ns, lo que permite que los nodos pertenezcan a un espacio de nombres

Etiquetas de subconjunto:

  • etiquetas que no sean la etiqueta de lanzamiento

Ejemplo de código:

tortugas.lanzamiento

<?xml version="1.0"?>
<launch>

    <!-- 同时启动两队乌龟GUI以及键盘控制节点 -->
    <group ns="first">
        <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen"/>
        <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>
    </group>
    <group ns="second">
        <node name="my_turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen"/>
        <node name="my_key" pkg="turtlesim" type="turtle_teleop_key" output="screen"/>
    </group>
</launch>

Función de implementación de código:

Después de agrupar, aunque las dos GUI tengan el mismo nombre, no ocurrirá que la iniciada más tarde detenga el programa anterior, pudiendo iniciarse al mismo tiempo

2.8archivo de lanzamiento—etiqueta arg

Atributos:

  • name="nombre del parámetro"

  • default="valor predeterminado" (opcional)

  • valor="valor" (opcional)

    No puede coexistir con el predeterminado

  • doc="descripción"

    Descripción de parámetros

efecto:

Se utiliza para el paso de parámetros dinámicos, similar a los parámetros de función, que pueden mejorar la flexibilidad de los archivos de inicio

Etiquetas de subconjunto:

  • ninguno

Ejemplo de código:

tortugas.lanzamiento

<?xml version="1.0"?>
<launch>

    <!-- 演示arg的使用,需要设置多个参数,参数使用的是同一个值(小车长度) -->
    <!-- <param name="A" value="0.5"/>
    <param name="B" value="0.5"/>
    <param name="C" value="0.5"/> -->

    <arg name="car_length" default="0.55"/>
    
    <param name="A" value="$(arg car_length)"/>
    <param name="B" value="$(arg car_length)"/>
    <param name="C" value="$(arg car_length)"/>
</launch>

Función de implementación de código:

Similar a declarar una variable global y asignar un valor, puede cambiar directamente el valor de la variable más tarde, ahorrándose el esfuerzo de modificar línea por línea.

Función de paso de parámetros dinámicos:

roslaunch launch01_basic arg.launch car_length:=0.6

Supongo que te gusta

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