Introducción a la compilación del sistema operativo del robot ROS Catkin y el uso de comandos comunes

Hay muchos comandos en ROS. Vamos a clasificar algunos comandos comunes de uso frecuente. Estos comandos se usan comúnmente en la operación diaria de los robots, y también son conocimientos necesarios para hacer que los robots funcionen normalmente en ROS.

Especialmente al compilar paquetes, será muy simple para los amigos que están familiarizados con CMake . En la actualidad, Catkin se usa básicamente en ROS . Encapsula CMake y Make, lo que lo hace más eficiente, conciso y portátil. Bueno, soporte para cross -compilación y distribución más razonable de paquetes de características. Por supuesto, en el sistema ROS, también es compatible con la compilación de la versión antigua de rosbuild . Sin embargo, se recomienda usar Catkin.Básicamente, los paquetes de software principales de ROS se han convertido a Catkin.

1. Comandos comunes

Orden efecto
lanzamiento de ros ejecutar el archivo de inicio
catkin_create_pkg Crear paquete de características
rospack Obtener paquete de funciones
catkin_hacer Compile el paquete de funciones en el espacio de trabajo
Rosdep  Instalar automáticamente otros paquetes de los que depende el paquete de características
roscd Salto de directorio del paquete de funciones
roscp Copie los archivos en el paquete de características
rosa Editar archivos en paquetes de características
rosrun Ejecutar ejecutables en paquetes de características

Para algunos de los comandos comunes mencionados anteriormente, sus explicaciones detalladas se dan a continuación, del documento de ayuda oficial, he hecho anotaciones en chino para ellos, lo cual es conveniente para búsquedas y aplicaciones posteriores.

1.1, lanzamiento de ros

roslaunch : ejecutar el archivo de inicio es un comando muy importante. Para un sistema complejo con muchos nodos en ROS, debe usar este comando para iniciar muchos nodos a la vez.

roslaunch-h

Uso: roslaunch [opciones] [paquete] <nombre de archivo> [arg_name:=valor...]
       roslaunch [opciones] <filename> [<filename>...] [arg_name:=valor...]

Si <nombre de archivo> es un solo guión ('-'), el XML de inicio se lee desde la entrada estándar.

Opciones:
  -h, --help         muestra este mensaje de ayuda y sale
  --files               Imprime la lista de archivos cargados por el archivo de inicio, incluido el archivo de inicio en sí. Imprime la lista de archivos cargados por el archivo de inicio, incluido el archivo de inicio en sí  
  -- args=NODE_NAME      Imprimir línea de comando argumentos para el nodo Imprimir argumentos de la línea de comandos para el nodo
  --nodes               Imprimir la lista de nombres de nodos en el archivo de inicio Imprimir la lista de nombres de nodos en el archivo de inicio
  --find-node=NODE_NAME  Buscar el archivo de inicio en el que se define el nodo Buscar el archivo de inicio donde se encuentra el el nodo está definido
  -c NOMBRE, --child=NOMBRE     Ejecutar como servicio secundario 'NOMBRE' Requerido con -u Ejecutar como servicio secundario 'NOMBRE'. Necesita traer -u
  --local               No iniciar nodos remotos No iniciar nodos remotos
  --screen              Forzar la salida de todos los nodos locales en la pantalla Forzar la salida de todos los nodos locales en la pantalla
  --requerido            Forzar la obligatoriedad de todos los nodos Forzar la obligatoriedad de todos los nodos
  --log                 Forzar la salida de todos los nodos locales para registrar Forzar la salida de registros de todos los nodos locales
  -u URI , --server_uri=URI     URI del servidor Requerido con -c URI del servidor. Usar con -c
  --run_id=RUN_ID       run_id de la sesión Requerido con -c Run_id de la sesión. Úselo con -c
  --wait                esperar a que el maestro se inicie antes de iniciar esperar a que el programa principal se inicie antes de iniciar
  -p PORT, --port=PORT  puerto maestro Solo es válido si el maestro es el puerto maestro iniciado. Solo es válido cuando se inicia el servidor principal
  --core                Solo lanza servicios principales solo lanza servicios principales
  --pid=PID_FN         escriba el pid de roslaunch en el nombre de archivo Escriba el pid de roslaunch en el archivo
  -v                    impresión detallada Impresión detallada
  --no-summary          ocultar impresión de resumen No imprimir resumen-
  -dump -params         Volcar parámetros de todos los archivos de roslaunch a stdout Volcar a salida estándar
  -- skip-log-check      omitir comprobar el tamaño de la carpeta de registro
  --ros-args            Mostrar los argumentos de la línea de comandos para este archivo de inicio Mostrar los argumentos de la línea de comandos para este archivo de inicio
  --disable-title       Deshabilitar la configuración del título del terminal Deshabilitar la configuración del título del terminal
  -w NUM_WORKERS, --numworkers=NUM_WORKERS
                        reemplaza el número de subprocesos de trabajo. Solo es válido para los servicios principales. Reemplaza el número de subprocesos de trabajo. Válido solo para servicios básicos.
  -t TIMEOUT, --timeout=TIMEOUT
                        anula el tiempo de espera de la conexión del socket (en segundos). Solo es válido para los servicios principales.
                        Anula el tiempo de espera de la conexión del socket (en segundos). Válido solo para servicios básicos.
  --master-logger-level=MASTER_LOGGER_LEVEL
                        establece el nivel de registro de rosmaster.master ('debug', 'info', 'warn', 'error', 'fatal') establece el nivel de registro

