Introducción a la programación de desarrollo de aplicaciones ROS de transmisión y monitoreo del sistema de coordenadas tf

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.

Supongo que te gusta

Origin blog.csdn.net/leon_zeng0/article/details/115025428
Recomendado
Clasificación