• 【ROS第十三课】《TF坐标系广播与监听的编程实现》详解


    首先要知道左上角坐标是(0,11),左下角是(0,0)

    正中间位置是(5,5)

    如果turtle2从左上角出来,面向正中间的turtle1的向量差就是(5,-5)

    不要问我为什么,y值就是要+1

    而这个向量差trans的计算是由

    (trans, rot) = listener.lookupTransform("/turtle2", "/turtle1", rospy.Time(0))

    得出

    再将trans计算得出角度和直线距离

    速度 = 直线距离*0.5, 距离越近速度越慢,距离越远速度越快

    2.而listener.lookupTransform要能正常得出向量差的前提是要得出两只小乌龟的坐标,

    这时turtle_tf_broadcaster.py就派用上场了,它的作用就是不停地发出每只小乌龟相对world的坐标。有人说,直接监听两个小乌龟的turtlesim.msg.Pose然后直接计算不就可以了吗?

    当小乌龟还比较少的还确实省事,但是我们要知道真实世界我们要面对的是一个机器人大量的组件,当组件越来越多的时候,就如同小乌龟越来越多,订阅的监听器就会越来越多,而要计算任意两者之间的向量差,就要重新添加一次运算代码,复杂度就会成倍地增加。

    但有没有一种方式,每个组件各自发布自己的坐标好了(等下我们会讲到如何启动每个小乌龟的tf广播),真正想计算时再取出指定两个组件的坐标来计算他们的关系呢?当然有,就是以上我们说的那个

     (trans, rot) = listener.lookupTransform("/turtle2", "/turtle1", rospy.Time(0))

    想计算哪两个单元的向量差,随时替换就可以了。

    3 . 最后把这个向量差,指定给某个小乌龟运行起来

    turtle_vel.publish(cmd)

    4.那如何启动每个小乌龟的tf广播?

    通过start_tf_demo_py.launch我们可以观察到

    1. <node pkg = "tf_hiwonder" type = "turtle_tf_broadcaster.py" name = "tf_broadcaster1" respawn = "false" output = "screen">
    2. <param name = "turtle" type = "string" value="turtle1"/>
    3. node>
    4. <node pkg = "tf_hiwonder" type = "turtle_tf_broadcaster.py" name = "tf_broadcaster2" respawn = "false" output = "screen">
    5. <param name = "turtle" type = "string" value="turtle2"/> 
    6. node>

    我们注意到中间的param节点,

    <param name = "turtle" type = "string" value="turtle2"/>

    它对应的是turtle_tf_broadcaster.py

    turtlename = rospy.get_param("~turtle") #当上述valuse=turtle2是这里的turtlename=turtle2

    当上述valuse=turtle2,这里的turtlename=turtle2

    1. rospy.Subscriber("/%s/pose"%turtlename,
    2. turtlesim.msg.Pose,
    3. handle_turtle_pose,
    4. turtlename)

    此时就可以监听turtle2的位姿,注意这里的Subscriber第四个参数是自定义的,在后面的

    handle_turtle_pose(msg, turtlename)函数中会带进去

    5.其他关于lauch文件的注意事项:

    • type=xx.py文件如果是自己写的py要加入.py
    1. "tf_hiwonder" type = "turtle_tf_broadcaster.py"
    2. name = "tf_broadcaster2" respawn = "false" output = "screen">

    • log要打印出来,必须要output=screen,否则终端不显示的print或者rospy.loginfo函数的内容

  • 相关阅读:
    ES6 什么是模板字符串?
    干货︱部分领域数字孪生白皮书及报告汇总(附下载)
    数据库4-MGR
    相关关系与因果关系
    Java特性之设计模式【抽象工厂模式】
    Llama 3 开源了「GitHub 热点速览」
    [WPF]用HtmlTextBlock实现消息对话框的内容高亮和跳转
    【OpenVINO™】在 C# 中使用OpenVINO™ 部署PP-YOLOE实现物体检测
    当AI遇到IoT:开启智能生活的无限可能
    初见物理引擎库Cannon.js:CannonDebugRenderer的基本使用
  • 原文地址:https://blog.csdn.net/helwens/article/details/127641873