1. 程式人生 > >ros分散式多機通訊完整教程

ros分散式多機通訊完整教程

ros多機通訊完整試坑教程

前言:

  1. 老規矩,先講講為啥要做這個專案。因為機器人上的工控機沒有辦法加顯示卡,所以無法跑TensorFlow-GPU,如果用CPU的話,一個是時間太長,二是消耗資源太多。
    所以必須得將影象處理模組,放到筆記本上。剛好看到古月居大佬的書《ros機器人開發實踐》中,介紹瞭如何設定。emmm,下面會介紹書上的一些bug。。。。
  2. 感覺現在的時間越來越不夠用了,連寫部落格的時間都不想花了。今天抽一個小時簡單記錄一下吧,希望我走過的坑,能夠給大家節約一些時間。
  3. 遇到的坑有:
    1 . 根據古月大佬書上的教程,只能實現從機的訂閱,從機並不能釋出topic到主機(host)上
    2 . 我用的是路由器無線通訊,通訊速度有問題,訂閱的話題是Kinect V2相機的資料,資料量大,頻率高,通過這種通訊方式,經常會丟包
    3 . 訂閱壓縮話題:/kinect2/hd/image_color_rect/compressed

系統介紹:

  1. 主機:移動機器人,控制主機是工控機,CPU是i5 6200U
  2. 從機:筆記本,CPU是i7 6500 ,GPU GT960M
  3. 相機:Kinect V2,連線在工控機上。
  4. 工控機連的是一個無線路由,然後讓筆記本也連上,使二者處於同一個區域網
  5. 都需要安裝openssh,這個直接 sudo apt-get install openssh 就好了
  6. 在筆記本上遠端操作工控機(主機),需要這樣:
  7. ssh [email protected]
  8. 上面的iim是你被遠端操作的工控機的使用者名稱,換成你自己的就好了,後面的IP是工控機在區域網中的IP
  9. 登入後,就可以操作launch 相機了——
  • roslaunch kinect2_bridge kinect2_bridge.launch
  • 就可以拿到話題了。接下來就可以想辦法做你需要做的事兒了

1、設定IP和~/.bashrc檔案:

  1. 先找兩臺機子的IP地址:
    ifconfig

根據這篇教程的介紹,可以知道這些東西的含義:

  • 如果電腦連線的時有線網,則顯示結果中,etho 部分的 inet addr 後面就是該電腦的 IP 地址;

  • 如果電腦連線的是無線,則 wlan0 部分的 inet addr 後就是 IP 地址。

    在這裡插入圖片描述

  1. 分別瞭解了之後,需要在兩臺機子上的/etc/hosts檔案加入對方的IP地址和對應的計算機名字
    舉例如下:
    在工控機上終端操作,或者遠端操工控機(計算機名為iim):
sudo vim /etc/hosts

這裡的筆記本(計算機名為 lyl )的IP地址是192.168.199.124,其實連到區域網的時候不是這個,因為編輯部落格,所以連的是外網。假設就是上面的那個。
然後加上這段:

192.168.199.124  lyl

前面的IP,後面的是名字,儘量對齊

之後的筆記本端的檔案整體如下:

127.0.0.1       localhost
127.0.1.1       lyl
192.168.31.124  lyl
192.168.31.182  iim
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

工控機的就不放了,差不多。
古月大佬說,最好ping一下,看看通訊是否正常:
在筆記本上

ping iim

正常就好了

  1. 設定ROS_MASTER_URI,這裡的就比較複雜。
    我剛開始按照古月的教程,首先檔案就寫錯了一個:bashrc 寫成了 bzshrc
    更重要的是,他只是在從機,也就是我這裡的筆記本上設定了這個引數,這樣的話,只能保證筆記本可以訂閱主機(工控機)的話題,但是無法釋出話題出去!
    具體的表現,可以用這個顯示:
rostopic echo /yourtopic_name

可以發現,咦,一個東西都打印不出來!
遇到這個問題,我搜了很多教程,我剛開始都以為ros不支援從機發布話題,後來直接看了官方教程,提到了雙方都得設定ROS_MASTER_URI,我才知道被坑了。

列一波搜到的有用的教程:

接著上面的來

  1. 從機-筆記本上需要設定的內容,可以看看:
    把這段加到筆記本中的 ~/.bashrc 檔案中
export ROS_HOSTNAME=lyl
export ROS_MASTER_URI=http://iim:11311

同理在主機-工控機上這個檔案中加上這段:

export ROS_HOSTNAME=iim
export ROS_MASTER_URI=http://iim:11311

設定好IP後,最好 source ~/.bashrc 重新整理一下,就可以通訊了。

第二個bug——影象話題會丟包、延遲等問題

