0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

如何對機器人靜態(tài)TF廣播進行管理

麥辣雞腿堡 ? 來源:古月居 ? 作者:古月居 ? 2023-11-22 17:31 ? 次閱讀

靜態(tài)TF廣播

我們說TF的主要作用是對坐標系進行管理,那就管理一個試試唄?

坐標變換中最為簡單的應該是相對位置不發(fā)生變化的情況,比如你家的房子在哪個位置,只要房子不拆,這個坐標應該就不會變化。

機器人系統(tǒng)中也很常見,比如激光雷達和機器人底盤之間的位置關系,安裝好之后基本不會變化。

在TF中,這種情況也稱之為靜態(tài)TF變換,我們來看看在程序中該如何實現(xiàn)?

運行效果

啟動終端,運行如下命令:

$ ros2 run learning_tf static_tf_broadcaster$ ros2 run tf2_tools view_frames

可以看到當前系統(tǒng)中存在兩個坐標系,一個是world,一個是house,兩者之間的相對位置不會發(fā)生改變,通過一個靜態(tài)的TF對象進行維護。

圖片

代碼解析

來看下在代碼中是如何創(chuàng)建坐標系并且發(fā)布靜態(tài)變換的。

learning_tf/static_tf_broadcaster.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居(www.guyuehome.com)@說明: ROS2 TF示例-廣播靜態(tài)的坐標變換"""import rclpy                                                                 # ROS2 Python接口from rclpy.node import Node                                                  # ROS2 節(jié)點類from geometry_msgs.msg import TransformStamped                               # 坐標變換消息import tf_transformations                                                    # TF坐標變換庫from tf2_ros.static_transform_broadcaster import StaticTransformBroadcaster  # TF靜態(tài)坐標系廣播器類class StaticTFBroadcaster(Node):    def __init__(self, name):        super().__init__(name)                                                  # ROS2節(jié)點父類初始化        self.tf_broadcaster = StaticTransformBroadcaster(self)                  # 創(chuàng)建一個TF廣播器對象        static_transformStamped = TransformStamped()                            # 創(chuàng)建一個坐標變換的消息對象        static_transformStamped.header.stamp = self.get_clock().now().to_msg()  # 設置坐標變換消息的時間戳        static_transformStamped.header.frame_id = 'world'                       # 設置一個坐標變換的源坐標系        static_transformStamped.child_frame_id  = 'house'                       # 設置一個坐標變換的目標坐標系        static_transformStamped.transform.translation.x = 10.0                  # 設置坐標變換中的X、Y、Z向的平移        static_transformStamped.transform.translation.y = 5.0                            static_transformStamped.transform.translation.z = 0.0        quat = tf_transformations.quaternion_from_euler(0.0, 0.0, 0.0)          # 將歐拉角轉(zhuǎn)換為四元數(shù)(roll, pitch, yaw)        static_transformStamped.transform.rotation.x = quat[0]                  # 設置坐標變換中的X、Y、Z向的旋轉(zhuǎn)(四元數(shù))        static_transformStamped.transform.rotation.y = quat[1]        static_transformStamped.transform.rotation.z = quat[2]        static_transformStamped.transform.rotation.w = quat[3]        self.tf_broadcaster.sendTransform(static_transformStamped)              # 廣播靜態(tài)坐標變換,廣播后兩個坐標系的位置關系保持不變def main(args=None):    rclpy.init(args=args)                                # ROS2 Python接口初始化    node = StaticTFBroadcaster("static_tf_broadcaster")  # 創(chuàng)建ROS2節(jié)點對象并進行初始化    rclpy.spin(node)                                     # 循環(huán)等待ROS2退出    node.destroy_node()                                  # 銷毀節(jié)點對象    rclpy.shutdown()

完成代碼的編寫后需要設置功能包的編譯選項,讓系統(tǒng)知道Python程序的入口,打開功能包的setup.py文件,加入如下入口點的配置:

entry_points={        'console_scripts': [            'static_tf_broadcaster = learning_tf.static_tf_broadcaster:main',        ],    },

經(jīng)過這段代碼,兩個坐標系的變化是描述清楚了,到了使用的時候,我們又該如何查詢呢?

TF監(jiān)聽

我們再來學習下如何查詢兩個坐標系之間的位置關系。

運行效果

啟動一個終端,運行如下節(jié)點,就可以在終端中看到周期顯示的坐標關系了。

$ ros2 run learning_tf tf_listener

圖片

代碼解析

這個節(jié)點中是如何查詢坐標關系的,我們來看下代碼

learning_tf/tf_listener.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居(www.guyuehome.com)@說明: ROS2 TF示例-監(jiān)聽某兩個坐標系之間的變換"""import rclpy                                              # ROS2 Python接口庫from rclpy.node import Node                               # ROS2 節(jié)點類import tf_transformations                                 # TF坐標變換庫from tf2_ros import TransformException                    # TF左邊變換的異常類from tf2_ros.buffer import Buffer                         # 存儲坐標變換信息的緩沖類from tf2_ros.transform_listener import TransformListener  # 監(jiān)聽坐標變換的監(jiān)聽器類class TFListener(Node):    def __init__(self, name):        super().__init__(name)                                      # ROS2節(jié)點父類初始化        self.declare_parameter('source_frame', 'world')             # 創(chuàng)建一個源坐標系名的參數(shù)        self.source_frame = self.get_parameter(                     # 優(yōu)先使用外部設置的參數(shù)值,否則用默認值            'source_frame').get_parameter_value().string_value        self.declare_parameter('target_frame', 'house')             # 創(chuàng)建一個目標坐標系名的參數(shù)        self.target_frame = self.get_parameter(                     # 優(yōu)先使用外部設置的參數(shù)值,否則用默認值            'target_frame').get_parameter_value().string_value        self.tf_buffer = Buffer()                                   # 創(chuàng)建保存坐標變換信息的緩沖區(qū)        self.tf_listener = TransformListener(self.tf_buffer, self)  # 創(chuàng)建坐標變換的監(jiān)聽器        self.timer = self.create_timer(1.0, self.on_timer)          # 創(chuàng)建一個固定周期的定時器,處理坐標信息    def on_timer(self):        try:            now = rclpy.time.Time()                                 # 獲取ROS系統(tǒng)的當前時間            trans = self.tf_buffer.lookup_transform(                # 監(jiān)聽當前時刻源坐標系到目標坐標系的坐標變換                self.target_frame,                self.source_frame,                now)        except TransformException as ex:                            # 如果坐標變換獲取失敗,進入異常報告            self.get_logger().info(                f'Could not transform {self.target_frame} to {self.source_frame}: {ex}')            return        pos  = trans.transform.translation                          # 獲取位置信息        quat = trans.transform.rotation                             # 獲取姿態(tài)信息(四元數(shù))        euler = tf_transformations.euler_from_quaternion([quat.x, quat.y, quat.z, quat.w])        self.get_logger().info('Get %s -- > %s transform: [%f, %f, %f] [%f, %f, %f]'           % (self.source_frame, self.target_frame, pos.x, pos.y, pos.z, euler[0], euler[1], euler[2]))def main(args=None):    rclpy.init(args=args)                       # ROS2 Python接口初始化    node = TFListener("tf_listener")            # 創(chuàng)建ROS2節(jié)點對象并進行初始化    rclpy.spin(node)                            # 循環(huán)等待ROS2退出    node.destroy_node()                         # 銷毀節(jié)點對象    rclpy.shutdown()                            # 關閉ROS2 Python接口

