ROS llaman archivo de análisis XML biblioteca tinyxml2 de terceros (para el archivo de ejecución de análisis, por ejemplo)

Introducción de 1.TinyXML2

bibliotecas de terceros TinyXML2 es simple, compacto, eficiente y de código abierto biblioteca de C ++ analizar el archivo XML, se puede aplicar fácilmente a los proyectos existentes, ideal para analizar archivos XML, almacenar datos simples, archivos de configuración y la serialización de objetos y otros datos volumen no es grandes operaciones.
Detalles TinyXML2 y vea: sitio web oficial TinyXML2 .

Adquisición e instalación de 2.TinyXML2

TinyXML2 por su página de Github obtener el código fuente puede ser utilizado específicamente git clonepara o directamente descargar el archivo ZIP, git clonellamando a la situación de un comando es la siguiente:

git clone https://github.com/leethomason/tinyxml2

Introducción de la línea de comandos tinyxml2de directorio, utilizando el siguiente comando para compilar e instalar TinyXML2, la ejecución de comandos de la siguiente manera (en el que el $símbolo es un shell de comandos del sistema):

$ sudo make install
mkdir -p /usr/local
mkdir -p /usr/local/bin
mkdir -p /usr/local/lib
mkdir -p /usr/local/include
install xmltest /usr/local/bin/xmltest
install -m 644 tinyxml2.h /usr/local/include/tinyxml2.h
install -m 644 libtinyxml2.a /usr/local/lib/libtinyxml2.a

De acuerdo con ello, poner tinyxml2biblioteca está instalado en el entorno local, tinyxml2ejecute el siguiente comando de directorio, ejecute el código de prueba TinyXML2:

$ xmltest

Esta rutina se ejecuta cuando los archivos XML utilizados se encuentran en tinyxml2el directorio en resourcesel directorio, los extremos terminales del procedimiento ejecutado tras el símbolo como se muestra a continuación:
Aquí Insertar imagen Descripción
Se mostraron tinyxml2biblioteca ha sido instalado con éxito.

Un simple ejemplo de la utilización de 2.TinyXML2

Después TinyXML2 instalado en el entorno local, la siguiente demostración del uso de TinyXML2:
los archivos de origen TinyXML2 en la carpeta xmltest.cppy resources/dream.xmlcopiar en la carpeta de destino para los ejemplos demuestran.Aquí Insertar imagen Descripción

Aquí, en xmltest.creferencia al archivo de cabecera tinyxml2.h:

#include "tinyxml2.h"

Al mismo tiempo, declarada espacio de nombres de TinyXML2:

using namespace tinyxml2;

Además, en la función principal se define: Si el parámetro de programa es mayor que 1, se crea XMLDocumentel objeto y el archivo del cargador especificado, si el último archivo cargado correctamente, la salida del tiempo de procesamiento de correlación, la parte del código se muestra a continuación.

	if ( argc > 1 ) {
		XMLDocument* doc = new XMLDocument();
		clock_t startTime = clock();
		doc->LoadFile( argv[1] );
 		clock_t loadTime = clock();
		int errorID = doc->ErrorID();
		delete doc; doc = 0;
 		clock_t deleteTime = clock();

		printf( "Test file '%s' loaded. ErrorID=%d\n", argv[1], errorID );
		if ( !errorID ) {
			printf( "Load time=%u\n",   (unsigned)(loadTime - startTime) );
			printf( "Delete time=%u\n", (unsigned)(deleteTime - loadTime) );
			printf( "Total time=%u\n",  (unsigned)(deleteTime - startTime) );
		}
		exit(0);
	}

Utilice el siguiente comando para compilar el programa:

$ g++ -o xmltest xmltest.cpp -ltinyxml2

Si no puede encontrar un archivo no encontrado aparece un mensaje de error o biblioteca estática, también se puede especificar manualmente el directorio de archivos de cabecera ( -I) y el directorio de archivos de biblioteca ( -L):

$ g++ -o xmltest xmltest.cpp -I /usr/local/include -L /usr/local/lib -ltinyxml2 

Introduzca el siguiente comando para ejecutar el programa de ejemplo:

$ xmltest dream.xml

Se puede ver la salida del programa es el siguiente, es decir, el programa ha cargado correctamente el archivo XML dream.xml.
Aquí Insertar imagen Descripción

3.TinyXML2 uso de ROS

El siguiente paquete de funciones para crear una obra de ROS ROS en el espacio mediante tinyxml_testel uso de archivos lanzamiento TinyXML2 resolver el ROS, ROS con el fin de demostrar el uso de TnyXML2.
Aquí está el paquete de funciones package.xmlde archivos:

<?xml version="1.0"?>
<package format="2">
  <name>tinyxml_test</name>
  <version>0.0.0</version>
  <license>TODO</license>
  <maintainer email="[email protected]">jacky</maintainer>
  <description>The tinyxml_test package</description>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>tf</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>tf</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>tf</exec_depend>
</package>

funciones de nodo de origen del paquete tinyxml_test_node.cppde código es el siguiente:

#include <ros/ros.h>
#include <ros/package.h>
#include <tf/transform_broadcaster.h>
#include <tinyxml2.h>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <map>

using namespace tinyxml2;//使用tinyxml2命名空间
using namespace std;