Hay muchos parámetros, y el parámetro que se sigue a menudo es la pantalla.

--screen : Obliga a todos los nodos locales a mostrar la pantalla, lo cual es conveniente para la observación y la depuración. Por supuesto, si desea guardarlo en un archivo de registro para verlo fácilmente más tarde, simplemente especifíquelo como --log . En general, una vez que se completa la depuración, el parámetro de pantalla debe eliminarse para mantener limpia la salida del terminal. Cuando se ejecuta el
comando roslaunch , primero verificará si el rosmaster del sistema se está ejecutando. Si se ha iniciado, se utilizará el rosmaster existente; si no se inicia, el rosmaster se iniciará primeroy luegola configuración en el archivo de lanzamiento Cabe señalar queno es necesario compilar el archivo de inicio y se puede ejecutar directamente de la forma anterior después de la configuración.
arg:=value : sihay variables para asignar en el archivo de inicio , se pueden asignar de esta manera.

1.2, catkin_create_pkg

Información para crear paquetes de características

catkin_create_paquete -h

uso: catkin_create_pkg [-h] [--meta] [-s [SYS_DEPS [SYS_DEPS...]]] [
                         -b [BOOST_COMPS [BOOST_COMPS...]]] [-V PKG_VERSION]
                         [-D DESCRIPCIÓN] [- l LICENCIA] [-a AUTOR]
                         [-m MANTENEDOR] [--rosdistro ROSDISTRO]
                         nombre [dependencias [dependencias...]]

Crea un nuevo paquete de catkin.

argumentos posicionales:
  nombre El nombre de las
  dependencias                  del paquete          Paquete Catkin Dependencias

Argumentos opcionales:
  -h, --help muestra este mensaje de ayuda y sale
  --meta                Crea archivos de metapaquetes
  -s [SYS_DEPS [SYS_DEPS...]], --sys-deps [SYS_DEPS [SYS_DEPS...]]
                        Sistema Dependencias Dependencias del sistema
  -b [BOOST_COMPS [BOOST_COMPS ...]], --boost-comps [BOOST_COMPS [BOOST_COMPS ...]]
                        Componentes de Boost Componentes de Boost
  -V PKG_VERSION, --pkg_version PKG_VERSION  Versión del paquete inicial Versión del paquete inicial
  -D DESCRIPCIÓN , --description DESCRIPCIÓN  Descripción Descripción
  -l LICENCIA, --license LICENCIA  Nombre de la licencia (por ejemplo, BSD, MIT, GPLv3...) Acuerdo de licencia
  -a AUTOR, --author AUTOR  Un solo autor, puede usarse varias veces 作者
  -m MAINTAINER, --maintainer MAINTAINER  Un solo mantenedor, puede usarse varias veces 维护者
  --rosdistro ROSDISTRO  La distribución ROS (predeterminada: variable de entorno ROS_DISTRO si está definida) ROS发行版

1.3, rospack

Obtener información sobre paquetes de características

rospack-h

USO: rospack <comando> [opciones] [paquete]
  Comandos permitidos:
    ayuda
    cflags-only-I [--deps-only] [paquete]
    cflags-only-other [--deps-only] [paquete]
    depende [paquete] (alias: deps)
    Depend-indent [paquete] (alias: Deps-indent)
    Depend-manifests [paquete] (alias: Deps-manifests)
    Depend-msgsrv [paquete] (alias: Deps-msgsrv)
    Depend-on [paquete]
    depende-de1 [paquete]
    depende-por qué --target=<objetivo> [paquete] (alias: deps-why)
    depende1 [paquete] (alias: deps1)
    export [--deps-only] --lang=<idioma> --attrib=<atrib> [paquete]
    find [paquete]
    idiomas
    libs-only-L [--deps-only] [paquete]
    libs-only-l [--deps-only] [paquete]
    libs-only-other [--deps-only] [paquete]
    list
    list-duplicates
    list -nombres
    complementos --attrib=<attrib> [--top=<toppkg>] [paquete]
    perfil [--length=<longitud>] [--zombie-only]
    rosdep [paquete] (alias: rosdeps)
    rosdep0 [ paquete] (alias: rosdeps0)
    vcs [paquete]
    vcs0 [paquete]
  Opciones adicionales:
    -q Silencia los informes de errores.

 Si se omite [paquete], se usa el directorio de trabajo actual
 (si contiene un paquete.xml o manifiesto.xml).

