TF 좌표 변환

ROS 꼬마 거북이가 따라옵니다


5.1 TF 좌표 변환·Autolabor-ROS 로봇 입문 과정 "ROS 이론 및 실습" 제로 기반 튜토리얼

tf 모듈: ROS에서 서로 다른 좌표계 간의 점이나 벡터를 변환하는 데 사용됩니다.

ROS에서 좌표 변환은 원래 tf에 해당했지만, 하이드로 버전부터 tf는 폐기되고 더 간결하고 효율적인 tf2로 마이그레이션되었습니다. tf2에 해당하는 일반적인 기능 패키지는 다음과 같습니다.

tf2_geometry_msgs: ROS 메시지를 tf2 메시지로 변환할 수 있습니다.

tf2: 좌표 변환을 위한 공통 메시지를 캡슐화합니다.

tf2_ros: tf2에 대한 roscpp 및 rospy 바인딩을 제공하여 좌표 변환에 일반적으로 사용되는 API를 캡슐화합니다.

좌표계: ROS에서는 객체가 좌표계를 통해 교정되는데, 정확하게 말하면 오른손 좌표계를 통해 교정됩니다.

1. 코디네이터 메시지

구독 및 게시 모델의 데이터 캐리어 메시지는 중요한 구현입니다. 먼저 좌표 변환 구현에서 일반적으로 사용되는 메시지를geometry_msgs/TransformStamped  이해해야 합니다 . geometry_msgs/PointStamped

전자는 좌표계와 관련된 위치정보를 전송하는데 사용되고, 후자는 특정 좌표계의 좌표점에 대한 정보를 전송하는데 사용된다. 좌표 변환에서는 좌표계의 상대적인 관계와 좌표점 정보가 필요한 경우가 많습니다.

2. 정적 좌표 변환

소위 정적 좌표 변환은 두 좌표계 간의 상대 위치가 고정되어 있음을 의미합니다.

tf2 tf2_ros tf2_geometry_msgs roscpp rospy std_msgs 기하학_msgs 에 의존하는 프로젝트 함수 패키지 생성

하위 좌표계와 상위 좌표계 간의 관계와 좌표 변환 함수 변환() 에서 사용하는 방법  에 주의하세요.

3. 동적 좌표 변환

소위 동적 좌표 변환은 두 좌표계 간의 상대적 위치가 변경되는 것을 의미합니다.

Turtlesim_node를 시작합니다 . 이 노드의 형태는 세계 좌표계(왼쪽 하단이 좌표계의 원점)를 가지며, 거북이는 또 다른 좌표계입니다. 키보드는 거북이의 움직임을 제어하고 거북이의 상대 위치를 동적으로 게시합니다. 두 개의 좌표계.

tf2 tf2_ros tf2_geometry_msgs roscpp rospy std_msgs 기하학_msgs Turtlesim 에 의존하는 프로젝트 함수 패키지 생성

Turtle1/pose 를 구독하면 세계 좌표계에서 거북이의 x좌표, y좌표, 오프셋, 선속도, 각속도를 얻을 수 있습니다.

ros::Subscriber sub = nh.subscribe<turtlesim::Pose>("/turtle1/pose",1000,callback);


void callback(const turtlesim::Pose::ConstPtr& pose){
    
    geometry_msgs::TransformStamped tfs;
    //  |----头设置
    tfs.header.frame_id = "world";
    tfs.header.stamp = ros::Time::now();

    //  |----坐标系 ID
    tfs.child_frame_id = "turtle1";

    //  |----坐标系相对信息设置
    tfs.transform.translation.x = pose->x;
    tfs.transform.translation.y = pose->y;
    tfs.transform.translation.z = 0.0; // 二维实现,pose 中没有z,z 是 0
}

4.다중좌표변환

기존 좌표계인 상위 좌표계 월드에는 두 개의 하위 레벨 시스템인 son1, son2가 있으며, 월드를 기준으로 한 son1과 월드를 기준으로 한 son2의 관계를 알고 있습니다. son2에서 son1의 원점 좌표를 찾습니다. son2의 점 좌표를 찾으려면 son1의 점 좌표가 필요합니다.

tf2 tf2_ros tf2_geometry_msgs roscpp rospy std_msgs 기하학_msgs Turtlesim 에 의존하는 프로젝트 함수 패키지 생성

정적 좌표 변환을 사용하여 세계를 기준으로 son1 및 son2의 좌표 관계를 게시합니다.

<launch>
    <node pkg="tf2_ros" type="static_transform_publisher" name="son1" args="0.2 0.8 0.3 0 0 0 /world /son1" output="screen" />
    <node pkg="tf2_ros" type="static_transform_publisher" name="son2" args="0.5 0 0 0 0 0 /world /son2" output="screen" />
</launch>

son2를 기준으로 son1의 점 좌표를 분석합니다. 

