Simple ROS, C ++ y LiDAR con PCL en Ubuntu 16.04 CodeDiversion enoxalopatía anóxica icd 10

Aunque haré todo lo posible para mantenerte entretenido y al día, este no es un tutorial paso a paso. Supongo que tiene cierta familiaridad con ROS; si no, puede obtener un poco de antecedentes aquí y aquí. Todo mi código está disponible en github. Entonces, comencemos. Estoy trabajando en ubuntu 16.04 con ROS cinética. Es importante tener en cuenta que estoy usando gazebo, que es el simulador de física del mundo real y rviz, que es el software de visualización para los datos de gazebo.

Lo primero que debes hacer es crear un modelo de robot básico. Utilizando el formato de descripción de robot unificado (urdf), creé un modelo de robot que consta de un cuerpo rectangular, dos ruedas y dos ruedas (para estabilizar el robot).


El proceso de crear un modelo como este es extremadamente simple. Cree un enlace y una unión de la huella de la base, y luego, para cada enlace (como el chasis), asegúrese de tener elementos de inercia, visuales y de colisión. Se define una junta continua para cada rueda. La definición de trastorno de ansiedad según el modelo de robot dsm 5 se define en “lidar_robot.Xacro” dentro de la carpeta urdf de mi paquete. Presentando frogga, ¿no es ella una belleza?

Y ahora por la parte divertida. Elegí usar un dispositivo lidar 3D de velodyne. Más específicamente, el modelo que estoy usando es el VLP-16, que técnicamente es el mismo que el puck LITE, pero más pesado. A principios de 2018, velodyne redujo el precio de esta unidad a $ 4000. Estoy esperando con impaciencia una reducción de precio como resultado de la tecnología lidar de estado sólido, pero por ahora me atendré a la simulación. Puede obtener lidars 2D mucho más baratos para el hogar, tales como midi de proyectos de nanoxia como los de slamtec. Naturalmente, los lidars 2D son más baratos y por lo tanto más accesibles. Instalé el paquete de simulación de Velodyne y lo probé con los siguientes comandos: $ sudo apt-get install ros-kinetic-velodyne-simulator

Copie “VLP-16.Urdf.Xacro” de esta carpeta urdf en su propia carpeta de urdf del paquete. Agregue algunas líneas al “lidar_robot.Xacro” creado previamente para incluir “VLP-16.Urdf.Xacro”. Siempre que hayas creado archivos de inicio y archivos básicos del mundo para tu paquete, deberías poder lanzar Frogga con un lidar. Desde su directorio de inicio de ROS (generalmente catkin_ws), ejecute lo siguiente: $ source devel / setup.Bash

Genial, ahora que hemos equipado a frogga con un lidar y podemos visualizar los datos de la nube de puntos, sería muy útil e interesante hacer algo con los datos. Un ejemplo de un vehículo auto-conducido equipado con lidar, es la clasificación de objetos (como otro automóvil) en la vecindad del vehículo, de modo que se pueda aplicar el modelo de movimiento correcto al objeto antracita identificado nanoxia silencio profundo 3 antracita, para rastreo. La identificación de objetos basada en datos de nubes de puntos es un tema muy interesante, con capacidades de vanguardia que aprovechan el poder del aprendizaje profundo (un par de ejemplos aquí y aquí). No ejecutaré la detección de objetos de aprendizaje profundo en las nubes de puntos en esta publicación, pero haré una manipulación básica de la nube de puntos, como el filtrado, el muestreo descendente y el cálculo de centroides de objetos, con comandos emitidos a frogga para orientarse hacia El objeto detectado. Pero primero, debemos comprender la estructura de los datos de la nube de puntos generados.

La forma más sencilla de hacerlo es mostrar el tema de ROS que contiene los datos lidar generados al terminal. Con el paquete lanzado, abra un nuevo terminal con pestañas (shift + ctrl + t) y ejecute una lista rostópica que listará los temas activos. Los datos lidar se generan en el tema / velodyne_points. Para averiguar qué estructura utiliza este tema, ejecute el tipo rostópico en el tema de interés. Notarás que es un tipo sensor_msgs / pointcloud2. Para obtener más información sobre la estructura de pointcloud2, ejecute una información rosmsg sobre el tipo de mensaje o visite este enlace. La salida se muestra a continuación. Con la estructura en mente, adelante, el tema rostópico se hace eco del tema velodyne_points, ¡pero prepárate para una gran cantidad de datos! lista de $ rostopic

