上一篇文章记录了Linux环境下UHD和GNU Radio软件的安装以及X410设备与PC的成功连接,但没想到随着自己继续摸索,发现之前竟埋下了不少坑,于是赶紧再开一篇文章来记录一下~
问题一:无法运行UHD_FFT指令
现象
在安装好uhd和gnuradio后,除了能通过uhd_find_device指令发现设备之外,还想要实际看看X410设备是否能正常运行起来,于是在官网上找到以下指令:
uhd_fft -a addr=192.168.10.2 -f 835M -s 10M
运行后报错 ,如下图所示;
原因分析
报错RuntimeError,我尝试搜索该错误信息,结果并没有搜到相关资料,同样“get_num_xbars”这个关键词也是一无所获;但是注意到这个指令运行后,调用的UHD版本居然是3.15.0.0,而我自己安装的UHD-4.1.0.7版本没被调用,X410设备又必须适配4.1版本以上的UHD,猜想大概率就是这个原因导致的。
后续进一步分析发现,由于我安装GNU Radio是通过安装包进行的(参考上篇文章),操作很简单,但是这种方式会自带一个低版本的UHD,也就是说我自己手动装的UHD不会被调用,而我这个usrp设备恰好不兼容低版本UHD,因此才会如此麻烦。。。。
解决方法(填坑)
1,卸载旧版本的UHD
通过源码构建的UHD可以用以下指令:
sudo rm -rf /usr/local/lib/libuhd*
sudo rm -rf /usr/local/include/uhd
sudo rm -rf /usr/local/share/uhd
sudo rm -rf /usr/local/bin/uhd_*
如果本地有多版本的UHD,可以通过下述指令来查看本地环境已安装的UHD
apt list | grep uhd
dpkg -l | grep -i uhd
卸载对应文件,比如:
#example
sudo dpkg --purge libgnuradio-uhd3.8.5
sudo dpkg --purge libuhd4.5.0
如果出现两个相互依赖都无法通过sudo dpkg卸载的,就使用下面这个指令:
sudo apt-get remove --purge libgnuradio-uhd3.8.5
可以再输入uhd_find_devices指令,如果打印信息找不到指令证明就卸载掉了。
2,卸载旧版本GNU Radio
由于我是apt-get下载的GNU Radio,可以用下述指令来卸载:
sudo apt remove gnuradio
sudo apt purge gnuradio
sudo apt autoremove --purge gnuradio
可以再输入gnuradio-companion指令,如果打印信息找不到指令证明就卸载掉了。
3,安装UHD4.8.0
现在UHD安装用以下指令变得更简单了,不需要通过源码重构。参考官方文档:USRP Hardware Driver and USRP Manual: Binary Installation
sudo add-apt-repository ppa:ettusresearch/uhd
sudo apt-get update
sudo apt-get install libuhd-dev uhd-host
安装完毕后,连接设备搜索一下,可以发现UHD版本已经升级到最新版本。
4,安装GNU Radio 3.10
还是需要通过源码构建,参考官方文档:
先安装VOLK库
cd
git clone --recursive https://github.com/gnuradio/volk.git
cd volk
mkdir build
cd build
再安装必要依赖库,以下指令分了三段,第一段是GNU Radio3.8.x需要的依赖,后面两段依次是3.9.x,3.10.x版本需要追加的依赖,这里我需要安装3.10版本,因此下面所有依赖我都要安装。
参考官方文档:
sudo apt install git cmake g++ libboost-all-dev libgmp-dev swig python3-numpy \
python3-mako python3-sphinx python3-lxml doxygen libfftw3-dev \
libsdl1.2-dev libgsl-dev libqwt-qt5-dev libqt5opengl5-dev python3-pyqt5 \
liblog4cpp5-dev libzmq3-dev python3-yaml python3-click python3-click-plugins \
python3-zmq python3-scipy python3-gi python3-gi-cairo gir1.2-gtk-3.0 \
libcodec2-dev libgsm1-dev libusb-1.0-0 libusb-1.0-0-dev libudev-dev python3-setuptools
sudo apt install pybind11-dev python3-matplotlib libsndfile1-dev \
libsoapysdr-dev soapysdr-tools python3-pygccxml python3-pyqtgraph
sudo apt install libiio-dev libad9361-dev libspdlog-dev python3-packaging python3-jsonschema python3-qtpy
问题二:MPM版本与UHD版本不匹配
现象
安装完两个软件之后,连接好设备,输入uhd_usrp_probe,报错;
[ERROR] [MPMD] MPM major compat number mismatch. Expected:5.3 Actual:4.0. Please update the version of MPM on you USRP device.
原因分析
MPM版本号过低,需要升级X410设备的固件。
解决方法
官方文档:https://files.ettus.com/manual/page_usrp_x4xx.html#x4xx_updating_filesystems
方式一:通过usrp_update_fs指令升级
该方法是升级系统固件最简便的方法,本文也采用该方式进行升级。
环境准备:
X410设备,PC,路由器
具体步骤:
1)设备互连
将X410用网线接入路由器;需要提前将X410设备的eth0网口恢复成动态获取IP的模式(DHCP),因为之前为了识别到X410,曾经修改过静态ip,所以需要再改回默认DHCP方式,没有改过静态ip的可以跳过此步骤,修改方式参考上文。
2)将PC网口设置同样设置成DHCP模式
这样PC和X410就都在一个子网络下,可以通过uhd_find_devices发现设备。
3)SSH进X410,输入升级指令
ssh root@<x410 ip addr>
usrp_update_fs -t UHD-4.8
4)确认升级(重要)
升级完后,系统需要重启后才生效,如下:
到此接近大功告成,但还有很重要的一部就是需要将本次升级彻底固化下来,否则掉电后又还原回去了,没错我又踩到这个坑。。。。
重启后我再次尝试使用SSH登录发现报错,于是改为用串口的方式登录,输入指令固化升级:
mender commit
固化成功,打印如下:
问题验证
验证新版本是否生效,重新回到PC终端界面输入uhd_usrp_probe:
MPM版本已经可以识别了,问题二解决,接下来最终验证FFT示例是否可以跑起来:
uhd_fft -a <x410 ip addr> -f 835M -s 10M
没有再报runtimeerror了,成功运行指令,问题一解决!
总结
至此大功告成!之前安装软件的坑算是填起来了,再次记录一下,希望能帮到有同样问题的小伙伴~