Serie ROS: Capítulo 4 (4)

Directorio de artículos

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 la agrupación, aunque las dos GUI tengan el mismo nombre, no ocurrirá que la iniciada más tarde detenga el programa anterior.

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

3. Problema de cobertura del espacio de trabajo de ROS

Intente evitar el problema de la cobertura del espacio de trabajo de ROS

**Descripción del problema: **En diferentes espacios de trabajo, puede haber casos en los que el paquete de funciones tenga el mismo nombre. En este momento, si se llama al paquete de funciones con este nombre, se puede llamar al paquete de funciones de ruta incorrecta y puede haber confusión. ocurrir al llamar;

Análisis del motivo : ROS analizará el archivo .bashrc de la carpeta oculta y generará la ruta del paquete ROS. La información de la ruta organizará la prioridad de la ruta de acuerdo con el orden del espacio de trabajo configurado en .bashrc, es decir, la última configuración tiene la prioridad más alta, y cuanto mayor sea la prioridad Cuanto menor sea el valor, la prioridad de la ruta actual se puede ver a través del comando echo.La prioridad más alta en el frente se usará primero cuando se llame al programa. El código de ejemplo es el siguiente:

echo $ROS_PACKAGE_PATH 

**Conclusión:** Cuando el paquete de funciones tenga el mismo nombre, habrá una prioridad de llamada, es decir, la última configuración se ejecutará primero, y puede verla a través de ROS_PACKAGE_PATH

Descripción del ERROR:

Cuando se obtienen varios espacios de trabajo en el archivo .bashrc, puede suceder que solo se incluyan dos espacios de trabajo en la RUTA DEL PAQUETE ROS, puede eliminar los directorios de compilación y desarrollo del espacio de trabajo personalizado, re-catkin_make y luego volver a cargar el archivo .bashrc, problema resuelto

4. Nombre de nodo ROS duplicado

Cuando necesite iniciar un nodo con el mismo nombre o iniciar el mismo nodo varias veces, debe prestar atención al problema de la duplicación de nombres de nodos de ROS.

**Concepto:**El espacio de nombres es para agregar un prefijo al nombre, y la reasignación de nombres es para alias del nombre. Ambas estrategias pueden resolver el problema del nombre duplicado del nodo, y hay muchas maneras de implementar las dos estrategias:

  • comando rosrun
  • iniciar archivo
  • Implementación de codificación

Los tres métodos anteriores pueden evitar nombres de nodos duplicados a través del espacio de nombres o la reasignación de nombres. Esta sección demostrará el uso de los tres uno por uno. Los requisitos que deben cumplir los tres son similares.

4.1rosrun configuración de espacio de nombres y reasignación

4.1.1 espacio de nombres del conjunto rosrun

Sintaxis: rosrun nombre del paquete nombre del nodo __ns:= nuevo nombre

Ejemplo de código:

rosrun turtlesim turtlesim_node __ns:=ergouzi
rosrun turtlesim turtlesim_node __ns:=dagouzi

Ambos nodos están en funcionamiento;

4.1.2 reasignación de nombres de rosrun

Sintaxis: rosrun nombre del paquete nombre del nodo __nombre:= nuevo nombre

Ejemplo de código:

rosrun turtlesim  turtlesim_node __name:=daqiang
rosrun turtlesim  turtlesim_node __name:=xiaoqiang

Ambos nodos están en funcionamiento;

4.1.3 Espacio de nombres rosrun y uso superpuesto de reasignación de nombres

语法: rosrun 包名 节点名 __ns:=新名称 __name:=新名称

Ejemplo de código:

rosrun turtlesim  turtlesim_node __ns:=ergouzi __name:=daqiang 
rosrun turtlesim  turtlesim_node __ns:=dagouzi __name:=xiaoqiang

Ambos nodos están en funcionamiento;

甚至可以直接用  rosrun turtlesim  turtlesim_node /turtlesim_node:=daqiang  即/节点名称:=新名称

