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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

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

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

靜態(tài)TF廣播

我們說(shuō)TF的主要作用是對(duì)坐標(biāo)系進(jìn)行管理,那就管理一個(gè)試試唄?

坐標(biāo)變換中最為簡(jiǎn)單的應(yīng)該是相對(duì)位置不發(fā)生變化的情況,比如你家的房子在哪個(gè)位置,只要房子不拆,這個(gè)坐標(biāo)應(yīng)該就不會(huì)變化。

機(jī)器人系統(tǒng)中也很常見(jiàn),比如激光雷達(dá)和機(jī)器人底盤(pán)之間的位置關(guān)系,安裝好之后基本不會(huì)變化。

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

運(yùn)行效果

啟動(dòng)終端,運(yùn)行如下命令:

$ ros2 run learning_tf static_tf_broadcaster$ ros2 run tf2_tools view_frames

可以看到當(dāng)前系統(tǒng)中存在兩個(gè)坐標(biāo)系,一個(gè)是world,一個(gè)是house,兩者之間的相對(duì)位置不會(huì)發(fā)生改變,通過(guò)一個(gè)靜態(tài)的TF對(duì)象進(jìn)行維護(hù)。

圖片

代碼解析

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

learning_tf/static_tf_broadcaster.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居(www.guyuehome.com)@說(shuō)明: ROS2 TF示例-廣播靜態(tài)的坐標(biāo)變換"""import rclpy                                                                 # ROS2 Python接口庫(kù)from rclpy.node import Node                                                  # ROS2 節(jié)點(diǎn)類from geometry_msgs.msg import TransformStamped                               # 坐標(biāo)變換消息import tf_transformations                                                    # TF坐標(biāo)變換庫(kù)from tf2_ros.static_transform_broadcaster import StaticTransformBroadcaster  # TF靜態(tài)坐標(biāo)系廣播器類class StaticTFBroadcaster(Node):    def __init__(self, name):        super().__init__(name)                                                  # ROS2節(jié)點(diǎn)父類初始化        self.tf_broadcaster = StaticTransformBroadcaster(self)                  # 創(chuàng)建一個(gè)TF廣播器對(duì)象        static_transformStamped = TransformStamped()                            # 創(chuàng)建一個(gè)坐標(biāo)變換的消息對(duì)象        static_transformStamped.header.stamp = self.get_clock().now().to_msg()  # 設(shè)置坐標(biāo)變換消息的時(shí)間戳        static_transformStamped.header.frame_id = 'world'                       # 設(shè)置一個(gè)坐標(biāo)變換的源坐標(biāo)系        static_transformStamped.child_frame_id  = 'house'                       # 設(shè)置一個(gè)坐標(biāo)變換的目標(biāo)坐標(biāo)系        static_transformStamped.transform.translation.x = 10.0                  # 設(shè)置坐標(biāo)變換中的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]                  # 設(shè)置坐標(biāo)變換中的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)坐標(biāo)變換,廣播后兩個(gè)坐標(biāo)系的位置關(guān)系保持不變def main(args=None):    rclpy.init(args=args)                                # ROS2 Python接口初始化    node = StaticTFBroadcaster("static_tf_broadcaster")  # 創(chuàng)建ROS2節(jié)點(diǎn)對(duì)象并進(jìn)行初始化    rclpy.spin(node)                                     # 循環(huán)等待ROS2退出    node.destroy_node()                                  # 銷毀節(jié)點(diǎn)對(duì)象    rclpy.shutdown()

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

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

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

TF監(jiān)聽(tīng)

我們?cè)賮?lái)學(xué)習(xí)下如何查詢兩個(gè)坐標(biāo)系之間的位置關(guān)系。

運(yùn)行效果

啟動(dòng)一個(gè)終端,運(yùn)行如下節(jié)點(diǎn),就可以在終端中看到周期顯示的坐標(biāo)關(guān)系了。

$ ros2 run learning_tf tf_listener

圖片

代碼解析

這個(gè)節(jié)點(diǎn)中是如何查詢坐標(biāo)關(guān)系的,我們來(lái)看下代碼

learning_tf/tf_listener.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居(www.guyuehome.com)@說(shuō)明: ROS2 TF示例-監(jiān)聽(tīng)某兩個(gè)坐標(biāo)系之間的變換"""import rclpy                                              # ROS2 Python接口庫(kù)from rclpy.node import Node                               # ROS2 節(jié)點(diǎn)類import tf_transformations                                 # TF坐標(biāo)變換庫(kù)from tf2_ros import TransformException                    # TF左邊變換的異常類from tf2_ros.buffer import Buffer                         # 存儲(chǔ)坐標(biāo)變換信息的緩沖類from tf2_ros.transform_listener import TransformListener  # 監(jiān)聽(tīng)坐標(biāo)變換的監(jiān)聽(tīng)器類class TFListener(Node):    def __init__(self, name):        super().__init__(name)                                      # ROS2節(jié)點(diǎn)父類初始化        self.declare_parameter('source_frame', 'world')             # 創(chuàng)建一個(gè)源坐標(biāo)系名的參數(shù)        self.source_frame = self.get_parameter(                     # 優(yōu)先使用外部設(shè)置的參數(shù)值,否則用默認(rèn)值            'source_frame').get_parameter_value().string_value        self.declare_parameter('target_frame', 'house')             # 創(chuàng)建一個(gè)目標(biāo)坐標(biāo)系名的參數(shù)        self.target_frame = self.get_parameter(                     # 優(yōu)先使用外部設(shè)置的參數(shù)值,否則用默認(rèn)值            'target_frame').get_parameter_value().string_value        self.tf_buffer = Buffer()                                   # 創(chuàng)建保存坐標(biāo)變換信息的緩沖區(qū)        self.tf_listener = TransformListener(self.tf_buffer, self)  # 創(chuàng)建坐標(biāo)變換的監(jiān)聽(tīng)器        self.timer = self.create_timer(1.0, self.on_timer)          # 創(chuàng)建一個(gè)固定周期的定時(shí)器,處理坐標(biāo)信息    def on_timer(self):        try:            now = rclpy.time.Time()                                 # 獲取ROS系統(tǒng)的當(dāng)前時(shí)間            trans = self.tf_buffer.lookup_transform(                # 監(jiān)聽(tīng)當(dāng)前時(shí)刻源坐標(biāo)系到目標(biāo)坐標(biāo)系的坐標(biāo)變換                self.target_frame,                self.source_frame,                now)        except TransformException as ex:                            # 如果坐標(biāo)變換獲取失敗,進(jìn)入異常報(bào)告            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é)點(diǎn)對(duì)象并進(jìn)行初始化    rclpy.spin(node)                            # 循環(huán)等待ROS2退出    node.destroy_node()                         # 銷毀節(jié)點(diǎn)對(duì)象    rclpy.shutdown()                            # 關(guān)閉ROS2 Python接口

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

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

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

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

    關(guān)注

    210

    文章

    27989

    瀏覽量

    205541
  • 坐標(biāo)系
    +關(guān)注

    關(guān)注

    0

    文章

    29

    瀏覽量

    7258
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3743

    瀏覽量

    80661
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    276

    瀏覽量

    16919
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    機(jī)器人餐廳

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

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

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

    機(jī)器人視覺(jué)——機(jī)器人的“眼睛”

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

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

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

    語(yǔ)義機(jī)器人

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

    辰漢-如何實(shí)現(xiàn)服務(wù)機(jī)器人的運(yùn)算與控制

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

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

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

    工業(yè)機(jī)器人的技術(shù)原理

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

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

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

    使用旅游機(jī)器人需要注意哪些問(wèn)題?

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

    機(jī)器人是什么?

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

    輪式機(jī)器人怎么樣

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

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

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

    Redzone Robotics的Solo機(jī)器人進(jìn)行管道檢測(cè)

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

    機(jī)器人對(duì)TF電機(jī)要求有哪些

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