/* 功能函数 */
float String2Float(std::string numStr){
  std::stringstream ss(numStr);
  float num;
  ss>>num;
  return num;
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "tinyxml_test_node");
  ros::NodeHandle nh("~"), nh_param("~");

  std::string tf_launch_file;
  //注:"test.launch"文件位于catkin_ws/src/tinyxml_test/launch/目录下
  nh_param.param<std::string>("tf_launch_file", tf_launch_file,"test.launch");

  /*Load launch file to get the tf args.*/
  XMLDocument* doc = new XMLDocument();
  std::map<std::string,tf::StampedTransform> stampedTransformMap;//用于存储多个不同坐标系之间的转换关系

  std::string filePath = ros::package::getPath("tinyxml_test");//获取tinyxml_test功能包的绝对路径
  filePath+="/launch/";
  filePath+=tf_launch_file;
  doc->LoadFile( filePath.c_str() );
  int errorID = doc->ErrorID();
  if(errorID){
      ROS_FATAL("[radar_freespace] Failed to load launch file %s.", filePath.c_str());
      return -1;
  }
  ROS_INFO( "[radar_freespace] Launch file '%s' loaded.", filePath.c_str());

  XMLElement* rootElement = doc->RootElement();//获得根元素,即launch
  std::cout<<"Root Element:"<<rootElement->Value()<<std::endl;
  for(const XMLElement* element =rootElement->FirstChildElement();element;element=element->NextSiblingElement()){
    const XMLAttribute* argsAttr = element->FindAttribute("args");
    
    std::string argsAttrStr=std::string(argsAttr->Value());
    std::cout<<"Args Attribute:"<<argsAttrStr<<std::endl;
    std::stringstream ss(argsAttrStr);
    std::vector<std::string> argStrVec;
    std::string tmpArgStr = "";
    while (std::getline(ss, tmpArgStr, ' ')) {
      argStrVec.push_back(tmpArgStr);
    }
    tf::Transform transform;
    transform.setOrigin(tf::Vector3(String2Float(argStrVec.at(0)),String2Float(argStrVec.at(1)),String2Float(argStrVec.at(2))));
    tf::Quaternion quaternion;
    quaternion.setRPY(String2Float(argStrVec.at(5)),String2Float(argStrVec.at(4)),String2Float(argStrVec.at(3)));
    transform.setRotation(quaternion);
    stampedTransformMap[argStrVec.at(6)]=tf::StampedTransform(transform,ros::Time::now(),argStrVec.at(6),argStrVec.at(7));
	
	//输出launch文件中记录的坐标系转换关系
    std::cout<<stampedTransformMap[argStrVec.at(6)].getOrigin().x()<<","<<stampedTransformMap[argStrVec.at(6)].getOrigin().y()<<","<<stampedTransformMap[argStrVec.at(6)].getOrigin().z()<<",";
    std::cout<<stampedTransformMap[argStrVec.at(6)].getRotation().getW()<<","<<stampedTransformMap[argStrVec.at(6)].getRotation().getX()<<","<<stampedTransformMap[argStrVec.at(6)].getRotation().getY()<<","<<stampedTransformMap[argStrVec.at(6)].getRotation().getZ()<<std::endl;
  }
  
  delete doc; //删除对象
  doc = NULL; //避免野指针

  ros::spin();
  return 0;
}

Este archivo puede ser utilizado TinyXML2 Nodo Lanzamiento de análisis (en formato XML) la función presente en el paquete, el archivo se encuentra catkin_ws / src / tinyxml_test / lanzamiento / archivos en el directorio test.launch, y en donde el resultado final pueden ser guardados de acuerdo para poner en marcha un archivo de lectura coordenadas tf información de conversión. test.launchContenido del archivo son los siguientes:

<?xml version="1.0"?>
<launch>
  <node pkg="tf" type="static_transform_publisher" name="sensor_frame_to_world" args="2 2 2 0 0 0 world sensor_frame 100" />
  <node pkg="tf" type="static_transform_publisher" name="imu_to_sensor_frame" args="0 0 0 0 0 0 sensor_frame imu 100" />
  <node pkg="tf" type="static_transform_publisher" name="lidar_to_sensor_frame" args="1 1 1 0 0 0 sensor_frame lidar 100" />
</launch>

Para compilar el paquete de características, también tiene que modificar su archivo CMakeLists.txt, añadir el paquete de características es necesario, el directorio que contiene el código fuente y las bibliotecas, etcétera. El contenido completo del archivo son los siguientes:

cmake_minimum_required(VERSION 2.8.3)
project(tinyxml_test)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  roscpp
  roslib
  tf
)

###################################
## catkin specific configuration ##
###################################

catkin_package(
  LIBRARIES 
    ${PROJECT_NAME}
  CATKIN_DEPENDS
   roscpp tf
)

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
  ${catkin_INCLUDE_DIRS}
)

## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(${PROJECT_NAME}_node src/tinyxml_test_node.cpp)

## Specify libraries to link a library or executable target against
target_link_libraries(${PROJECT_NAME}_node
  -ltinyxml2
  ${catkin_LIBRARIES}
)

#############
## Install ##
#############

## Mark executables and/or libraries for installation
install(
  TARGETS 
    ${PROJECT_NAME}_node
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

Nota: Debido a que el programa tiene que llamar biblioteca de terceros TinyXML2, es necesario en el archivo CMakeLists.txt find_packageañadir opciones roslibFeature Pack, y target_link_librariesespecificar el enlace a la opción de biblioteca estática ( -ltinyxml2).

Por último, ejecute el comando catkin_makepaquete de características voluntad después de una compilación correcta, utilice el siguiente comando para ejecutar el nodo (para ser ejecutado por adelantado roscorenodo):

$ rosrun tinyxml_test tinyxml_test_node 

Poner en marcha los archivos de salida del programa pueden almacenados tf coordinar la información de conversión:
Aquí Insertar imagen Descripción
ya está!

Publicado 48 artículos originales · alabanza won 65 · Vistas a 70000 +

Supongo que te gusta

Origin blog.csdn.net/xiaolong361/article/details/94634611
Recomendado
Clasificación