4.2 Espacio de nombres de configuración de archivo de lanzamiento y reasignación

Cuando se usa la sintaxis del archivo de inicio, hay dos atributos en la etiqueta del nodo: nombre y ns, que se usan para implementar la reasignación de nombres y la configuración del espacio de nombres, respectivamente. También es relativamente simple configurar espacios de nombres y reasignar nombres usando archivos de inicio.

archivo de lanzamiento:

<?xml version="1.0"?>
<launch>
    <node name="turtlesim" pkg="turtlesim" type="turtlesim_node" output="screen"/>
    <!-- 名称重映射 -->
    <node name="t1" pkg="turtlesim" type="turtlesim_node" output="screen"/>
    <!-- 命名空间 -->
    <node name="turtlesim" ns="ergouzi" pkg="turtlesim" type="turtlesim_node" output="screen"/> 
    <!-- 命名空间 + 名称重映射 -->
    <node name="t2" ns="dagouzi" pkg="turtlesim" type="turtlesim_node" output="screen"/> 
</launch>

En la etiqueta de nodo del archivo de inicio, debe existir el atributo de nombre y el espacio de nombres ns es opcional;

resultado de la operación:

rosnode list
/dagouzi/t2
/ergouzi/turtlesim
/rosout
/t1
/turtlesim

También se puede ver desde aquí que la llamada de la etiqueta del nodo no se ejecuta estrictamente en el orden de programación, puede ser en el orden inverso de la llamada;

4.3 Espacio de nombres de configuración de codificación y reasignación

Si personaliza la implementación del nodo, puede implementar de forma más flexible la configuración de espacios de nombres y la reasignación de nombres;

4.3.1 Implementación de C++: reasignación

4.3.1.1 Configuración de alias de nombre

Código central:ros::init(argc,argv,"zhangsan",ros::init_options::AnonymousName);

4.3.1.2 Ejecución

Se adjunta una marca de tiempo al nombre.

4.3.2 Implementación de C++: espacios de nombres

4.3.2.1 Configuración del espacio de nombres

código central

  std::map<std::string, std::string> map;
  map["__ns"] = "xxxx";
  ros::init(map,"wangqiang");
Copy
4.3.2.2 Efecto de ejecución

El nombre del nodo establece el espacio de nombres.

En la etiqueta del nodo, el atributo de nombre debe existir y el espacio de nombres ns es opcional;

resultado de la operación:

rosnode list
/dagouzi/t2
/ergouzi/turtlesim
/rosout
/t1
/turtlesim

También se puede ver desde aquí que la llamada de la etiqueta del nodo no se ejecuta estrictamente en el orden de programación, puede ser en el orden inverso de la llamada;

4.3 Espacio de nombres de configuración de codificación y reasignación

Si personaliza la implementación del nodo, puede implementar de forma más flexible la configuración de espacios de nombres y la reasignación de nombres;

4.3.1 Implementación de C++: reasignación

4.3.1.1 Configuración de alias de nombre

Código central:ros::init(argc,argv,"zhangsan",ros::init_options::AnonymousName);

4.3.1.2 Ejecución

Se adjunta una marca de tiempo al nombre.

4.3.2 Implementación de C++: espacios de nombres

4.3.2.1 Configuración del espacio de nombres

código central

  std::map<std::string, std::string> map;
  map["__ns"] = "xxxx";
  ros::init(map,"wangqiang");
Copy
4.3.2.2 Efecto de ejecución

El nombre del nodo establece el espacio de nombres.

5. Configuración del nombre del tema ROS

En ROS, el nombre del tema puede tener el mismo nombre, cuando el mensaje suscrito tiene el mismo nombre, puede haber un problema cuando el suscriptor recibe un mensaje innecesario, lo que hará que el nodo funcione de manera anormal, o desea que los dos no comunicar Los nodos se comunican sobre el tema, por lo que es necesario modificar el tema para que sea el mismo.