主要原因,可能是因為用的是WiFi無線網路,頻寬有限,視訊流資料龐大,所以經常會丟包。獲取不到話題。
所以沒辦法,我只能訂閱壓縮過的話題——
/kinect2/hd/image_depth_rect/compressed
整體思路大致如下,分析直接看註釋吧,要吃飯了,我不想繼續寫了

#匯入訊息型別,壓縮的和未壓縮的
    from sensor_msgs.msg import CompressedImage
    from cv_bridge import CvBridge, CvBridgeError
    from sensor_msgs.msg import Image
    import rospy
    import numpy as np
    import cv2
    
    class Detect(object):
        def __init__(self):
            self.start_time = time.time()
            #訂閱網路壓縮話題,並且,訊息型別換成壓縮的
            self.image_sub = rospy.Subscriber("/kinect2/hd/image_color_rect/compressed",CompressedImage, self.rgb_callback,queue_size=1)
            self.depth_sub = rospy.Subscriber("/kinect2/hd/image_depth_rect/compressed",CompressedImage, self.depth_callback,queue_size=1)
            self.bridge = CvBridge()
    
        def rgb_callback(self,image):
            try:
            #嘗試轉換壓縮圖片資訊到CV2可以直接用的格式。後面加不加bgr8好像都行。
                self.rgb_image = self.bridge.compressed_imgmsg_to_cv2(image, "bgr8")
                #用上面的和下面的都行,都是會轉成rgb的圖,但是對於第二個深度圖就不合適了,只能用上面的
    #            np_arr = np.fromstring(image.data,np.uint8)
    # opencv3 is this ,and opencv2 is cv2.CV_LOAD_IMAGE_COLOR
    #            self.rgb_image = cv2.imdecode(np_arr,cv2.IMREAD_COLOR)
            except CvBridgeError as e:
                print(e)
                rospy.loginfo('convert rgb image error')
    
        def depth_callback(self,depth):
            try:
                print("depth_start:")
                self.depth_image = self.bridge.compressed_imgmsg_to_cv2(depth)
                print(self.depth_image.shape)
            except CvBridgeError as e:
                print(e)
                rospy.loginfo('convert depth image image error')

這裡的程式碼,只提供參考,應該是很難直接執行的,具體直接執行的程式碼有機會再貼出來吧。

反正通過這樣,基本上可以實現少丟包,低延遲的效果。
具體的數字,可以看看:

  1. 在工控機本地,rostopic hz /kinect2/hd/image_color_rect/compressed
  2. 大概是30Hz
  3. 在筆記本上我訂閱的頻率大概是14Hz,然後訂閱兩個的話,應該會降低一些。
  4. 而我的識別模組,大概是3Hz的頻率,所以完全可以等得起這個。

相關推薦

ros分散式通訊完整教程

ros多機通訊完整試坑教程 前言: 老規矩,先講講為啥要做這個專案。因為機器人上的工控機沒有辦法加顯示卡,所以無法跑TensorFlow-GPU,如果用CPU的話,一個是時間太長,二是消耗資源太多。 所以必須得將影象處理模組,放到筆記本上。剛好看到古月居大佬

ros 工作空間的覆蓋、c++程式設計介面實現通訊方式、自定義訊息格式、分散式通訊

工作空間的覆蓋 同一個工作空間下,不允許出現同名的功能包,否則無法編譯。不同工作空間下,允許出現同名的功能包,但會出現工作空間覆蓋的現象。 ros工作空間的路徑記錄在ROS_PACKAGE_PATH環境變數中,可以通過env命令檢視計算機中的環境變數,再利用管道過濾出有關

ros與下位通訊常用的c++ boost串列埠通訊

(執行串之前請先安裝串列埠驅動minicom) 一.首先移植c++ boost 庫: 1. 先去 Boost官網 下載最新的Boost版本, 我下載的是boost_1_63_0版本, 解壓     tar -xvf archive_name.tar.gz. 2. 進入

android ble 藍芽4.0通訊客戶端實現

自從進入軟體開發行業,都是一直在CSDN上索取無數資料,一直沒有貢獻過,今天突然想寫點什麼,第一次寫,寫點簡單的吧,不知道有沒有人看。 藍芽從4.0開始,支援了多裝置通訊,android 4.3開始支援了藍芽4.0,即 android ble關於ble 網上資料很多,也講的

UART的同步通訊和非同步通訊通訊方式,通訊,流控

    大致對UART做了一個簡單的整理。 非同步通訊: 同步通訊: 序列的單工,半雙工,全雙工: 串列埠的多機通訊: UART的RTS, CTS: 一、流控,顧名思義就是流量控制的意思。目的是協調收發雙方,使資料不會丟失。 二、

快速上手卡的分散式tensorflow