Notará que los campos x, y y z son float32, y cada campo muestra el desplazamiento aplicable. El campo también contiene información sobre la intensidad y el anillo. El campo especifica la estructura de los datos en datos [] para cada punto en la nube de puntos generada. Para hacer uso de los datos en los datos [], podríamos escribir un analizador para convertir los datos de uint8 con desplazamientos en el formato x, y, z float32 deseado. Pero seguramente alguien ya lo ha hecho. Sí, tienen. Esto y mucho, mucho más.

La biblioteca de nubes de puntos (PCL, por sus siglas en inglés) es un proyecto de prueba de ansiedad de psicología abierta, a gran escala e independiente a gran escala para imágenes en 2D / 3D y procesamiento de nubes de puntos. PCL se lanza bajo los términos de la licencia BSD, y por lo tanto es gratuito para uso comercial y de investigación. Hará que el manejo de los datos de la nube de puntos sea mucho más fácil, como verá. Para comenzar, haga una comprobación rápida para ver si tiene PCL instalado con: $ ldconfig -p | grep libpcl

Si esto devuelve una lista de archivos de objetos compartidos, ya tiene instalado PCL. Si está satisfecho con la versión, continúe; de ​​lo contrario, tiene algunas opciones de instalación: preconstruidas y fuente, según la versión de ubuntu que esté ejecutando. Debido a que estoy en 16.04 (xenial), no hay un binario precompilado, instalé PCL 1.9.1 desde la fuente. Recomendaría crear un proyecto cmake para probar que la compilación y la ejecución funcionan correctamente; puede hacerlo utilizando este cmakelists.Txt y este archivo de origen. Tenga en cuenta que agregué el código a continuación a cmakelists.Txt para obtener un enlace con boost para que funcione correctamente. Una vez que haya comprobado que funciona, comencemos a utilizar C ++ con ROS y PCL. Find_package (impulsar el sistema REQUERIDO)

En este punto, tengo un paquete ROS que contiene un modelo de robot en un mundo vacío, un controlador de unidad diferencial y un sensor lidar que también sintoniza datos de publicación. Para procesar los datos lidar, voy a hacer otro paquete ROS. Me gusta este enfoque iterativo, ya que le permite compilar de forma independiente los paquetes que ayudan con la depuración y el desarrollo. Tomaré esto un poco más lento para ilustrar mejor los pasos. Crearé un paquete en catkin_ws / src llamado lidar_basic. Después de esto, creo un directorio de origen y creo un archivo de origen llamado process_lidar.Cpp $ catkin_create_pkg lidar_basic

Después de hacer esto, debería poder visualizar el tema de salida en rviz, que debería verse exactamente igual a / velodyne_points porque no se produce ninguna manipulación en la nube de puntos de una lesión cerebral hipóxica y anóxica. En el pasado (y aún en los tutoriales de ROS disponibles aquí), el tipo de mensaje sensor_msgs / pointcloud2 se utilizó directamente; sin embargo, notará que estoy utilizando tipos de mensajes pcl / pclpointcloud2 en su lugar. Probablemente vale la pena mencionar que ROS aún utiliza el tipo sensor_msgs / pointcloud2 debajo del capó, y la conversión a PCL se realiza en segundo plano. Esto elimina la necesidad de llamar manualmente a pcl_conversions, que a menudo se encuentra en los tutoriales de código ROS.