Si no se especifica un nombre de paquete, significa el directorio de trabajo actual.

1.4、catkin_hacer

Compile el paquete de funciones en el espacio de trabajo, que se ha presentado al principio de este artículo, es específicamente para la compilación de paquetes en ROS, y es un paquete para CMake y Make.

hacer_gato -h

uso: catkin_make [-h] [-C DIRECTORIO] [--source SOURCE] [--build BUILD]
                   [--use-ninja] [--use-nmake] [--use-gmake] [--force- cmake]
                   [--sin-color] [--pkg PKG [PKG ...]]
                   [--only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...]]
                   [--cmake-args [CMAKE_ARGS [CMAKE_ARGS . ..]]]
                   [--make-args [MAKE_ARGS [MAKE_ARGS ...]]]
                   [--override-build-tool-check]

Argumentos opcionales:
  -h, --help muestra este mensaje de ayuda y sale
  -C DIRECTORIO, --directorio DIRECTORIO   La ruta base del espacio de trabajo (predeterminado '.') La ruta base del espacio de trabajo (predeterminado '.')')
  --source SOURCE       La ruta al espacio de origen (predeterminado 'workspace_base/src')
  --build BUILD         La ruta al espacio de compilación (predeterminado 'workspace_base/build' ) La ruta al espacio de compilación (predeterminado 'workspace_base/build' )
  --use-ninja           Use 'ninja' en lugar de 'make' Use ninja en lugar de make
  --use-nmake           Use 'nmake' en lugar de 'make' Use nmake en lugar de make
  --use-gmake           Use 'gmake' en lugar de 'hacer' Use gmake en lugar de hacer
  --force-cmake         Invoca 'cmake' incluso si se ha ejecutado antes 强制使用cmake
  --no-color            Desactiva la salida en color (solo para catkin_make y CMake) 禁用彩色输出(仅适用于catkin_make和CMake)
  --pkg PKG [PKG ...]   Invoque 'make' solo en paquetes específicos 只对特定的包调用make
  --only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...]
                        Incluya en la lista blanca solo los paquetes especificados y sus
                        dependencias configurando la
                        variable CATKIN_WHITELIST_PACKAGES. Esta variable se almacena en CMakeCache.txt
                        y persistirá entre las llamadas de CMake a menos que
                        se borre explícitamente; por ejemplo, catkin_make
                        -DCATKIN_WHITELIST_PACKAGES="".
    Incluya en la lista blanca el paquete especificado y sus paquetes dependientes configurando la variable CATKIN_WHITELIST_PACKAGES, que se almacena en CMakeCache.txt y persistirá entre las invocaciones de CMake a menos que se borre explícitamente.
  --cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]]
                        Argumentos arbitrarios que se pasan a CMake. Deben pasarse después de otros argumentos, ya que recopila todas las opciones siguientes.
Argumentos arbitrarios pasados ​​a CMake.
  --make-args [MAKE_ARGS [MAKE_ARGS ...]]
                        Argumentos arbitrarios que son pases para hacer. Deben pasarse después de otros argumentos ya que recopila todas las opciones siguientes .
Esto solo es necesario cuando se usa junto con --cmake-args, de lo contrario, todos los argumentos desconocidos se pasan para hacer que
  --override-build-tool-check
                        se use para anular fallas debido al uso de diferentes herramientas de compilación en el mismo espacio de trabajo. causado por el uso de diferentes herramientas de compilación en el mismo espacio de trabajo.

1.5, Rosdep

Instalar automáticamente paquetes dependientes de paquetes de características

rosdep-h

 

Uso: rosdep [opciones] <comando> <argumentos>

Comandos:

rosdep check <stacks-and-packages>...
  verifica si se han cumplido las dependencias de los paquetes.

rosdep install <pilas-y-paquetes>...
  descarga e instala las dependencias de un paquete o paquetes dados.

rosdep db
  genera la base de datos de dependencias e imprímela en la consola.

rosdep init
  inicializa las fuentes de rosdep en /etc/ros/rosdep. Puede requerir sudo. Inicializa las fuentes de dependencia en /etc/ross/rosdep. Puede requerir privilegios de sudo

rosdep keys <pilas-y-paquetes>...
  enumera las claves rosdep de las que dependen los paquetes Muestra las claves rosdep de las que dependen los paquetes.

rosdep resolver <rosdeps>
  resolver <rosdeps> a las dependencias del sistema resolver <rosdeps> a las dependencias del sistema

actualización de rosdep
  actualice la base de datos de rosdep local según las fuentes de rosdep actualice la base de datos de rosdep local según la fuente de rosdep

