Cómo suscribirse a los datos una vez en ro y luego suscribirse a los datos nuevamente dos segundos después
std_msgs/Header header
uint32 seq
Marca de tiempo
string frame_id
Copiar después de iniciar sesión
p>La siguiente es una forma de sincronizar: Time Synchronizer
El filtro TimeSynchronizer sincroniza los canales entrantes según la marca de tiempo contenida en el encabezado y los genera como uno único.
#include lt;message_filters/subscriber.hgt;
#include lt;message_filters/time_synchronizer.hgt;
#include lt;sensor_msgs/Image.hgt ;
#include lt;sensor_msgs/Image.include lt;sensor_msgs/CameraInfo.hgt;
usando el espacio de nombres sensor_msgs;
usando el espacio de nombres message_filters;
void callback( const ImageConstPtramp; image, const CameraInfoConstPtramp; cam_info)
{
// Resuelve todos los problemas de percepción aquí...
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "vision_node");
{
p>
ros::NodeHandle nh;
message_filters::Subscriberlt;Imagegt; image_sub(nh, "imagen", 1); p>
message_filters::Subscriberlt;CameraInfogt; info_sub(nh, "camera_info", 1);
TimeSynchronizerlt; p> sync.registerCallback(boost:. bind(amp ;callback, _1, _2));
ros::spin()
return
}
otro El primer tipo de sincronización es la sincronización basada en políticas, que también se sincroniza mediante la interrupción temporal de los datos en el encabezado del mensaje.
Sincronizador basado en políticas [ROS 1.1]:
El filtro Sincronizador sincroniza los canales entrantes en función de la marca de tiempo contenida en el encabezado del mensaje y lo genera como una única devolución de llamada que ocupa el mismo. número de canales. La implementación de C puede sincronizar hasta 9 canales. /p>
Los filtros del sincronizador están basados en políticas que determinan cómo sincronizar los canales.
Actualmente existen dos estrategias:
Cuando los datos del encabezado de todos los mensajes que deben sincronizarse tienen intervalos de tiempo: ExactTime
message_filters::sync_policies::ExactTime La estrategia requiere que los mensajes tener exactamente las mismas marcas de tiempo deben coincidir. Su devolución de llamada solo se realizará si se recibió un mensaje con exactamente la misma marca de tiempo en todos los canales especificados. Su devolución de llamada solo se realizará si se recibió información con exactamente la misma marca de tiempo en todos los canales especificados. La marca de tiempo se lee en el campo del encabezado de todos los mensajes (obligatorio para esta política).
#include lt;message_filters/subscriber.hgt;
#include lt;message_filters/synchronizer.hgt;
#include lt;message_filters/synchronizer.hgt ;
#include lt;message _filters/sync_policies/exact_time.hgt;
#include lt;sensor_msgs/Image.hgt;
#include lt;sensor_msgs /CameraInfo.hgt;
usando el espacio de nombres sensor_msgs;
usando los filtros de mensajes del espacio de nombres;
devolución de llamada nula (const ImageConstPtramp; imagen, const CameraInfoConstPtramp; cam_info)
{
// Resuelve todos los problemas de percepción aquí...
}
int main(int argc, char** argv)
p>{
ros::init(argc, argv, "vision_node");
ros::NodeHandle nh;
message_filters: : Suscriptorlt; Imagegt; image_sub(nh, "imagen", 1);
message_filters: :Subscriberlt; CameraInfogt(nh, "camera_info", 1); : ExactTimelt; Image, CameraInfogt;
// ExactTime toma el tamaño de la cola como parámetro constructor, por lo que MySyncPolicy(10)
Synchronizerlt; , image_sub, info_sub);
sync.registerCallback(boost::bind(amp;callback, _1, _2));
ros::spin();
devuelve 0;
}
Replicar después de iniciar sesión
Dado que esta política de sincronización se activa cuando la latencia de todos los temas que se sincronizarán es estrictamente igual, devolución de llamada función.
Esto conducirá a los siguientes problemas:
La frecuencia de activación de la función de devolución de llamada debe ser menor o igual a la frecuencia mínima de publicación de estos temas;
La activación de la función de devolución de llamada No es muy estable y, a veces, incluso puede llevar mucho tiempo. No se activará ninguno. Como se muestra en la figura siguiente, el intervalo de activación de una determinada función de devolución de llamada es incluso de unos 10 segundos.
ROS proporciona otra forma de sincronizar datos: a diferencia de ExactTime, que requiere los mismos intervalos de tiempo, permite una cierta desviación en los intervalos de tiempo entre temas.
La política message_filters::sync_policies::AproximateTime utiliza un algoritmo adaptativo para hacer coincidir mensajes en función de marcas de tiempo. #include lt; message_filters/subscriber.hgt;
#include lt;message_filters/synchronizer.hgt;
#include lt;message_filters/sync_policies.filters/sync_policies/approximate_time.hgt;
#include lt; sensor_msgs/Image.hgt;
usando el espacio de nombres sensor_msgs
usando los filtros de mensaje del espacio
void callback(const; ImageConstPtramp; image1, const ImageConstPtramp; image2)
{
// Resuelve todos los problemas de percepción aquí...
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "vision_node");
ros:: NodeHandle nh;
message_filters:
message_filters: Suscriptorlt; image1_sub(nh, "image1", 1); nh, "image2", 1);
typedef sync_policies: :AproximateTimelt; Image, Imagegt; MySyncPolicy; // ApproximateTime toma el tamaño de la cola como parámetro de constructor, por lo que MySyncPolicy( 10)
Synchronizerlt;MySyncPolicygt; sync(MySyncPolicy(10), image1_sub, image2_sub);
sync.registerCallback(boost::bind(amp;callback, _1, _2)) ;
ros::spin();
devuelve 0;
}
Copiar después de iniciar sesión
De la siguiente figura Como se muestra en la figura siguiente, aunque este método permite desviaciones en el tiempo, las desviaciones en realidad no son grandes.
Y la función de devolución de llamada de este método se activa mucho más rápido que el método anterior.
Todavía no entiendo nada sobre ApproximateTime, así que aquí hay una aclaración:
Si no todos los mensajes tienen campos de encabezado que pueden determinar la marca de tiempo, consulte la solución alternativa a continuación.
AproximateTimeSynchronizer se negará de forma predeterminada a agregar ciertos mensajes si su tipo no contiene campos de encabezado. No sé si esto es un problema con mi comprensión. Desde la perspectiva de la sincronización de tiempo, el contenido de la información del sujeto debe contener información de interrupción de tiempo para poder sincronizarse, pero la primera oración dice que se puede permitir que cierta información no lleve información de interrupción de tiempo.
[Agregado el 2021.2.11: utilicé ApproximateTime para sincronizar un tipo de mensaje personalizado hoy y ocurrió el error que se muestra en la imagen a continuación. Después de buscar la información relevante, me di cuenta de que esto se debía a que faltaba un encabezado, lo que significa que sin una parada de tiempo, el programa no podría sincronizarse según el tiempo. En otras palabras, el método también debe requerir tiempo para interrumpirse. Después de agregar el encabezado, el error ya no existe].
xml
find_package(componentes requeridos catkin
lt;build_dependgt;message_filterslt;/build_dependgt;
lt;build_export_dependgt;message_filterslt;/build_export_dependgt;
lt;exec_dependgt;message_filterslt;/exec_dependgt;
)
Inicia sesión y copia
c
Los ciudadanos de Hengyang reciben subsidios Be ¡cuidadoso!
Publicidad Interactiva Jiumu
ROS (fusión multisensor) que se suscribe a múltiples temas y los sincroniza
2.0W lecturas-11 comentarios-22 me gusta p>
26 de julio de 2019
Estudio de revisión de ROS (5): suscríbete a múltiples temas y sincroniza
1963 lecturas - 0 comentarios - 0 me gusta
4 de febrero de 2020
ros_Devolución de llamada de sincronización de mensajes múltiples (sincronizador)
5149 lecturas - 2 comentarios - 10 me gusta
17 de octubre de 2019
rosmessage_ filter sincroniza la nube de puntos y los datos de la imagen
1442 vistas - 9 comentarios - 6 me gusta
21 de abril de 2020
ROS MessageFilter se suscribe a múltiples LiDAR temas para sincronización
2690 lecturas - 1 comentario - 7 me gusta
1 19 de julio de 2021 25 de julio de 2020
Acerca de la sincronización horaria de diferentes sensores-- --ROS proporciona una función de sincronización horaria message_filtersROS bajo el código fuente de Linux,
1174 lecturas - 2 comentarios - 4 me gusta
25 de julio de 2020
Sincronización horaria recibido por múltiples temas en ROS
1052 lecturas - 1 Comentarios - 2 Me gusta
20 de septiembre de 2020
Sincronización de marcas de tiempo de nubes de puntos e imágenes con diferentes marcas de tiempo ; segmentar imágenes y nubes de puntos en paquetes en marcos; convertir pcd a formato bin.
1491 vistas - 9 comentarios - 5 me gusta
19 de abril de 2021
Solución de sincronización de marcas de tiempo de datos multisensor ROS - message_filters:: TimeSynchronizer
Leído 1539 veces - 0 comentarios - 1 me gusta
6 de julio de 2022
Tutorial oficial de ROS [Traducción] - Uso de Message_filter
2,4 W de lecturas - 3 comentarios - 23 Me gusta
22 de agosto de 2017
Registro de aprendizaje de ROS (2): suscripción a la sincronización de tiempo de múltiples nodos
518 lecturas - 0 comentarios - 3 me gusta
18 de septiembre de 2020
Ejercicio de autoestudio de ROS (10): los nodos ROS se suscriben a varios nodos al mismo tiempo Temas y sincronización de tiempo de mensajes
8118 vistas - 19 comentarios - 10 me gusta
23 de mayo de 2020
ros-multisubscribe
Leído 551 veces - 0 comentarios - 0 me gusta
12 de mayo de 2022
Puntos de conocimiento de ROS: genere nubes de puntos, publique y suscríbase a temas de nubes de puntos de ROS
1795 vistas - 0 comentarios - 2 me gusta
9 de agosto de 2022
Uso del patrón de diseño de publicación/suscripción para lograr la sincronización de datos entre objetos
1257 vistas-0 comentarios-1 me gusta
Abril 18, 2004
Notas de estudio del filtro de mensajes
805 lecturas - 0 comentarios - 0 me gusta
13 de agosto de 2021
ROS entiende el mecanismo de devolución de llamada multitema y cola de mensajes