前面文章已經講過分布式麥克風linux下的開發,以及在ros中的應用,也提到了實現多執行緒的方法,本文主要簡單補充一下多個單通道麥克風並行收發資料的實現。
由於ros中多程序一般是指通過多個ros節點收發資訊的方式,而多執行緒的實現僅在乙個程序(乙個節點)中就可以實現。前面博文已經說明多程序的工作機制,這裡不再說明。
這裡傳輸資料為了保證各個埠之間不會出現串擾的現象(其實不會發生),只是為了容易理解,我們將埠號和傳輸資料繫結在一起傳送(publish),這是就需要建立自己的msg資料型別,以前的博文中有專門的講述如何建立自己的msg,
如下所示:
float32 data
uint16 size
header header
int64 port
建立兩個埠號相匹配的執行緒(呼叫函式必須為(void *)型別):
pthread_t tid1,tid2;
pthread_create(&tid1,null, rx_x,& 需要傳的引數,可為null);
pthread_create(&tid1,null, rx_x,& 需要傳的引數,可為null );
while(1);
能夠看到上面呼叫的函式是同乙個函式,對的,我們需要實現的就是這種,多執行緒呼叫乙個函式時的操作。
執行緒中呼叫的函式會再次呼叫函式,看你需要的地方了。具體實現如下:
if(port == 8888)
pub.publish (msg);
fwrite (pcm ,sizeof(float) , r , pcm_file1);
fclose(pcm_file1);
// data_lock; //加鎖
// temp[0][j] = pcm[j];
// data_unlock; //解鎖
// }
}else if(port == 7777)
pub.publish(msg);
fwrite (pcm ,sizeof(float) , r , pcm_file2);
fclose(pcm_file2);
}
若是不使用繫結port的形式寫音訊資料的話會出現音訊傳輸幀之間會有錯亂的現象,這時候可以通過檔案或儲存空間加鎖解鎖的方式實現(以前博文有指出)。但是我們採用繫結port的目的在於ros的另乙個接受端可以很清楚的知道這些資料是從哪一路傳送過來的,也有助於我們再次利用這些音訊資料。
順便直接貼出接受端的訂閱topic的callback函式如下:
void callback(const jack_msgs::jackaudio::constptr& msg)
fwrite(in_shorts , sizeof(short) , data_length , pcm_file);
// fwrite(pcm , sizeof(float) , data_length , pcm_file);
jack_mtx.unlock();
}else if( msg->port == 7777 )
fwrite(in_shorts1 , sizeof(short) , data_length , pcm_file1);
jack_mtx.unlock();
}}
開發示例的流程就是這樣,當然我們在接受端也可以實現多執行緒的方式接受,這個看個人了。
另一種想法是:ros中一般能採用多程序的話最好是多程序,實在不行採用多執行緒(學習一下很有幫助)。我們也可以將上面實現的方式換一下:傳送端用多程序的方式發布多個topic,接受端用多執行緒的方式接受多個topic。既能保證同步性,還非常清晰明了。
4 7 ROS分布式通訊
ros是乙個分布式計算環境。乙個執行中的ros系統可以包含分布在多台計算機上多個節點。根據系統的配置方式,任何節點可能隨時需要與任何其他節點進行通訊。因此,ros對網路配置有某些要求 實現 1.準備 先要保證不同計算機處於同一網路中,最好分別設定固定ip,如果為虛擬機器,需要將網路介面卡改為橋接模式...
ROS分布式控制的節點配置
首先在終端中輸入下面的指令檢視ros主節點主機的ip和遠端控制端的ip ifconfig比如機械人控制器中執行著ros主節點,其ip位址為192.168.1.111,hostname為xubuntu 遠端控制端電腦ip為192.168.1.138,hostname為ubuntu.首先要確保兩台電腦能...
ROS分布式多機通訊(主從網路的設定)
在構建機械人的過程中,為了方便除錯和後期擴充套件,採用 pc 英偉達jetson nano 分布式的方式來處理資料。pc作為主機,跑網路,進行處理資料等主要工作 安裝在機械人上的英偉達jetson nano作為從機,主要用來採集各種感測器採集來的環境資料。據我了解,有些slam套件為了實現離線工作 ...