rosdep what-needs <rosdeps>...
  imprime una lista de paquetes que declaran un rosdep en (al menos uno de) <rosdeps> Imprime una lista de paquetes que declaran un rosdep en (al menos uno de) <rosdeps>

rosdep where-defined <rosdeps>...
  imprime una lista de archivos yaml que declaran un rosdep en (al menos uno de) <rosdeps> imprime una lista de archivos yaml que declaran un rosdep en (al menos uno de) <rosdeps>

 1.5.1 Comandos de permisos

rosdep fix-permissions
  Cambia recursivamente los permisos del directorio de inicio de ros del usuario Cambia recursivamente los permisos del directorio de inicio de ros del usuario.
  Puede requerir sudo Puede ser útil para corregir permisos después de llamar a "actualización de rosdep" con sudo accidentalmente.

Cuando se niegan los permisos, puede usar los siguientes comandos:
sudo rosdep fix-permissions
rosdep update (a veces puede ser necesario sudo )

1.5.2、Opciones

Opciones:
  -h, --help muestra este mensaje de ayuda y sale
  --os=NOMBRE_SO:VERSIÓN_SO
                        Anular el nombre y la versión del sistema operativo (separados por dos puntos), p. ej., ubuntu:lucid anular el nombre y la versión del sistema operativo (separados por dos puntos)
  -c SOURCES_CACHE_DIR, --sources-cache-dir=SOURCES_CACHE_DIR
                        Anular /home/jetson/.ros/rosdep/sources.cache
  -v, --verbose         verbose display Pantalla detallada
  --version             imprime solo la versión rosdep, luego sale Solo imprime la versión rosdep, luego salga
  --all-versions        print rosdep version y version of installers, luego salga
  --reinstall           (re)install todas las dependencias, incluso si ya están instaladas
  -y , --default-yes     Dígale al administrador de paquetes que por defecto sea y o falle al instalar
  -s, --simulate        Simular instalación Simular instalación
  -r                    Continuar con la instalación a pesar de los errores Continuar con la instalación a pesar de los errores.
  -q                    Silencioso. Suprime la salida excepto por errores. Instalación silenciosa. Suprimir salida excepto errores.
  -a, --all             selecciona todos los paquetes
  -n                    No considere dependencias implícitas/recursivas. Solo es válido con los comandos 'keys', 'check' e 'install'.
    No considere dependencias implícitas/recursivas. Solo válido para los comandos 'keys', 'check' e 'install'.
  -i, --ignorar-paquetes-de-fuente, --ignorar-src
                        Afecta a los verbos 'comprobar', 'instalar' y 'claves'. Si se especifica, rosdep ignorará las claves que se encuentren como paquetes catkin o ament en cualquier lugar de ROS_PACKAGE_PATH, AMENT_PREFIX_PATH o en cualquiera de los directorios proporcionados por la opción --from-paths. 如果指定这个参数rosdeep将忽略在catkin或其他路径找到的包
  --skip-keys=SKIP_KEYS
                        Afecta a los verbos 'verificar' e 'instalar'. Las claves rosdep especificadas se ignorarán, es decir, no se resolverán ni se instalarán. La opción se puede suministrar varias veces.
                        Una lista separada por espacios de claves rosdep también se puede pasar como una cadena. Una solución más permanente para ignorar localmente una clave rosdep es crear una regla rosdep local con una lista vacía de paquetes (inclúyala en /etc/ros/rosdep/sources. list.d/ antes de los valores predeterminados). Una solución más permanente para ignorar localmente las claves rosdep es crear una regla rosdep local (contenida en /etc/ross/rosdep/sources.list.d) con una lista de paquetes vacía, en el valor predeterminado Antes del valor
  --filter-for-installers=FILTER_FOR_INSTALLERS
                        Afecta al verbo 'db'. Si se proporciona, la salida del comando 'db' se filtra para enumerar solo los paquetes cuyo instalador se encuentra en la lista proporcionada. La opción se puede proporcionar de forma múltiple veces . Una lista separada por espacios de instaladores también se puede pasar como una cadena. Ejemplo:
                        `--filter-for-installers "apt pip"` Solo instale paquetes filtrados
  --from-paths          Afecta a los verbos 'comprobar', 'claves' e 'instalar'.                         Si se especifican, los argumentos de esos verbos se considerarán rutas de búsqueda y actuarán sobre todos los
  paquetes catkin que se encuentren allí.
variable. Cuando se usa con el verbo 'actualizar', solo se actualizará la distribución especificada. 显示指定ros的发行版本
  --as-root=INSTALLER_KEY:<bool>
                        Anular si sudo se usa para un instalador específico, por ejemplo, '--as-root pip:false' o '--as-root "pip:no homebrew :Sí"'. Se puede especificar varias veces.
  --include-eol-distribuciones
                        Afecta al verbo 'actualizar'. Si también se obtienen las distribuciones de final de vida especificadas.
  -t DEPENDENCY_TYPES, --dependency-types=DEPENDENCY_TYPES
                        Los tipos de dependencia para instalar, se pueden proporcionar varias veces. Elija entre set(['exec' , 'doc', 'build_export', 'buildtool', 'test', 'build', 'buildtool_export']). Predeterminado: todos excepto doc. 

