精华内容
下载资源
问答
  • 2022-02-14 12:33:36

    目录

    坐标变换的数学基础

    多坐标变换与静态/动态坐标变换的不同之处

    tf坐标转换的实质

    多坐标变换

    静态/动态坐标变换

    坐标系相对关系的发布

    命令行形式:another_static_pub.launch

    发布方发布

    坐标转换:another_static_sub.cpp

    项目组织结构

     运行结果


    坐标变换的数学基础

    四元数:

    彻底搞懂“旋转矩阵/欧拉角/四元数”,让你体会三维旋转之美_超级霸霸强的博客-CSDN博客https://blog.csdn.net/weixin_45590473/article/details/122884112旋转矩阵:

    坐标变换最通俗易懂的解释(推到+图解)_超级霸霸强的博客-CSDN博客https://blog.csdn.net/weixin_45590473/article/details/122848202

    多坐标变换与静态/动态坐标变换的不同之处

    tf坐标转换的实质

    你也许会被静态/动态/多坐标转换弄晕了头,但是你只要认清坐标转换的实质就会恍然大悟。无论是哪种坐标转换,其实质就是利用tf2_ros::Buffer类对象中缓存的坐标间的相互关系将坐标点基于X坐标系的坐标转化至基于Y坐标系的坐标。

    多坐标变换

    我们以坐标系A、坐标系B、坐标系C、坐标系D三个坐标系相互转化为例进行说明:

    准确的来说lookupTransfrom函数的作用是取得树状图中两个从未有联系的坐标系得相对关系(补齐树状图,使树状图中的每对元素都可以两两建立联系):坐标系C与坐标系D的相对关系。可以取得树状图中已经建立联系的坐标系间的相对关系吗?可以,但是没有什么必要,如果我们仅仅使用已知的坐标系关系那么lookupTransfrom函数有无均可。

    静态/动态坐标变换

    我们会发现:两者都有的地方就是“调用transfrom函数进行坐标转换”。此外,两者不同之处在于坐标系间的转换关系获取,多坐标系转换中需要调用lookupTransfrom函数对buffer缓冲区内的数据进行复杂计算得到任意两个坐标系的转换关系,而静态/动态坐标系转换关系只需订阅static_tf话题即可得到。

    坐标系相对关系的发布

    坐标系相对关系的发布有两种形式:命令行形式和编写发布方源码。

    命令行形式:another_static_pub.launch

    <launch>  
        <node pkg="tf2_ros" name="son1" type="static_transform_publisher" args="1 2 3 10 30 20 /world /son1" output="screen"/>  
        <node pkg="tf2_ros" name="son2" type="static_transform_publisher" args="-1 -5 2 40 10 50 /world /son2" output="screen"/>  
        <node pkg="tf2_ros" name="son3" type="static_transform_publisher" args="-1 -5 2 40 10 50 /son1 /son3" output="screen"/>  
    </launch> 

    上述形成的坐标系关系树状图如下所示:

    注意:

    当我们使用命令行工具向static_tf话题传送坐标系相对位置信息时,全部的坐标系不管如何相互联系最终都必须与world世界坐标系(世界坐标系是tf2中系统内定的全局参考坐标系)建立相互关系!

    发布方发布

    一个发布方只能发布使用tf2_ros:: StaticTransformBroadcaster::sendTransfrom函数发送一对坐标系的相对关系:

    #include "ros/ros.h"  
    #include "tf2_ros/static_transform_broadcaster.h"  
    #include "tf2/LinearMath/Quaternion.h"  
    #include "geometry_msgs/TransformStamped.h"  
      
    int main(int argc,char* argv[])  
    {  
        setlocale(LC_ALL,"");  
        // initial the node  
        ros::init(argc,argv,"static_pub");  
        // create publisher  
        tf2_ros::StaticTransformBroadcaster pub;  
        // organize the data  
        geometry_msgs::TransformStamped data;  
        data.header.frame_id = "base_link";  
        data.header.stamp = ros::Time::now();  
        data.child_frame_id = "laser";  
        // set translation  
        data.transform.translation.x = 0.1;  
        data.transform.translation.y = 0.5;  
        data.transform.translation.z = 0.3;  
        // set rotation  
        tf2::Quaternion qtn;  
        qtn.setRPY(30,10,5);  
        data.transform.rotation.w = qtn.getW();  
        data.transform.rotation.x = qtn.getX();  
        data.transform.rotation.y = qtn.getY();  
        data.transform.rotation.z = qtn.getZ();  
        // publish data  
        ros::Rate rate(1);  
        while(ros::ok()){  
            pub.sendTransform(data);  
            rate.sleep();  
        }  
        return 0;  
    }  

    坐标转换:another_static_sub.cpp

    #include "ros/ros.h"  
    #include "tf2_ros/buffer.h"  
    #include "tf2_geometry_msgs/tf2_geometry_msgs.h"  
    #include "tf2_ros/transform_listener.h"  
    #include "geometry_msgs/TransformStamped.h"  
    #include "geometry_msgs/PointStamped.h"  
      
    int main(int argc,char* argv[])  
    {  
        setlocale(LC_ALL,"");  
        ros::init(argc,argv,"another_static_sub");  
        tf2_ros::Buffer buffer;  
        tf2_ros::TransformListener listener(buffer);  
      
        ros::Rate rate(1);  
        while(ros::ok()){  
            try  
            {  
                // 对buffer中坐标系两两之间的关系全部计算出来存入buffer和变量Son12Son2中  
                geometry_msgs::TransformStamped Son12Son2 = buffer.lookupTransform("son2","son1",ros::Time(0));  
                geometry_msgs::PointStamped PointInSon1;  
                PointInSon1.header.frame_id = "son3";  
                PointInSon1.header.stamp = ros::Time(); // ros::Time(0)或者ros::Time()均可  
                PointInSon1.point.x = 1;  
                PointInSon1.point.y = 2;  
                PointInSon1.point.z = 3;  
                // 调用buffer中坐标系son2和坐标系son1之间的转换关系计算坐标点基于son2坐标系的坐标  
                geometry_msgs::PointStamped PointInSon2 = buffer.transform(PointInSon1,"son2");  
                ROS_INFO("PointInSon2:%f,%f,%f",PointInSon2.point.x,PointInSon2.point.y,PointInSon2.point.z);  
            }  
            catch(const std::exception& e)  
            {  
                std::cerr << e.what() << '\n';  
            }  
            rate.sleep();  
        }  
        return 0;  
    }  

    注意:

    该句程序中的Son12Son2变量虽然没被使用到,但是该句必须有。因为lookupTransfrom函数的作用不仅是输出一个表示坐标系转换关系的数据类型,同时也将表征着坐标系转换关系的数据类型存入buffer中。也就是说没有这一句,那么buffer就没有坐标系son1到son2的转换关系,进而transfrom函数也就无法调用坐标系转换关系完成坐标点坐标的转换。

    为何不使用一个CPP源文件去完成坐标变换呢? 

    为何不可以使用一个CPP源文件去完成坐标变换?_超级霸霸强的博客-CSDN博客icon-default.png?t=M1H3https://blog.csdn.net/weixin_45590473/article/details/123015364

    项目组织结构

     运行结果

    更多相关内容
  • 针对目前2000国家大地坐标系下矿山测量坐标转换应用软件普遍较少情况,利用VB6.0平台开发了2000国家大地坐标系下包括高斯正反算和换带计算功能的坐标转换程序。通过代码调试和数据计算验证可知,高斯正算和换带计算均...
  • 实现任意二维坐标系之间的相互转换,包括直接法与最小二乘法优化两种方法。注释详细,同时可以参考博主博客解析 https://blog.csdn.net/wxc_1998/article/details/118853843
  • 主要介绍了在OpenCV里实现极坐标变换功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 用matlab实现对坐标变换的仿真,坐标系O1在O0中的初始位置已知,此后坐标系O1在圆周P上运动,运动过程中其x轴始终指向圆心,求固连在坐标系O1上的矩形ABCD的实时位姿。
  • 在数据采集及处理显示分别使用极坐标和直角坐标的系统中,实现极坐标到直角坐标转换时,数据量大且效率不高.提出了基于现场可编程门阵列(FPGA)实现坐标转换的方法,并采用查找表方式对其进行了改进,缩小了存储器...
  • 这个不是现成的工具,而是具体的C语言代码功能实现。利用C语言实现了大地坐标系和空间直角坐标系的相互转换,以及求解七参数的值的方法。
  • 最新2000坐标转换转换功能强大,坐标转换,54坐标系、80坐标系、2000坐标系,相互转换,免费
  • CoorTrans坐标转换程序

    2019-04-15 21:52:20
    坐标转换程序,投影正反算,布尔沙七参数计算,七参数坐标转换,投影换带,大地坐标系、投影坐标系、空间直角坐标系的任意互转。
  • 经纬高(LBH)坐标与北天东坐标转换程序,仅用于学习交流,请勿用于商业用途和其他用途。如需用于非学习交流用途,请先私信联系我。
  • Simulink仿真电机矢量控制时坐标变换分析及数学模型的建立,包括三相静止坐标到两相静止坐标、两相旋转坐标及其他们的反变换,包含了具体的仿真模型详细建立过程。
  • 慕尼黑工大出的史上最全坐标转换工具箱,包含最常用的投影变换功能、七参数布尔沙模型等,强烈推荐!
  • #资源达人分享计划#
  • 通过一个以上的控制点,计算四参数转换参数,并利用转换参数将其他测量点转换成不同的坐标系下的坐标! 通过一个以上的控制点,计算四参数转换参数,并利用转换参数将其他测量点转换成不同的坐标系下的坐标
  • 火星坐标转换经纬度,火星坐标转换软件工具【支持批量】 火星坐标转换工具,支持批量转换 火星坐标转换到地球坐标 地球坐标转换到火星坐标 批量转换工具
  • C#实现坐标转换

    2018-09-15 15:14:50
    通过C#窗体程序实现任意坐标转换到54坐标系,80坐标系,54坐标转换到80坐标系。
  • XCFRAME可以在空间物理学和航空航天应用中使用的许多以地心和日心为中心的坐标系之间转换位置。 对于 ECEF <-> ECI 转换,还支持速度和加速度。 可以在笛卡尔 (x, y, z) 或球面(方位... 坐标变换基于 Mike Hapgood
  • 世界坐标—物体坐标之间的变换矩阵及齐次表示 问题: 在描述物体或点所在位置时, 我们往往只使用(世界)坐标系来表示. 然而在某些特殊的 情况下, 比如刚体的某个特征点相对刚体并不会运动, 此时如果使用物体坐标系, ...
  • 此脚本用于将给定的图像从笛卡尔坐标转换为极坐标
  • 三维空间坐标转换

    2018-09-18 12:08:54
    介绍三维中如何进行地理坐标与空间坐标之间的转换
  • 主要介绍了运用Excel表格完成GPS测定结果的WGS-84坐标系与北京1954坐标系的坐标变换方法,证明使用Excel软件进行GPS坐标转换、高斯投影等数据处理是可行的,也是高效的,可供同行参考。
  • 坐标转换是空间实体的位置描述,是从一种坐标系统变换到另一种坐标系统的过程。通过建立两个坐标系统之间一一对应关系来实现。坐标转换问题的详细了解对于测量很重要,也是测绘专业人员必须了解掌握的一项基本知识。...
  • 坐标转换源代码

    2016-05-22 19:16:19
    坐标转换源代码
  • 批量点,矩阵形式给出,MATLAB经纬度坐标转换为平面坐标;Mercator投影变换。调用单点经纬度坐标转换为平面坐标的函数也在文件中。博客中有详细解释和C++代码...
  • 1、坐标转换:空间直角坐标,大地坐标,平面坐标转换。 2、经纬度转换:(地理坐标)经纬度与(大地坐标)xy相互转化,3度带与6度带坐标相互转化,度(十进制)与度分秒相互转化
  • 利用matlab编写的大地坐标BLH和空间直角坐标XYZ转换程序
  • 支持GPS WGS84 国家2000 西安80 北京54坐标系的大地、经纬度坐标和平面坐标之间的转换,换带计算,不同坐标系之间的7参数、4参数转换 注意:运行时,杀毒软件可能会提示存在木马,这是授权机制引起的,请忽略,或者...
  • matlab坐标转换

    2016-09-19 21:00:59
    matlab
  • 坐标转换小工具,支持百度坐标系,火星坐标系,WGS84之间的互转,批量转换,非常实用的小工具,对于GIS互联网行业地图很有帮助
  • 坐标转换包括三参数、七参数、仿射变换(线性)等转换方式;源坐标和目标坐标可设置,包括椭球、投影方式和坐标类型(大地坐标、平面坐标和空间直角坐标)。 <br>GPS高程包括12种拟合方法。 <br>测量工具多多...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 385,099
精华内容 154,039
关键字:

坐标变换