ROS es la abreviatura de Robot Operating System Este artículo presenta la introducción del desarrollo de aplicaciones ROS, la programación de la transmisión y el monitoreo del sistema de coordenadas TF. Hay 2 tortugas en la simulación de la pequeña tortuga. El teclado controla la primera tortuga para moverse y ambas tortugas transmiten sus coordenadas. El monitor escucha las coordenadas de las dos tortugas, obtiene la posición relativa y controla a la segunda tortuga para que siga a la primera.
Creación de paquetes de proyectos
El espacio de trabajo de ROS se establece en el artículo Desarrollo de ROS y preparación de aplicaciones: crear un espacio de trabajo . Ahora, cree un paquete funcional:
cd ~ / catkin_ws / src
catkin_create_pkg learning_tf roscpp rospy tf turtlesim
La primera línea es para volver al directorio src del espacio de trabajo La creación del paquete de funciones debe ejecutarse en este directorio.
La segunda línea es el comando para crear el paquete de funciones, el primer parámetro es el nombre del paquete de funciones, aquí está learning_tf, y la siguiente es la biblioteca de dependencias del paquete de funciones, aquí hay un total de 4 bibliotecas de dependencias de roscpp rospy tf turtlesim.
Después de ejecutar el comando anterior, puede ver un directorio llamado learning_tf en el directorio src con el siguiente contenido:
CMakeLists.txt incluye package.xml src
Código de emisora
En el directorio src del directorio del proyecto, que también es el directorio ~ / catkin_ws / src / learning_tf / src, cree un archivo turtle_tf_broadcaster.cpp,
cd ~ // catkin_ws / src / learning_tf / src
nano turtle_tf_broadcaster.cpp
El contenido es:
/**
* 该例程产生tf数据,并计算、发布turtle2的速度指令
*/
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>
std::string turtle_name;
void poseCallback(const turtlesim::PoseConstPtr& msg)
{
// 创建tf的广播器
static tf::TransformBroadcaster br;
// 初始化tf数据
tf::Transform transform;
transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );
tf::Quaternion q;
q.setRPY(0, 0, msg->theta);
transform.setRotation(q);
// 广播world与海龟坐标系之间的tf数据
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
}
int main(int argc, char** argv)
{
// 初始化ROS节点
ros::init(argc, argv, "my_tf_broadcaster");
// 输入参数作为海龟的名字
if (argc != 2)
{
ROS_ERROR("need turtle name as argument");
return -1;
}
turtle_name = argv[1];
// 订阅海龟的位姿话题
ros::NodeHandle node;
ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);
// 循环等待回调函数
ros::spin();
return 0;
};
Hay comentarios claros en el código.
Código de escucha
En el directorio src del directorio del proyecto, que también es el directorio ~ / catkin_ws / src / learning_tf / src, cree un archivo turtle_tf_listener.cpp,
cd ~ // catkin_ws / src / learning_tf / src
nano turtle_tf_listener.cpp
El contenido es:
/**
* 该例程监听tf数据,并计算、发布turtle2的速度指令
*/
#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>
int main(int argc, char** argv)
{
// 初始化ROS节点
ros::init(argc, argv, "my_tf_listener");
// 创建节点句柄
ros::NodeHandle node;
// 请求产生turtle2
ros::service::waitForService("/spawn");
ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");
turtlesim::Spawn srv;
add_turtle.call(srv);
// 创建发布turtle2速度控制指令的发布者
ros::Publisher turtle_vel = node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel", 10);
// 创建tf的监听器
tf::TransformListener listener;
ros::Rate rate(10.0);
while (node.ok())
{
// 获取turtle1与turtle2坐标系之间的tf数据
tf::StampedTransform transform;
try
{
listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));
listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);
}
catch (tf::TransformException &ex)
{
ROS_ERROR("%s",ex.what());
ros::Duration(1.0).sleep();
continue;
}
// 根据turtle1与turtle2坐标系之间的位置关系,发布turtle2的速度控制指令
geometry_msgs::Twist vel_msg;
vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),
transform.getOrigin().x());
vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) +
pow(transform.getOrigin().y(), 2));
turtle_vel.publish(vel_msg);
rate.sleep();
}
return 0;
};
Hay comentarios claros en el código.
Compilar configuración
En el directorio ~ / catkin_ws / src / learning_tf /, hay un archivo CMakeLists.txt, necesitamos modificar este archivo
cd ~ / catkin_ws / src / learning_tf /
nano CMakeLists.txt
Agregue las siguientes líneas a este archivo,
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})
add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})
La posición agregada es el final de la sección de construcción. Consulte la siguiente posición, que está delante de ## install ##,
## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )
add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})
add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})
#############
## Install ##
#############
Guardar la salida
Esto completa la compilación y configuración.
Verificación de prueba
La compilación debe volver al directorio ~ / catkin_ws
cd ~ / catkin_ws
catkin_make
Debe obtenerse una vez después de la compilación:
fuente devel / setup.bash
Si hay un error en la compilación, debe eliminar el error y luego ejecutar la prueba.
La prueba es más complicada y requiere que se abran 6 terminales. Y ejecute los siguientes comandos en cada terminal por turno:
roscore
rosrun turtlesim turtlesim_node
rosrun learning_tf turtle_tf_broadcaster __name: = turtle1_tf_broadcaster / turtle1
rosrun learning_tf turtle_tf_broadcaster __name: = turtle2_tf_broadcaster / turtle2
rosrun learning_tf turtle_tf_listener
rosrun turtlesim turtle_teleop_key
Después de ejecutar las instrucciones anteriores, controle las teclas de dirección del teclado en el terminal de control del teclado para controlar el movimiento de la primera tortuga, y podrá ver que la segunda tortuga sigue el movimiento.
El código fuente también se puede descargar en https://github.com/huchunxu/ros_21_tutorials
Eso es todo para la introducción.