En esta implementación, el método de devolución de llamada recibe una referencia constante a datos de tipo pclpointcloud2constptr. Comienzo por definir un contenedor para los datos de la nube de puntos, que es un puntero compartido. Esto es importante porque eliminará automáticamente el objeto del montón (creado dinámicamente) cuando se restablezca o elimine el último puntero al objeto (esta es la razón por la que puedo utilizar la nueva palabra clave sin tener que definir explícitamente una eliminación). También defino un voxelgrid. Los datos de entrada se ajustan a la referencia de entrada constante y yo configuro el algoritmo para aplicar un muestreo descendente con un tamaño de hoja de 0,1 m. Esto significa que colocará cuadros 3D (de 0.1 x 0.1 x 0.1) sobre toda la nube de puntos. Luego, todos los puntos en cada cuadro 3D (o voxel) se aproximan con su centroide. El código se muestra a continuación. #incluir

Para encontrar el centroide de un objeto, puedo reunir todos los puntos y utilizar otro algoritmo PCL. Sin embargo, quiero reunir solo los puntos relacionados con el objeto. Debido a la superficie plana y al objeto singular, sé que cualquier punto sobre un determinado valor del eje z (sobre el piso) será parte del código dsm 5 del trastorno de ansiedad no especificado de un objeto. Por lo tanto, simplemente eliminaré todos los datos de la nube de puntos relacionados con el piso utilizando un filtro de paso.

Una vez más, creo un puntero compartido a un nuevo contenedor que almacenará el resultado de la operación de filtro. Para conectar en cascada las operaciones de filtro, configuro la nube de entrada para que apunte al cloudvoxel anterior. El nombre del campo de filtro se establece en el eje z, con los límites de filtro establecidos en -0.2m a 1.0m. Los valores son relativos a la altura del sensor y, por lo tanto, cualquier valor fuera del rango de estos valores será eliminado. El código se muestra a continuación. // coloque en cascada el filtro de eliminación de piso y defina un contenedor para desensamblado

Frogga es un robot nervioso y no confía en los objetos inanimados. Cuando un objeto se mueve en la escena, frogga quiere girar para mirar hacia el objeto. Siempre y cuando estemos trabajando solo con un objeto singular (aquí hago las reglas), podemos hacer que frogga se enfrente al objeto calculando el centroide del objeto y ordenándole a frogga que gire en la dirección de ese objeto. Entonces, primero calculemos el centroide de un objeto singular. Esto es muy simple para curar el ataque de ansiedad natural. Sabemos que los únicos puntos en la escena serán de un objeto (porque eliminamos el piso). Podemos utilizar pcl :: computecentroid para calcular el centroide de una nube de puntos, que en este caso serán todos los puntos asociados con el objeto. Empiezo definiendo una nube de puntos de tipo pointxyz y luego convierto los resultados filtrados al tipo correcto. Creo un objeto llamado centroide para mantener el resultado del cálculo. El cálculo devuelve la cantidad de puntos utilizados para determinar el centroide, y simplemente verifico que se utilizó más de un punto para indicar la detección, e imprimí las coordenadas del centroide x, y y z en el terminal. El código se muestra a continuación: #include

La respuesta corta es sí (pero no es óptima). Mencioné que el servicio que creamos se sintió un poco como hacer trampa, principalmente porque estoy usando un servicio donde preferiría usar una acción. El servicio actúa como un controlador en este caso, porque a medida que el frogga se vuelve hacia el objeto, la orientación relativa del bloque disminuye (recuerde que el objeto estará en el sistema de coordenadas local de frogga). Esto significa que cuando el ángulo es grande entre la orientación actual de frogga y el objeto, la velocidad a la que gira el frogga será alta. A medida que el ángulo disminuye, también lo hace la velocidad de giro. Sería ideal si este servicio pudiera publicar mensajes a una frecuencia alta, de modo que la velocidad disminuya suavemente a cero y no se produzca un exceso en la orientación deseada. Sin embargo, esto depende de la rapidez con la que podamos procesar las mediciones lidar, ya que nuestro servicio se llama al final de cada paso de procesamiento de lidar. Si ha prestado atención, habrá visto que he estado ejecutando ROS en mi kit de desarrollador nvidia jetson tx2. En el tx2, el significado de este código de ansiedad en las exhibiciones de hindi sobrepasa, ya que frogga se vuelve hacia el objeto, sin embargo, el sobrepasamiento está amortiguado. Para obtener un procesamiento más rápido, ejecuté esto en mi computadora portátil que tiene procesadores ligeramente más robustos; el video se muestra a continuación.