1.6, rosrun

Ejecute el archivo ejecutable rosrun -h en el paquete de características

Uso: rosrun [--prefix cmd] [--debug] PACKAGE EXECUTABLE [ARGS]
  rosrun localizará PACKAGE e intentará encontrar un ejecutable llamado EXECUTABLE en el árbol PACKAGE. Si lo encuentra, lo ejecutará con ARGS.

rosrun localizará el paquete y luego intentará encontrar el ejecutable en el árbol de paquetes y, si lo encuentra, lo ejecutará de acuerdo con los argumentos.

El administrador de nodos ( maestro ) debe iniciarse primero. El maestro se utiliza para administrar muchos procesos en el sistema. Cuando se inicia cada nodo , debe registrarse con el maestro para administrar la comunicación entre los nodos . Después de que se inicie el maestro , registre cada nodo a través del maestro . Ingrese el comando en la terminal de Ubuntu: roscore , este roscore es necesario para cada ROS, y se usa para proporcionar información de conexión entre nodos, es decir, cuando un nodo inicia, se conectará a roscore y registrará el nodo para publicar y subscribe Cuando aparece un nuevo nodo, roscore le proporcionará la información necesaria para que otros nodos que publiquen y se suscriban al mismo tema del mensaje establezcan una conexión punto a punto. Si no hay roscore , los nodos no pueden encontrarse y no pueden comunicarse entre sí. El método rosrun solo puede ejecutar un nodo a la vez. El siguiente paso es un combate real de la orden.

2. Ejemplo de demostración

2.1 Simulador de tortuga individual

Primero inicie el administrador de nodos, ingrese el comando: roscore
La siguiente es la información relevante para comenzar, verifique el tamaño del archivo de registro, muestre la dirección y el puerto del servicio, el número de versión, el resumen, etc. Presione Ctrl + C para finalizar todos los nodos ROS:

... iniciando sesión en /home/jetson/.ros/log/fd65134c-d010-11ec-95c6-0013eff86fe1/roslaunch-jetson-desktop-10638.log
Comprobando el uso del disco en el directorio de registro. Esto puede tardar un rato.
Presione Ctrl-C para interrumpir
el uso del disco del archivo de registro. El uso es <1 GB.

comenzó el servidor roslaunch http://jetson-desktop:33239/
ros_comm versión 1.14.11


RESUMEN
========

PARÁMETROS
 * /rosdistro: melódico
 * /rosversion: 1.14.11

NODOS

nuevo proceso maestro de inicio automático
[maestro]: comenzó con pid [10695]
ROS_MASTER_URI=http://jetson-desktop:11311/

configurando /run_id en fd65134c-d010-11ec-95c6-0013eff86fe1
process[rosout-1]: comenzó con pid [10727]
inició el servicio central [/rosout]

Abra otra terminal e inicie el nodo del simulador de tortugas.

rosrun tortugasim tortugasim_node

[INFO] [1652153768.669399182]: Iniciando Turtlesim con nombre de nodo /turtlesim
[INFO] [1652153768.694629755]: Tortuga de desove [tortuga1] en x=[5.544445], y=[5.544445], theta=[0.000000]
QXcbConnection: X Error CB: 148 (Desconocido), secuencia: 173, ID de recurso: 0, código mayor: 140 (Desconocido), código menor: 20

Finalmente, abra una terminal nuevamente e inicie el nodo del controlador del teclado de la tortuga
rosrun turtlesim turtle_teleop_key
Bajo el comando de este nodo del controlador del teclado, puede controlar el movimiento de la tortuga usando las teclas de flecha arriba, abajo, izquierda y derecha. Como se muestra abajo: 

Es decir, en esta operación de movimiento de tortugas abrimos tres terminales, primero iniciamos la gestión de nodos y luego iniciamos los nodos requeridos respectivamente. Podemos verificar qué temas se inician, ingrese el comando: rostopic list

/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

También puede ingresar el comando rqt_graph para ver el gráfico de ROS: 

2.2 Dos tortugas 

Veamos un ejemplo de una tortuga moviéndose con una tortuga operada por teclado
Instale el paquete de características: sudo apt install ros-melodic-turtle-tf

Pueden ocurrir los siguientes errores:

No se pudo resolver 'packages.ros.org'
E: No se pudo recuperar http://packages.ros.org/ros/ubuntu/pool/main/r/ros-melodic-turtle-tf/ros-melodic-turtle-tf_0 .2.2-0bionic.20210922.040438_arm64.deb No se pudo resolver 'packages.ros.org'
E: No se pueden obtener algunos archivos, quizás ejecute apt-get update o intente con --fix-missing?