Según los diferentes prefijos, hay tres tipos: global, relativo y privado.

  • Global (el nombre del parámetro se refiere directamente al sistema ROS, que está al mismo nivel que el espacio de nombres del nodo)
  • Relativo (el nombre del parámetro hace referencia al espacio de nombres del nodo, que está al mismo nivel que el nombre del nodo)
  • privado (el nombre del parámetro hace referencia al nombre del nodo y es un elemento secundario del nombre del nodo)

La reasignación de nombres consiste en crear un alias para el nombre y agregar un prefijo al nombre. Esta implementación es más complicada que el cambio de nombre del nodo. No solo usa el espacio de nombres como prefijo, sino que también usa el nombre del nodo como prefijo. Hay varias formas de implementar las dos estrategias:

  • comando rosrun
  • iniciar archivo
  • Implementación de codificación

Esta sección demostrará el uso de los tres uno por uno, y los requisitos que deben cumplir los tres son similares.

caso:

Use el paquete de funciones ros-noetic-teleop-twist-keyboard para controlar la GUI de visualización de tortugas

5.1 reasignación de tema de configuración de rosrun

**Sintaxis: **sintaxis de reasignación de nombre de rosrun: nombre de paquete de rorun nombre de nodo nombre de tema: = nuevo nombre de tema

5.1.1 Solución 1: Modifique el nodo de control del teclado para publicar el nombre del tema

Establezca el tema del nodo teleop_twist_keyboard en/turtle1/cmd_vel

Inicie el nodo de control del teclado:rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/turtle1/cmd_vel

Inicie el nodo de visualización de tortuga:rosrun turtlesim turtlesim_node

Los dos pueden lograr una comunicación normal.

5.1.2 Solución 2: Modifique el nombre del tema de suscripción del nodo de la GUI de la tortuga

Establezca el tema del nodo de visualización de la tortuga en/cmd_vel

Inicie el nodo de control del teclado:rosrun teleop_twist_keyboard teleop_twist_keyboard.py

Inicie el nodo de visualización de tortuga:rosrun turtlesim turtlesim_node /turtle1/cmd_vel:=/cmd_vel

Los dos pueden lograr una comunicación normal.

5.2 reasignación de tema de configuración de archivo de inicio

** Sintaxis: ** Usar etiqueta de reasignación

<node pkg="xxx" type="xxx" name="xxx">
    <remap from="原话题" to="新话题" />
</node>
5.2.1 Solución 1: establezca el tema del nodo teleop_twist_keyboard en/turtle1/cmd_vel
<?xml version="1.0"?>
<!-- 执行键盘功能包直接控制小乌龟 -->
<launch>
    <!-- 将乌龟的话题设置与键盘控制一致 -->
    <node name="my_turtle" pkg="turtlesim" type="turtlesim_node" >
       
    </node>

    <!-- 将乌龟的话题设置与键盘控制一致 -->
    <node name="key" pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py">
        <remap from="/cmd_vel" to="/turtle1/cmd_vel"/>
    </node>
</launch>

Los dos pueden lograr una comunicación normal.

5.2.2 Solución 2: establezca el tema del nodo de visualización de tortugas en/cmd_vel
<?xml version="1.0"?>
<!-- 执行键盘功能包直接控制小乌龟 -->
<launch>
    <!-- 将乌龟的话题设置与键盘控制一致 -->
    <node name="my_turtle" pkg="turtlesim" type="turtlesim_node" >
        <remap from="/turtle1/cmd_vel" to="/cmd_vel"/>   
    </node>
    <node name="key" pkg="teleop_twist_keyboard" type="teleop_twist_keyboard.py"/>
    <!-- 将乌龟的话题设置与键盘控制一致 -->

</launch>

Los dos pueden lograr una comunicación normal.

Supongo que te gusta

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