geometry_msgs::TransformStamped tfs = buffer.lookupTransform("son2","son1",ros::Time(0));
ROS_INFO("Son1 相对于 Son2 的坐标关系:父坐标系ID=%s",tfs.header.frame_id.c_str());
ROS_INFO("Son1 相对于 Son2 的坐标关系:子坐标系ID=%s",tfs.child_frame_id.c_str());
ROS_INFO("Son1 相对于 Son2 的坐标关系:x=%.2f,y=%.2f,z=%.2f",
         tfs.transform.translation.x,
         tfs.transform.translation.y,
         fs.transform.translation.z
         );

그런 다음 좌표를 분석하고 son2에서 점의 좌표를 찾습니다.

geometry_msgs::PointStamped ps;
ps.header.frame_id = "son1";
ps.header.stamp = ros::Time::now();
ps.point.x = 1.0;
ps.point.y = 2.0;
ps.point.z = 3.0;

geometry_msgs::PointStamped psAtSon2;
psAtSon2 = buffer.transform(ps,"son2");
ROS_INFO("在 Son2 中的坐标:x=%.2f,y=%.2f,z=%.2f",
         psAtSon2.point.x,
         psAtSon2.point.y,
         psAtSon2.point.z
         );

5. 좌표계 관계 보기

输入下面命令기능 패키지가 포함되어 있는지 확인하세요.

rospack find tf2_tools

그렇지 않은 경우 다음 명령을 사용하여 설치하십시오.

sudo apt install ros-noetic-tf2-tools

좌표계 방송 프로그램을 시작한 후 다음 명령을 실행하십시오.

rosrun tf2_tools view_frames.py

프레임.pdf 파일이 현재 디렉터리에 생성됩니다.

6. TF 좌표 변환의 실제 동작

거북이 두 마리가 생성되는데 가운데 거북이(A)와 왼쪽 아래 거북이(B) B가 자동으로 A의 위치로 달려갑니다. 키보드로 제어하면 A의 움직임만 제어하지만 B는 A를 따라갈 수 있습니다.

명령을 입력하다

rosrun turtlesim turtlesim_node

 

이때는 작은 거북이 한 마리만 나타나는데, 키보드로 제어되지 않고 첫 번째 작은 거북이의 움직임을 따라가는 두 번째 작은 거북이를 만드는 방법은 무엇일까요? 우리는 rosservice를 사용해야 하고 주제는 generate를 사용합니다.

두 번째 작은 거북이를 생성한 후 해야 할 일은 두 개의 작은 거북이의 포즈 정보를 구독하여 좌표 정보로 변환한 후 두 번째 작은 거북이를 기준으로 한 첫 번째 작은 거북이의 좌표 정보를 얻는 것입니다. 여기서는 Turtle2를 기준으로 Turtle1의 좌표 정보를 반전시키지 말고 마지막으로 첫 번째 거북이를 따라가도록 두 번째 거북이에 해당 속도 정보를 게시합니다.

5.1.6 TF 좌표 변환 실습·Autolabor-ROS 로봇 입문 과정 "ROS 이론 및 실습" 제로 기반 튜토리얼

 7.TF2와 TF

TF2가 TF를 대체했습니다. TF2는 TF의 상위 집합이므로 TF 대신 TF2를 학습하는 것이 좋습니다.

TF2 함수 패키지는 응집력이 강화되었습니다. TF와 TF2가 의존하는 함수 패키지가 다릅니다. TF는 패키지에 해당하고 TF2는 및 패키지 tf에 해당합니다 . TF2에서는 다양한 유형의 API 구현이 하도급됩니다.tf2tf2_ros

TF2 구현은 TF2 정적 좌표 구현, TF2 좌표 변환 리스너의 버퍼 구현 등과 같이 더 효율적입니다.

좌표 변환은 로봇 시스템에서 매우 중요한 모듈입니다. ROS에서 TF2 구성 요소는 특별히 좌표 변환을 구현하는 데 사용됩니다. TF2 구현의 구체적인 내용은 주로 다음 부분을 소개합니다.

1. 정적 좌표 변환 브로드캐스터는 코딩 또는 내장 함수 패키지(후자가 권장됨)를 호출하여 구현할 수 있으며 상대적으로 고정된 좌표계 ​​관계에 적합합니다.

2. 동적 좌표 변환 방송사는 좌표계 간의 상대적 관계를 코딩된 방식으로 방송하며 이는 가변 좌표계 관계에 적합합니다.

3. 좌표 변환 리스너는 방송사가 방송하는 좌표계 메시지를 청취하는 데 사용되며 서로 다른 좌표계 간의 변환 또는 서로 다른 좌표계 간의 동일한 지점을 실현할 수 있습니다.

4. 로봇 시스템의 좌표계 관계는 비교적 복잡하므로 tf2_tools 툴킷을 사용하여 ros에서 좌표계 관계 다이어그램을 생성할 수도 있습니다.

추천

출처blog.csdn.net/weixin_51995147/article/details/133530575