Verificamos directamente la siguiente página de lista: http://packages.ros.org/ros/ubuntu/pool/main/r/ros-melodic-turtle-tf/ podemos encontrar que no hay ningún archivo deb
mencionado anteriormente , podemos elegir otras descargas manuales Todo estará bien. Por supuesto, si hay una situación en esta versión, es por el tiempo de espera de la red y otros problemas, que se pueden manejar científicamente navegando por Internet o descargando manualmente. También se puede sustituir por una fuente espejo doméstica:

cd /etc/apt
vim fuentes.lista

Por ejemplo, el sitio espejo de código abierto de Alibaba Cloud:

deb http://mirrors.aliyun.com/ubuntu/ principal focal universo restringido multiverso
deb-src http://mirrors.aliyun.com/ubuntu/ focal principal universo restringido multiverso
deb http://mirrors.aliyun.com/ubuntu / focal-security principal universo restringido multiverso
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security principal universo restringido multiverso
deb http://mirrors.aliyun.com/ubuntu/ focal-updates principal universo restringido multiverso
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates principal universo restringido multiverso
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed principal universo restringido multiverso
deb-src http://mirrors .aliyun.com/ubuntu/ focal-proposed principal universo restringido multiverso
deb http://mirrors.aliyun.com/ubuntu/ focal-backports principal universo restringido multiverso
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports principal universo restringido multiverso

Estoy usando la imagen de Tsinghua aquí:

deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ multiverso principal biónico universo restringido
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-security multiverso principal universo restringido
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates multiverso principal universo restringido
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports multiverso principal universo restringido
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ multiverso principal bionic universo restringido
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic -seguridad del universo restringido del multiverso principal
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-updates del universo restringido del multiverso principal
deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/ bionic-backports principal universo restringido multiverso

Finalmente ejecuta lo siguiente:

Actualizar la lista de software local: sudo apt-get update
Actualización de software: sudo apt-get upgrade

Ejecute el archivo .launch a través del comando roslaunch para iniciar la tortuga, y lo mismo mostrará información relevante

roslaunch tortuga_tf tortuga_tf_demo.lanzamiento

Por ejemplo, el resumen:

RESUMEN
========

PARÁMETROS
 * /rosdistro: melódico
 * /rosversion: 1.14.11
 * /scale_angular: 2.0
 * /scale_linear: 2.0
 * /turtle1_tf_broadcaster/turtle: turtle1
 * /turtle2_tf_broadcaster/turtle: turtle2

NODES
  /
    sim (turtlesim/turtlesim_node)
    teleop (turtlesim/turtle_teleop_key)
    turtle1_tf_broadcaster (turtle_tf/turtle_tf_broadcaster.py)
    turtle2_tf_broadcaster (turtle_tf/turtle_tf_broadcaster.py)
    turtle_pointer (turtle_tf/turtle_tf_listener.py)

ROS_MASTER_URI=http://localhost:11311

proceso[sim-1]: comenzó con pid [30907]
proceso[teleop-2]: comenzó con pid [30908]
proceso[turtle1_tf_broadcaster-3]: comenzó con pid [30909]
proceso[turtle2_tf_broadcaster-4]: comenzó con pid [ 30917]
proceso[turtle_pointer-5]: comenzó con pid [30920]

Puede ver que se muestran los múltiples nodos iniciados y el ID de subproceso iniciado por cada programa.

Use rosrun para iniciar el nodo y opere el teclado para controlar la tortuga
rosrun turtlesim turtle_teleop_key

Como se muestra en la figura a continuación, hay una tortuga controlada por el teclado y otra tortuga sigue a la tortuga controlada:

Tres, iniciar archivo 

Aprendamos más sobre el archivo de lanzamiento . Usemos el archivo de lanzamiento de arriba para iniciar la tortuga . Encontrémoslo primero:
sudo find / -name turtle_tf_demo.launch
Después de encontrarlo, veamos qué contiene
cat /opt/ros/melodic/ compartir/turtle_tf/lanzamiento/tortuga_tf_demo.lanzamiento

<launch>

  <!-- Turtlesim Node-->
  <node pkg="turtlesim" type="turtlesim_node" name="sim"/>

  <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
  <!-- Axes -->
  <param name="scale_linear" value="2" type="double"/>
  <param name="scale_angular" value="2" type="double"/>

  <node name="turtle1_tf_broadcaster" pkg="turtle_tf" type="turtle_tf_broadcaster.py" respawn="false" output="screen" >
    <param name="turtle" type="string" value="turtle1" />
  </node>
  <node name="turtle2_tf_broadcaster" pkg="turtle_tf" type="turtle_tf_broadcaster.py" respawn="false" output="screen" >
    <param name="turtle" type="string" value="turtle2" />
  </node>
  <node name="turtle_pointer" pkg="turtle_tf" type="turtle_tf_listener.py" respawn="false" output="screen" >
  </node>