快速上手多機多卡的分散式tensorflow 終於又有時間和成果拿出來和大家分享,實在不容易,之前由於臨時更換任務加上入職事情多斷更了很久,現在主要在做一些KG和KGQA方面的工作。今天要和大家分享的是最近在工作中實現的分散式tensorflow。(BTW打個廣告~NLP和DL討論歡迎加群~二維

『TensorFlow』分散式訓練_其三_分散式

一、基本概念 Cluster、Job、task概念:三者可以簡單的看成是層次關係,task可以看成每臺機器上的一個程序,多個task組成job;job又有:ps、worker兩種,分別用於引數服務、計算服務,組成cluster。 同步更新 各個用於平行計算的電腦

西門子plc與modbus裝置進485通訊詳解(modbus輪詢)

接觸西門子s7-200一段時間後,接手一個通訊專案,需要在觸控式螢幕上顯示三臺pid溫度表的溫度。 一開始打算觸控式螢幕多餘的串列埠轉485直接連線溫度表,後來由於一直通訊不上,懷疑觸控式螢幕的問題,於是打算用plc來讀取pid表,走的是modbus協議,即port1接三臺

用rabbitmq 寫一個分散式爬蟲

                     其實說是爬蟲也只是個幌子。換成其他的耗資源的程式也成,耗CPU,耗網路。                                              1,要有被用於爬取的url,用一個client生成url,在ser

Apache JMeter壓力測試之分散式測試(聯測)

引言 利用JMeter進行負載測試的時候,使用單臺機器模擬數以千計的併發使用者有些力不從心,在執行的過程中,可能會遇到諸如CPU、記憶體負載過高,address already in use,程式自動關閉等問題。這時可以使用分散式測試,即在多臺機器上執行JMeter,以此獲

Docker Overlay網路和etcd實現容器通訊

# Mutil-host networking with etcd ## setup etcd cluster 在docker-node1上 ``` [email protected]:~$ wget https://github.com/coreos/etc

MXNet分散式配置

mxnet多機分散式配置 將一臺機器上的mxnet拷到另外兩臺機器上 scp -r /home/hzz/mxnet [email protected]:/home/hzz/mxnet 如果已經在自己的環境安裝好mxnet或者不想新建一個Pyth

分散式技術 -- Zookeeper叢集

    Hello,朋友們。我又來了。昨天因為博主的電腦出了點問題,導致沒更新文章。   

部署之定時任務完整方案

1.場景描述 老專案需要多機部署,專案中有幾十個定時任務,一旦多機部署,定時任務就會重複執行,固定ip與錯開時間方案都存在較大弊端,最終採用的方案是:AOP+排他鎖的方式,軟體老王已驗證通過,介紹下,有需要的朋友可以參考下。 2.解決方案 軟體老王基本方案是採用:AOP+排他鎖的方式。 (1)目前老專案有幾十

Linux CentOS 6 NAT 轉發 完整教程

linux centos 6 nat 轉發 完整教程網絡拓補圖:環境介紹:一臺CentOS6 主機,雙網卡,兩網段網口設定如下:[[email protected]/* */ ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=et

MVC 5 + EF6 入門完整教程14 -- 動態生成面包屑導航

maps setting i++ log item 文檔 應該 動態生成 內容 上篇文章我們完成了 動態生成多級菜單 這個實用組件。 本篇文章我們要開發另一個實用組件:面包屑導航。 面包屑導航(BreadcrumbNavigation)這個概念來自童話故事"漢賽爾和格萊特"

MVC5+EF6 入門完整教程

taf bag details 視圖 clu role pre 階段 驗證 前一陣子臨時有事,這篇文章發布間隔比較長,我們先回顧下之前的內容,每篇文章用一句話總結重點。 文章一 MVC核心概念簡介,一個基本MVC項目結構 文章二 通過開發一個最基本的登錄界面,介紹了如何從C

MVC5+EF6 入門完整教程12--靈活控制Action權限

全局 基本功 -1 str 條件 context tac 完整 suse 大家久等了。 本篇專題主要講述MVC中的權限方案。 權限控制是每個系統都必須解決的問題,也是園子裏討論最多的專題之一。 前面的系列文章中我們用到了 SysUser, SysRole, SysUserR

MVC 5 + EF6 完整教程16 -- 控制器詳解

cpp tpc 當我 出了 多個 展現 dts model類 路由規則 Controller作為持久層和展現層的橋梁, 封裝了應用程序的邏輯,是MVC中的核心組件之一。 本篇文章我們就來談談 Controller, 主要討論兩個方面: Controller運行機制簡介 C

MVC5+EF6 入門完整教程

好的 ring 改變 替換 使用 需要 註釋 mod num 本篇我們針對表格顯示添加一些新功能。 前面我們已經講解過表格顯示數據了,現在我們添加三個常用功能: 對顯示結果進行排序、過濾、分頁。 文章提綱 理論基礎/前置準備 詳細步驟 總結 前置準備 – 應