ROS 연구 노트 : TF 좌표 변환 및 프로그래밍 연습

ROS 연구 노트 : TF 좌표 변환 및 프로그래밍 연습

TF의 기본 개념 및 구현 방법은 이전 블로그 게시물 : ROS 연구 노트 : TF 좌표 변환 및 프로그래밍 세부 정보를 참조하십시오.

이 기사에서는 이전의 것을 기반으로 TF 프로그래밍 연습을 수행합니다.

TF 프로그래밍 : 로봇의 좌표 변환을 브로드 캐스트 및 모니터링하고, 라이더와 로봇 섀시 간의 좌표 관계를 알고, 섀시 좌표계에서 라이더 데이터의 좌표 값을 찾습니다.
여기에 사진 설명 삽입

TF의 사용 프로세스에 따라 프로그래밍합니다.

TF 방송사 프로그래밍

구현 프로세스 :

  1. ROS 노드 초기화
  2. 방송사 정의
  3. 좌표 변환 생성 관련 정보 변환 및 초기화
  4. 브로드 캐스터가 전환 정보를 게시합니다.

프로그램의 구체적인 구현은 다음과 같습니다.

#include <ros/ros.h>
#include <tf/transform_broadcaster.h>

int main(int argc, char** argv)
{
    
    
	//初始化ROS节点
	ros::init(argc, argv, "tf_broadcaster");
	ros::NodeHandle n;
	
	//声明一个tf广播器
	tf::TransformBroadcaster br;
	
	while(ros::ok())
	{
    
    
		//创建坐标变换transform
		tf::Transform transform;
		//给定平移变换值
		transform.setOrigin(tf::Vector3(0.1, 0.0, 0.2));
		//给定旋转变换值,这里没有旋转变换,所以定义四元数时无需给定角度
		transform.setRotation(tf::Quaternion(0, 0, 0, 1));
		
		//广播器发布坐标变换
		br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "base_link", "base_laser"));
	}
	
	return 0;
}

TF 모니터 프로그래밍

구현 프로세스 :

  1. ROS 노드 정보 초기화
  2. TF 리스너 선언
  3. "base_laser"에 포인트를 생성하고 해당 값을 얻습니다.
  4. 변환 정보를 얻기 위해 모니터링하고 "base_link"의 좌표 점을 얻기 위해 "base_laser"의 점을 변환합니다.

구현 세부 정보 :

#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/PoseStamped.h>

int main(int argc, char** argv)
{
    
    
	//初始化ROS节点信息
	ros::init(argc, argv, "tf_listener");
	ros::NodeHandle n;
	
	//创建TF监听器
	tf::TransformListener listener;
	
	ros::Rate rate(10.0);
	while(ros::ok())
	{
    
    
		//在base_laser上声明一个点laser_point,用来转换得到base_link上的点坐标
		geometry_msgs::PointStamped laser_point;
		laser_point.header.frame_id = "base_laser";
		//使用最近可用的转换
		laser_point.header.stamp = ros::Time();
		
		//laser_point检测点获取
		laser_point.point.x = 0.3;
		laser_point.point.y = 0.0;
		laser_point.point.z = 0.0;
		
		try
		{
    
    
			//监听获取tf变换
			listener.waitForTransform("base_link", "base_laser", ros::Time(0), ros::Duration(3.0));
			
			geometry_msgs::PointStamped base_point;
			base_point.header.frame_id = "base_link";
			listener.transformPoint("base_link", laser_point, base_point);
			
			//将坐标变换值进行打印
			ROS_INFO("Change laser_point:(%.2f, %.2f, %.2f) to base_point(%.2f, %.2f, %.2f) at Time %.2f", laser_point.point.x, laser_point.point.y, laser_point.point.z, base_point.point.x, base_point.point.y, base_point.point.z, base_point.header.stamp.toSec());
		}
		catch(tf::TransformException& ex)
		{
    
    
			ROS_ERROR("%s", ex.what());
			ros::Duration(1.0).sleep();
			continue;
		}
		rate.sleep();
	}
	return 0;
}

다음 그림은 두 가지 유형을 선언하는 "geometry_msgs / PoseStamped.h"메시지의 내용입니다. 헤더 및 포인트
여기에 사진 설명 삽입
헤더 내부
여기에 사진 설명 삽입
포인트 내부
여기에 사진 설명 삽입

시작 파일 구성

여기에 사진 설명 삽입
그런 다음 실행할 CMakeLists.txt 및 package.xml 파일을 구성하십시오.

결과는 다음과 같습니다.
여기에 사진 설명 삽입

추천

출처blog.csdn.net/moumde/article/details/104897269