</launch>

Se puede observar que el archivo de lanzamiento está en formato XML , de acuerdo a los ejemplos de tortuga 1 y tortuga 2, podemos saber que el nombre del paquete a lanzar y el nombre del programa ejecutable corresponden al nodo nodo .
El primer ejemplo de tortuga: pkg="turtlesim" type="turtlesim_node" , por lo que el código de inicio es: rosrun turtlesim turtlesim_node
El segundo ejemplo de tortuga: pkg="turtle_tf" type="turtle_tf_broadcaster.py" , por lo que el código de inicio es: roslaunch
La operación de teclado de turtle_tf turtle_tf_demo.launch es la misma: rosrun turtlesim turtle_teleop_key
Entonces, ¿por qué necesitamos crear un archivo de lanzamiento ? Debido a que un robot completo generalmente contiene una gran cantidad de programas de nodos y necesita ejecutarse y cooperar al mismo tiempo, sería más problemático iniciar los nodos uno por uno, por lo que a través de este archivo de configuración podemos iniciarlos todos a la vez. sí No es mucho más fácil.
A continuación, echemos un vistazo a algunas descripciones de parámetros de este archivo:

<launch>                  <!--根标签开始-->
<node>                    <!--需要启动的node及其参数-->
<remap>                  <!--设定topic映射-->
<include>                <!--包含其他launch-->

<arg>                       <!--定义变量-->
<param>                 <!--定义全局变量-->
<rosparam>            <!--加载yaml文件中的参数到参数服务器-->

<group>                 <!--设定分组-->
<machine>              <!--指定运行的机器-->
<env-loader>          <!--设置环境变量-->
</launch>               <!--根标签结束-->

3.1, <nodo>

 La etiqueta de nodo es la parte central del archivo de lanzamiento , definida de la siguiente manera:

<launch>
    <node pkg="包名1" type="可执行文件1" name="节点名1"/>
    <node pkg="包名2" type="可执行文件2" name="节点名2"></node>
    ...
</launch>

Entre ellos, si el tipo está escrito en Python , es el archivo .py, y si está escrito en C++ , es el nombre del archivo ejecutable compilado. Cabe señalar que este archivo de inicio no se inicia para que se inicien los nodos que contiene. Además de estos tres parámetros obligatorios, existen algunos parámetros opcionales:

<launch>
    <node pkg="" type="" name="" respawn="true" required="true" launch-prefix="xterm -e" output="screen" ns="namespace" />
</launch>

reaparición: si el nodo se apaga, si se reinicia automáticamente
requerido: si el nodo se apaga, si se apagan todos los demás nodos
launch-prefix: si se abre una nueva ventana para ejecutar
la salida: el valor predeterminado se almacena en el registro archivo, puede configurarlo para que se muestre en la pantalla
ns: clasifique los nodos en diferentes espacios de nombres , es decir,agregueel prefijo especificado por ns delante del nombre del nodo . Para realizar este tipo de operación,definir el nombre del nodo y el nombre del tema en el archivo fuente del nodo , es decir, sin el símbolo /.

3.1.1 Fuente del gráfico de cálculo

En ROS, la fuente del gráfico de cálculo se refiere al nombre colectivo de temas, nodos, servicios y parámetros. Cada fuente de gráfico de cálculo se identifica mediante una cadena corta denominada nombre de fuente de gráfico de cálculo. El nombre de la fuente del gráfico de cálculo es el siguiente:
Nombre básico: por ejemplo, nombre global del tema
: el nombre de la fuente del gráfico de cálculo que comienza con "/". Por ejemplo, /A/
nombre relativo del tema: nombre del origen del gráfico de cálculo sin "/" al principio del nombre. Por ejemplo, A/
nombre privado del tema: el nombre de origen del gráfico de cálculo que comienza con el símbolo de tilde "~". Por ejemplo, ~
nombre anónimo del tema: fuente de gráfico computacional sin nombre.
Código como este al publicar y suscribirse:

ros::init(argc, argv, "publish_node");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<std_msgs::string>("topic",1000);

3.2, <reasignación>

Pase el parámetro de reasignación de nombre al nodo ROS sin configurar la propiedad de parámetro del nodo.
Los temas se dividen en publicación y suscripción
Temas de publicación:

<node pkg="pub_node" type="pub_node" name="pub_node">
    <remap from="/pub_topic" to="/new_topic" />
</node>

Aquí está el tema /pub_topic publicado por el nodo pub_node que está asignado a /new_topic

Suscríbete a los temas:

<node pkg="sub_node" type="sub_node" name="sub_node">
    <remap from="/sub_topic" to="/turtle" />
</node>

