<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 7.2 topic in rospy 與5.3節類似,我們用python來寫一個節點間消息收發的demo,同樣還是創建一個自定義的gps類型的消息,一個節點發布模擬的gps信息,另一個接收和計算距離原點的距離。 ## 7.2.1 自定義消息的生成 `gps.msg`定義如下: ``` string state #工作狀態 float32 x #x坐標 float32 y #y坐標 ``` 我們需要修改`CMakeLists.txt`文件,方法見5.3節,這里需要強調一點的就是,對創建的msg進行`catkin_make`會在`~/catkin_ws/devel/lib/python2.7/dist-packages/topic_demo`下生成msg模塊(module)。 有了這個模塊,我們就可以在python程序中`from topic_demo.msg import gps`,從而進行gps類型消息的讀寫。 ## 7.2.2 消息發布節點 與C++的寫法類似,我們來看topic用Python如何編寫程序,見`topic_demo/scripts/pytalker.py`: ```python #!/usr/bin/env python #coding=utf-8 import rospy #導入自定義的數據類型 from topic_demo.msg import gps def talker(): #Publisher 函數第一個參數是話題名稱,第二個參數 數據類型,現在就是我們定義的msg 最后一個是緩沖區的大小 #queue_size: None(不建議) #這將設置為阻塞式同步收發模式! #queue_size: 0(不建議)#這將設置為無限緩沖區模式,很危險! #queue_size: 10 or more #一般情況下,設為10 。queue_size太大了會導致數據延遲不同步。 pub = rospy.Publisher('gps_info', gps , queue_size=10) rospy.init_node('pytalker', anonymous=True) #更新頻率是1hz rate = rospy.Rate(1) x=1.0 y=2.0 state='working' while not rospy.is_shutdown(): #計算距離 rospy.loginfo('Talker: GPS: x=%f ,y= %f',x,y) pub.publish(gps(state,x,y)) x=1.03*x y=1.01*y rate.sleep() if __name__ == '__main__': talker() ``` 以上代碼與C++的區別體現在這幾個方面: 1. rospy創建和初始化一個node,不再需要用NodeHandle。rospy中沒有設計NodeHandle這個句柄,我們創建topic、service等等操作都直接用rospy里對應的方法就行。 2. rospy中節點的初始化并一定得放在程序的開頭,在Publisher建立后再初始化也沒問題。 3. 消息的創建更加簡單,比如gps類型的消息可以直接用類似于構造函數的方式`gps(state,x,y)`來創建。 4. 日志的輸出方式不同,C++中是`ROS_INFO()`,而Python中是`rospy.loginfo()` 5. 判斷節點是否關閉的函數不同,C++用的是`ros::ok()`而Python中的接口是`rospy.is_shutdown()` 通過以上的區別可以看出,roscpp和rospy的接口并不一致,在名稱上要盡量避免混用。在實現原理上,兩套客戶端庫也有各自的實現,并沒有基于一個統一的核心庫來開發。這也是ROS在設計上不足的地方。 ROS2就解決了這個問題,ROS2中的客戶端庫包括了`rclcpp`(ROS Clinet Library C++)、`rclpy`(ROS Client Library Python),以及其他語言的版本,他們都是基于一個共同的核心ROS客戶端庫`rcl`來開發的,這個核心庫由C語言實現。 ## 7.2.3 消息訂閱節點 見`topic_demo/scripts/pylistener.py`: ```cpp #!/usr/bin/env python #coding=utf-8 import rospy import math #導入mgs from topic_demo.msg import gps #回調函數輸入的應該是msg def callback(gps): distance = math.sqrt(math.pow(gps.x, 2)+math.pow(gps.y, 2)) rospy.loginfo('Listener: GPS: distance=%f, state=%s', distance, gps.state) def listener(): rospy.init_node('pylistener', anonymous=True) #Subscriber函數第一個參數是topic的名稱,第二個參數是接受的數據類型 第三個參數是回調函數的名稱 rospy.Subscriber('gps_info', gps, callback) rospy.spin() if __name__ == '__main__': listener() ``` 在訂閱節點的代碼里,rospy與roscpp有一個不同的地方:rospy里沒有`spinOnce()`,只有`spin()`。 建立完talker和listener之后,經過`catkin_make`,就完成了python版的topic通信模型。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看