0 前言
在BST A1000 Linux SDK V2.3.1.2中,黑芝麻团队已经导入了github上的ORB_SLAM3工程,我们只需要在容器中编译,再放进开发板上运行即可。
这里为了方便理解操作,我先将ORB-SLAM3从容器中拷贝到宿主机,在宿主机上简单修改一些代码,再放进容器中编译,最后拷贝到开发板上运行。
容器:a1000b-sdk-fad-2.3.1.2 (创建过程看我上一篇)
宿主机:台式电脑 Ubuntu20.04系统
开发板:A1000(烧录的SDK版本v2.3.1.2)
1 在容器中查找ORB-SLAM3
1)运行容器
docker exec -it a1000b-sdk-fad-2.3.1.2 bash
2)查找SLAM位置
find / -name "ORB-SLAM3"
3)查看SLAM文件结构
cd /opt/bstos/2.3.1.2/sysroots/aarch64-bst-linux/usr/include/src/SLAM/ORB-SLAM3
ls
2 将ORB-SLAM3从容器中拷贝到宿主机
从容器中把ORB-SLAM3拷贝到宿主机上:
docker cp a1000b-sdk-fad-2.3.1.2:/opt/bstos/2.3.1.2/sysroots/aarch64-bst-linux/usr/include/src/SLAM/ORB-SLAM3 /home/stk/heizhima
3 在宿主机中简单修改ORB-SLAM3
在/ORB-SLAM3/src/System.cc添加一行消息:
cout << "**************hello A1000!!!***************" <<endl;
保存。
4 将修改后的ORB-SLAM3从宿主机拷贝到容器中编译
为了区分,将ORB-SLAM3改名为ORB-SLAM3-one
docker cp /home/stk/heizhima/ORB-SLAM3-one a1000b-sdk-fad-2.3.1.2:/opt/bstos/2.3.1.2/sysroots/aarch64-bst-linux/usr/include/src/SLAM
此时,容器中就能看到ORB-SLAM3-one
在容器中编译:
cd ORB-SLAM3-one
chmod +x build.sh
./build.sh
5 将编译好的ORB-SLAM3-one拷贝到宿主机
终端输入:
docker cp a1000b-sdk-fad-2.3.1.2:/opt/bstos/2.3.1.2/sysroots/aarch64-bst-linux/usr/include/src/SLAM/ORB-SLAM3-one /home/stk/heizhima
6 将相关文件从宿主机拷贝到开发板上
1)启动开发板,在userdata中创建ORBSLAM3文件夹,用于存放slam3工程相关文件:
adb shell
cd userdata
mkdir ORBSLAM3
2)在宿主机的ORB-SLAM3-one中进入终端,拷贝lib文件并创建库链接:
黑芝麻A1000链接的库路径是/usr/lib(可通过指令echo $LD_LIBRARY_PATH
查询):
给的参考方法也是直接拷贝到/usr/lib/路径中
adb push lib/libORB_SLAM3.so* /usr/lib/
adb push Thirdparty/DBoW2/lib/libDBoW2.so* /usr/lib/
adb push Thirdparty/g2o/lib/libg2o.so* /usr/lib/
adb push lib/libautoplt_orbslam_proto.so* /usr/lib/
由于根目录存储空间有限,且不利于后续增减,这里我做了更改:
在A1000的/userdata/ORBSLAM3中创建lib文件夹,将编译产生的库文件拷贝到该文件夹中:
adb push lib/libORB_SLAM3.so* /userdata/ORBSLAM3/lib/
adb push Thirdparty/DBoW2/lib/libDBoW2.so* /userdata/ORBSLAM3/lib/
adb push Thirdparty/g2o/lib/libg2o.so* /userdata/ORBSLAM3/lib/
adb push lib/libautoplt_orbslam_proto.so* /userdata/ORBSLAM3/lib/
此时,A1000的/userdata/ORBSLAM3/lib/中就有了所需的库文件
接着,在保留原库路径基础上,添加/userdata/ORBSLAM3/lib/新的库路径:
export LD_LIBRARY_PATH=/userdata/ORBSLAM3/lib:$LD_LIBRARY_PATH
查看A1000库路径链接,增加了/userdata/ORBSLAM3/lib:
echo $LD_LIBRARY_PATH
3)在宿主机的ORB-SLAM3-one中进入终端,拷贝以下文件:
adb push Examples/Monocular/mono_euroc /userdata/ORBSLAM3/
adb push Examples/Monocular/mono_kitti /userdata/ORBSLAM3/
adb push Examples/Monocular/mono_bst_dataset /userdata/ORBSLAM3/
adb push Examples/Monocular/mono_bst_realtime /userdata/ORBSLAM3/
adb push Examples/Monocular/EuRoC_TimeStamps/EuRoC_TimeStamps /userdata/ORBSLAM3/
adb push Examples/Monocular/EuRoC.yaml /userdata/ORBSLAM3/
adb push Examples/Monocular/KITTI00-02.yaml /userdata/ORBSLAM3/
adb push Examples/Monocular/KITTI03.yaml /userdata/ORBSLAM3/
adb push Examples/Monocular/KITTI04-12.yaml /userdata/ORBSLAM3/
adb push Examples/Monocular/BST-03.yaml /userdata/ORBSLAM3/
adb push Vocabulary /userdata/ORBSLAM3/
4)下载数据集并拷贝到开发板上
Euroc数据集下载地址
Kitti数据集下载地址
这里下载Euroc数据集的MH_03_medium为例。
先在开发板中创建一个文件夹来存放数据集
cd ORBSLAM3
mkdir data
将数据集拷贝到开发板上:
adb push MH_03_medium /userdata/ORBSLAM3/data/
6 在开发板中运行
在开发板中进入ORBSLAM3:
./mono_euroc ./Vocabulary/ORBvoc.txt EuRoC.yaml ./data/MH_03_medium ./EuRoC_TimeStamps/MH03.txt 0
最后一个参数表示是否启用可视化工具,不启用为0,启用为1,如果启用了可视化工具,需
要在其配置文件EuRoC.yaml中配置可视化数据发送频率。
Viewer.IntervalImage: 1.0 //发送图像间隔
Viewer.IntervalMatrix: 0.3 //发送目标位姿间隔
Viewer.IntervalMapPoints: 0.5 //发送点云地图间隔
在使用可视化功能时,请务必检查配置文件中的上述配置参数是否存在、格式是否正确(保留一位小数且大于0),且在使用可视化功能时,需要配置cyber环境。(SDK v2.3.1.2无需配置)
没接显示器下,成功运行结果:
可以将KeyFrameTrajectory.txt拷贝出来,查看:
adb pull /userdata/ORBSLAM3/KeyFrameTrajectory.txt /home/stk/heizhima/ORB-SLAM3-one/