我正在做一个有2个覆盆子pi的项目,它作为服务器和笔记本电脑作为客户端。 我已经连接到每个覆盆子和USB麦克风,并使用Portaudio Library捕获音频流 并通过tcp / ip连接将其发送回笔记本电脑。
此项目的范围是定位声源,它的工作原理如下。我在每个树莓上运行一个.c文件 连接在与PC笔记本电脑相同的LAN上。当这个程序在两个raspberryies上运行时,我有一条消息 “为客户提供等待连接”。接下来要做的就是运行matlab文件,它将启动两个覆盆子 并记录。我已经设法通过像
这样的简单条件同步启动树莓do
{
sleep(0.01);
j = read(newsockfd, &start,1 );
} while (j==0);
所以在两个树莓必须开始录制之前我暂停它们以完成初始化命令等等 然后我通过我的matlab程序发送一个字符“start ='k'” t1,t2是tcp连接
start = 'k';
fwrite (t1, k);
fwrite (t2, k);
从这一点开始,两个树莓打开PortAudio流并调用recordCallBack函数。 当我运行应用程序并拍手时,我仍然会在它们之间得到0.2秒的延迟 误差为60米。我还检查了fwrite函数的执行时间,但可能 救我大约0.05秒,这仍然会导致结果远离现实。 该项目基于TDOA测量,希望延迟在0.01秒以内,以获得精确度<1m。
我听说linux有一些非常准确的计时器,我想也许我可以使用它 计时.c文件中函数的时间。无论如何,如果你有任何关于如何衡量延迟的想法 我从matlab发送字符'k'直到麦克风或任何音频流打开的点 如何同步2个linux服务器请帮助。
ps:两者都是覆盆子2 pi并通过UTP电缆连接,因此处理和传输速率应该相同
答案 0 :(得分:2)
它看起来像一个有趣的项目,但我认为你稍微低估了这个问题。第一个问题是你需要synchonize两个传感器。鉴于声音的速度,如果您想要大约1米的精度,您需要以大约1毫秒的精度同步它们。您可以尝试使用网络时间协议,但我不确定即使使用本地网络上的主服务器也可以达到此准确性。如果您可以接收GPS信号,可以使用PTP(通过以太网)或GPS实现更好的同步。
然后,如果你设法实现这一点,第一步可能是在树莓派上记录几个手掌,保存你开始录制的时间戳,看看你是否真的获得了重要的东西。也许您还需要使用微控制器和实时操作系统!
答案 1 :(得分:1)
有许多方法可以同步时钟。它可以位于系统级或应用程序级。
系统级别往往更容易,因为已有工具可以完成这项工作。如Emilien since it is quite complicated to make it work所述,我不建议你在这个阶段做PTP。相反,我建议您使用普通setup via the same NTP network on all machines。
NTP设置示例:
# ntpdate -q 0.rhel.pool.ntp.org
# ntpdate 0.rhel.pool.ntp.org 1.rhel.pool.ntp.org
OBS:#表示root用户(这很可能意味着您需要使用
sudo
运行命令),而 $ 表示普通用户。
使用$ date +%k:%M:%S.%N
检查所有机器时间,这将使时钟返回到纳秒分辨率。
如果它没有实现所需的结果,那么尝试PTP方法,或者只是在连接到主设备时同步所有设备,主设备可以在其中规范化每个独立时钟。我不会在这里详述。
然后您可以通过TCP / IP(或者可能是UDP / IP)发送音频数据,如前所述,但始终使用clock_gettime()功能发送与音频帧关联的从机的时间戳使用CLOCK_REALTIME
作为clk_id
参数。