完成代碼的編寫后需要設置功能包的編譯選項,讓系統(tǒng)知道Python程序的入口,打開功能包的setup.py文件,加入如下入口點的配置:

entry_points={        'console_scripts': [            'static_tf_broadcaster = learning_tf.static_tf_broadcaster:main',            'tf_listener = learning_tf.tf_listener:main',        ],    },

好啦,大家現(xiàn)在對TF的基本使用有所了解了。我們繼續(xù)挑戰(zhàn)兩只海龜跟隨的案例。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 機器人
    +關注

    關注

    210

    文章

    28103

    瀏覽量

    205849
  • 坐標系
    +關注

    關注

    0

    文章

    29

    瀏覽量

    7270
  • 程序
    +關注

    關注

    116

    文章

    3756

    瀏覽量

    80751
  • ROS
    ROS
    +關注

    關注

    1

    文章

    276

    瀏覽量

    16942
收藏 人收藏

    評論

    相關推薦

    機器人餐廳

    機器人、地面送餐機器人、空中傳菜機器人、迎賓機器人等20個各式機器人。它們長相色彩各異,個頭1.3至1.6米不等,可以呈現(xiàn)10多種面部表情,
    發(fā)表于 07-26 09:11

    什么是工業(yè)機器人

    機械手之間有防護墻隔開,操作者可通過觀察窗或閉路電視對從機械手操作機進行有效的監(jiān)視,主從機械手系統(tǒng)的出現(xiàn)為機器人的產(chǎn)生為近代機器人的設計與制造作了鋪墊。1954年美國戴沃爾最早提出了工業(yè)機器人
    發(fā)表于 01-19 10:58

    機器人視覺——機器人的“眼睛”

    目前產(chǎn)業(yè)機器人僅能在嚴格定義的結(jié)構(gòu)化環(huán)境中執(zhí)行預定指令動作,缺乏對環(huán)境的感知與應變能力,這極大地限制了機器人的應用。利用機器人的視覺控制,不需要預先對產(chǎn)業(yè)機器人的運動軌跡
    發(fā)表于 01-23 15:02

    【MiCOKit申請】智能管理機器人(家庭廣泛使用)

    申請理由:目前,人們大多數(shù)處于工作的忙碌中,待在家里的時間是很短的,家里有很多東西需要去實時管理維護,我們不可能每天工作時回家,那要怎么辦呢?當然,使用一臺智能管理機器人便可,我們可以通過互聯(lián)網(wǎng)在
    發(fā)表于 08-09 17:57

    語義機器人

    客服機器人系統(tǒng)、智能硬件和機器人的對話系統(tǒng)建設,能讓人機對話的過程變得更加自然流暢;另外還可以接入類似幼兒教育、聽廣播、訂機票等外部服務,功能可以無限擴展。
    發(fā)表于 03-10 16:52

    辰漢-如何實現(xiàn)服務機器人的運算與控制

    的核心系統(tǒng)。攝像頭采集視頻圖像,會對圖像中的事物進行一些簡單的判別,比如識別人臉,對靜態(tài)事物的圖像采集也能讓機器人辨別障礙物,或者計算出靜態(tài)事物的大致幾何圖形甚至尺寸,對動態(tài)事物的圖像
    發(fā)表于 06-09 17:18

    機器人、協(xié)作機器人和移動機器人,你分的清楚嗎

    、激光掃描儀等。目的是把機器人與人分開。所有安全性都可以根據(jù)機械安全標準ISO 13849和IEC 62061(IEC 61508的機械解釋)進行設計COBOT表示協(xié)作機器人。它們是被設計為與人交互
    發(fā)表于 10-30 11:33

    工業(yè)機器人的技術原理

    及以太網(wǎng)的聯(lián)網(wǎng)功能??捎糜?b class='flag-5'>機器人控制器之間和機器人控制器同上位機的通訊,便于對機器人生產(chǎn)線進行監(jiān)控、診斷和管理?! 」I(yè)
    發(fā)表于 11-23 10:40

    機器人系統(tǒng)是什么?

    機器人的移動通常是從管理機器人總體任務進度的中央處理器發(fā)出位置變化請求時開始的。導航系統(tǒng)通過制定行程計劃或軌跡以開始執(zhí)行位置變化請求。行程計劃需考慮可用路徑、已知障礙位置、機器人能力及
    發(fā)表于 09-10 10:44

    使用旅游機器人需要注意哪些問題?

    決消費者的咨詢問題,機器人就是一個很好的載體。機器人甚至可以把客戶基本的需求都解決了?! ∪缃竦娜四樧R別越來越成熟,機器人的人臉識別也會成為標配,因而,機器人可以通過人臉識別對訪客
    發(fā)表于 06-12 17:04

    機器人是什么?

    自主機器人。這些都是機器人的智能藝術。除了這個被廣泛接受的分類,機器人可以根據(jù)它們的運動方式和工作環(huán)境進行分類,如輪式機器人、腿式
    發(fā)表于 03-31 10:31

    輪式機器人怎么樣

    ,人類友好型機器人開始在實體店進行實時盤點,這使得超市能夠減少每種產(chǎn)品的貨架空間,并增加給定時間內(nèi)可以攜帶的庫存量。輪式機器人甚至可以進軍賓館,提供從入住到客房服務的接待服務。 對于這些輪式
    發(fā)表于 11-09 07:49

    掃地機器人系統(tǒng)的解決方案分享

    掃地機器人典型應用是四節(jié)鋰電池串聯(lián)使用。電池管理分為電池保護以及充電管理兩個部分。如下圖所示, 電池保護部分一般會設計在電池包里面,針對電池在各種工況下的異常情況進行診斷和保護。 充電
    發(fā)表于 11-10 06:05

    Redzone Robotics的Solo機器人進行管道檢測

    Redzone Robotics的Solo機器人是完全自主的下水道管道檢測機器人,可以節(jié)省成本并限制道路封閉,從而節(jié)省成本。
    的頭像 發(fā)表于 11-28 06:57 ?3232次閱讀

    機器人TF電機要求有哪些

    TF電機在機器人應用中非常多,如機器人的關節(jié)活動、行走、各種動作等等都是需要微型電機來驅(qū)動的。拋開大型的機器人不說,小型的機器人就需要用到
    發(fā)表于 06-25 18:40 ?1330次閱讀