《十四講》的示例程序依賴比較多,而且系統有點舊。可以在容器中運行。
拉取鏡像
docker pull ddhogan/slambook:v0.1
這個docker對應的github:HomeLH/slambook2-docker
拉下來之后,假如是Windows系統,需要使用XLaunch用于提供X11圖形化顯示服務器。在創建容器時,運行
docker run -it --net=host \
-e DISPLAY=$DISPLAY \
-v $HOME/.Xauthority:/root/.Xauthority \
-v /tmp/.X11-unix:/tmp/.X11-unix \
--name slamtest ddhogan/slambook:v0.1
解釋如下:
- wsl宿主機上運行 xhost + 命令來允許對X Server的訪問。
- 使用 --net=host 參數可以讓Docker容器直接連接到主機上的X11服務,無需通過SSH。
- 用 -v 參數將wsl宿主機的 /tmp/.X11-unix 目錄掛載到容器內的相同路徑。(按作者所說,僅僅掛載.Xauthority,我這是顯示不出的,最后只能刪掉container)
- -e 參數設置容器的 DISPLAY 環境變量,使其與wsl所使用的 DISPLAY 環境變量一致。
按照作者所說這樣就行了。但我測試窗口顯示時,直接X11轉發就會遇到問題。測試xterm報錯:
docker exec -it -u msy -e DISPLAY=127.0.0.1:0 slamtest bash
msy@docker-desktop:/opt/slambook$ xterm
xterm: Xt error: Can't open display: 127.0.0.1:0
我查看了wsl中的DISPLAY
echo $DISPLAY
輸出是127.0.0.1:0,也就是localhost。為什么docker中使用就不對了。
問題是這樣解決的:
考慮到實際是通過X11轉發將容器內的圖形輸出到Windows主機上的X服務器。在Windows PowerShell中查看Win11的IPv4地址:192.168.xxx.xxx
重新啟動docker
docker exec -it -e DISPLAY=192.168.xxx.xxx:0 slamtest bash
- -e 參數設置容器的 DISPLAY 環境變量,使其與win11的XLaunch所提供的DISPLAY服務的ip地址一致。
后來我發現不用XLaunch也行。
另一種方法,直接在MobaXterm中啟動,它附帶了可視化功能:
如果安裝了MobaXterm就可以直接在它的命令行,把DISPLAY給出的ip地址作為docker的執行參數,從而直接顯示可視化窗口。
最后測試ch3的軌跡可視化,可行: