Prólogo cero
Entre los nodos son de comunicarse entre sí a través de un tema ROS. Una de las claves cuestiones nodo de entrada un mensaje en el tema, y el nodo B tema está suscrito para recibir el mensaje.
De acuerdo con la descripción en la Wiki ROS, podemos saber fácilmente la relación entre el mensaje y el tema, el tema de los mecanismos de comunicación, y el mensaje es sólo un tema de estructura de datos.
ROS puede ver comando tema en la línea de comandos y el uso de noticias y encontrar visual qué herramientas, de uso detalladas se pueden ver en los ROS wiki comprensión tema ROS
sobre la base de nuestra creación de un mensaje, usted encontrará que es más como la estructura del lenguaje C.
A. Crear un mensaje
Creamos un nuevo paquete de características:
catkin_create_pkg top roscpp std_msgs message_generation message_runtime
Mira las palabras originales de los ROS Wiki:
A continuación, hay un paso crucial: Queremos para asegurarse de que los archivos msg se convierten en código fuente de C ++, Python y otros lenguajes:
Ver package.xml, asegúrese de que contiene aproximadamente dos declaraciones:
<build_depend> message_generation </ build_depend>
<exec_depend > message_runtime </ exec_depend>
Si no es así, añadido a la misma. Tenga en cuenta que cuando se construyó, sólo tenemos que "message_generation". Sin embargo, en tiempo de ejecución, sólo tenemos que "message_runtime".
Oh, mi Dios, al crear el paquete, el cual ha sido creado para nosotros.
Entonces es crear nuestro mensaje:
A continuación, modificamos CMakeList.txt
para asegurar que estamos modificando el siguiente comando: la
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation)
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
Descomentar y modificar:
add_message_files(
FILES
Name.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
Garantizar find_package, solamente message_generation, sin message_runtime, de lo contrario será error.
Después de compilar nos fijamos en el éxito:
II. Preparación de un conjunto de transmisión y recepción de nodo
¿Qué código media específica no hablar, voy a explicar más tarde con
1. El nodo de envío
la parte superior de escritura de escritura / src en el interior puber.cpp
:
#include "ros/ros.h"
#include "top/Name.h"
#include "sstream"
int main(int argc, char **argv)
{
std::stringstream ss;
top::Name msg;
ros::init(argc, argv, "publisher");
ros::NodeHandle h;
ros::Publisher puber = h.advertise<top::Name>("Name_Info", 10);
ros::Rate loop_rate(1);
ss << "A B";
while (ros::ok())
{
ss >> msg.first_name;
ss >> msg.last_name;
ROS_INFO("I Send [%s %s]", msg.first_name.c_str(), msg.last_name.c_str());
puber.publish(msg);
}
return 0;
}
2. El nodo que recibe
Comentariosuber.cpp
#include "ros/ros.h"
#include "top/Name.h"
void infoCallback(const top::Name::ConstPtr& msg)
{
ROS_INFO("Name Changed [%s %s]", msg->last_name.c_str(), msg->first_name.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "suber");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("Name_Info", 1000, infoCallback);
ros::spin();
return 0;
}
3. Modificar CMakeList.txt
Además, al crear un mensaje, modificamos la CMakeList configurado en el tópico de los mensajes utilizados, ahora es de la configuración nodal, añadiendo:
add_executable(puber src/puber.cpp)
target_link_libraries(puber ${catkin_LIBRARIES})
add_executable(suber src/suber.cpp)
target_link_libraries(suber ${catkin_LIBRARIES})
4. compilar y ejecutar
roscore
rosrun top puber
rosrun top suber
rqt_graph
Agradable! Obtener!