Aquí está el nombre del subtema que se suscribe a los temas de otras personas /la tortuga se asigna al nodo del sub_nodo , es decir, los temas publicados por otros se asignan a los temas a los que se suscribe.

3.3, <incluir>

Incluya otro archivo de lanzamiento , que es equivalente al anidamiento de archivos de lanzamiento , y el parámetro de archivo se puede especificar como la ruta completa

<include file="path-to-launch-file" />

Por supuesto, para una mejor portabilidad, puede usar el comando de búsqueda en su lugar:

<include file="$(find package-name)/launch-file-name" />

La ventaja de esto es que incluso si se reemplaza el controlador principal, siempre que se instale el mismo paquete, se puede encontrar la ruta correspondiente. A veces, es posible que los nodos introducidos por otro lanzamiento deban tener un nombre uniforme, o que los nombres de nodos con características similares, como /my/gps, /my/lidar, /my/imu,  tengan un prefijo unificado, que es fácil de encontrar. puede establecer el atributo ns del espacio de nombres para lograr, el comando es el siguiente:

<include file="$(find package-name)/launch-file-name " ns="my" /> 

3.4, <argumento>

Los parámetros se pueden reutilizar, tres formas comunes de escritura

<arg name="foo">                          <!--只定义,不赋值-->
<arg name="foo" default="1">              <!--默认值-->
<arg name="foo" value="1">                <!--固定值-->

Otros métodos comunes de asignación:
asignación de línea de comando
roslaunch nombre_paquete xxx.launch arg1:=v1 arg2:=v2

sustitución de variables

1. $(find pkg): Por ejemplo, $(find rospy)/manifest.xml Si es posible, se recomienda enfáticamente esta configuración de ruta basada en paquetes
2. $(arg arg_name): Establezca primero el valor predeterminado, y si hay ninguna asignación adicional, solo use este valor predeterminado,
como

<arg name="gui" default="true" />
<!-- 如果没有额外的赋值,就用这个默认值 -->
<param name="use_gui" value="$(arg gui)"/>

También puede utilizar la asignación de línea de comando

<node pkg="包名" type="可执行文件" name="节点名" args="$(arg a) $(arg b)" />

De esta forma, se pueden asignar argumentos al iniciar el archivo de lanzamiento : roslaunch nombre del paquete nombre_archivo.lanzamiento a:=1 b:=2

3.5, <parámetro>

A diferencia de arg , el parámetro aquí se comparte y su definición es similar

<param name="publish_frequency" type="double" value="10.0" />

Los valores aquí, además de los anteriores, también pueden provenir de archivos.

<param name="参数名" textfile="$(find pkg)/path/file"/>
<param name="参数名" command="$(find pkg)/exe '$(find pkg)/arg.txt'"/>
<param name="参数名" type="yaml" command="cat '$(find pkg)/*.yaml'"/>

Además de definir en el ámbito global, también se puede definir en el nodo nodo :

<node name="node1" pkg="pkg1" type="exe1">
    <param name="param1" value="False"/>
 </node>

Puede ver todos los parámetros con el comando: rosparam list
Luego, lo anterior aparecerá de la siguiente manera:

/publish_frequency
/node1/param1 # El prefijo del espacio de nombres se agregará automáticamente aquí. Cabe señalar que, aunque el espacio de nombres se agrega antes del nombre, aún se encuentra en el ámbito global.

3.6, <rosparam>

El parámetro anterior se obtiene a través de valor, archivo de texto y comando , y se devuelve el contenido de un solo parámetro . Rosparam se puede operar en lotes y también incluye algunos comandos para configurar parámetros, como dump, delete , etc.
su
carga de uso: Desde YAML Cargue un lote de param en el archivo:

<rosparam command="load" file="$(find rosparam)/example.yaml" />

eliminar: eliminar un parámetro

<rosparam command="delete" param="my_param" />

operación de asignación

<rosparam param="my_param">[1,2,3,4]</rosparam>

está bien

<rosparam>
a: 1
b: 2
</rosparam>

Del mismo modo, este rosparam también se puede colocar en el nudo.

3.7, <grupo>

Si desea realizar la misma configuración en varios nodos, como todos en el mismo espacio de nombres específico, reasignar el mismo tema, etc., puede usar esta agrupación de grupos .

<group ns="rosbot">
    <remap from="chatter" to="talker"/>       # 对该组中后面的节点都有效
    <node ... />
    <node ... >
        <remap from="chatter" to="talker1"/>  # 还可以对单个节点重新设置
    </node>
</group>

Desde la perspectiva de estos nodos de inicio, el diseño de ROS tiene un acoplamiento muy flexible, que es un muy buen diseño para la colaboración conjunta, y el bloqueo de un solo nodo no afectará a otros nodos, lo cual es muy importante para la depuración y el mantenimiento. .

Supongo que te gusta

Origin blog.csdn.net/weixin_41896770/article/details/132207097
Recomendado
Clasificación