ros分散式多機通訊完整教程
ros多機通訊完整試坑教程
前言:
- 老規矩,先講講為啥要做這個專案。因為機器人上的工控機沒有辦法加顯示卡,所以無法跑TensorFlow-GPU,如果用CPU的話,一個是時間太長,二是消耗資源太多。
所以必須得將影象處理模組,放到筆記本上。剛好看到古月居大佬的書《ros機器人開發實踐》中,介紹瞭如何設定。emmm,下面會介紹書上的一些bug。。。。 - 感覺現在的時間越來越不夠用了,連寫部落格的時間都不想花了。今天抽一個小時簡單記錄一下吧,希望我走過的坑,能夠給大家節約一些時間。
- 遇到的坑有:
1 . 根據古月大佬書上的教程,只能實現從機的訂閱,從機並不能釋出topic到主機(host)上
2 . 我用的是路由器無線通訊,通訊速度有問題,訂閱的話題是Kinect V2相機的資料,資料量大,頻率高,通過這種通訊方式,經常會丟包
3 . 訂閱壓縮話題:/kinect2/hd/image_color_rect/compressed
系統介紹:
- 主機:移動機器人,控制主機是工控機,CPU是i5 6200U
- 從機:筆記本,CPU是i7 6500 ,GPU GT960M
- 相機:Kinect V2,連線在工控機上。
- 工控機連的是一個無線路由,然後讓筆記本也連上,使二者處於同一個區域網
- 都需要安裝openssh,這個直接 sudo apt-get install openssh 就好了
- 在筆記本上遠端操作工控機(主機),需要這樣:
ssh [email protected]
- 上面的iim是你被遠端操作的工控機的使用者名稱,換成你自己的就好了,後面的IP是工控機在區域網中的IP
- 登入後,就可以操作launch 相機了——
roslaunch kinect2_bridge kinect2_bridge.launch
- 就可以拿到話題了。接下來就可以想辦法做你需要做的事兒了
1、設定IP和~/.bashrc檔案:
- 先找兩臺機子的IP地址:
ifconfig
根據這篇教程的介紹,可以知道這些東西的含義:
-
如果電腦連線的時有線網,則顯示結果中,etho 部分的 inet addr 後面就是該電腦的 IP 地址;
-
如果電腦連線的是無線,則 wlan0 部分的 inet addr 後就是 IP 地址。
- 分別瞭解了之後,需要在兩臺機子上的/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
正常就好了
- 設定ROS_MASTER_URI,這裡的就比較複雜。
我剛開始按照古月的教程,首先檔案就寫錯了一個:bashrc 寫成了 bzshrc
更重要的是,他只是在從機,也就是我這裡的筆記本上設定了這個引數,這樣的話,只能保證筆記本可以訂閱主機(工控機)的話題,但是無法釋出話題出去!
具體的表現,可以用這個顯示:
rostopic echo /yourtopic_name
可以發現,咦,一個東西都打印不出來!
遇到這個問題,我搜了很多教程,我剛開始都以為ros不支援從機發布話題,後來直接看了官方教程,提到了雙方都得設定ROS_MASTER_URI,我才知道被坑了。
列一波搜到的有用的教程:
接著上面的來
- 從機-筆記本上需要設定的內容,可以看看:
把這段加到筆記本中的 ~/.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')
這裡的程式碼,只提供參考,應該是很難直接執行的,具體直接執行的程式碼有機會再貼出來吧。
反正通過這樣,基本上可以實現少丟包,低延遲的效果。
具體的數字,可以看看:
- 在工控機本地,rostopic hz /kinect2/hd/image_color_rect/compressed
- 大概是30Hz
- 在筆記本上我訂閱的頻率大概是14Hz,然後訂閱兩個的話,應該會降低一些。
- 而我的識別模組,大概是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 本篇我們針對表格顯示添加一些新功能。 前面我們已經講解過表格顯示數據了,現在我們添加三個常用功能: 對顯示結果進行排序、過濾、分頁。 文章提綱 理論基礎/前置準備 詳細步驟 總結 前置準備 – 應