semantic_slam环境配置

orb_slam2 + 语义分割 + 八叉树地图,
github地址:https://github.com/floatlazer/semantic_slam

根据github上环境的版本要求,选择在ubuntu16.04的docker容器中搭建

首先pull了一个ubuntu16.04 + python2.7 + opencv3.3.0的镜像,在这个基础上搭建环境

1.download semantic slam的code
在$HOME下

$ mkdir catkin_ws
$ cd catkin_ws
$ mkdir src
$ cd src
$ git clone https://github.com/floatlazer/semantic_slam.git

2.安装orb slam2的环境
参考了https://www.jianshu.com/p/dbf39b9e4617
这中间涉及到ros, pangolin, eigen等的安装

进入sematic_slam文件夹中的ORB_SLAM2文件夹,build成功即可

3.安装语义分割相关
按照semantic slam的github中的要求

$ sudo apt-get install ros-kinetic-openni2-launch

4.安装八叉树地图相关

sudo apt-get install ros-kinetic-octomap-ros
sudo apt-get install ros-kinetic-octomap-msgs
sudo apt-get install ros-kinetic-octomap-server
sudo apt-get install ros-kinetic-octomap-rviz-plugins

5.安装语义分割相关

pip install torch-0.4.0-cp27-cp27mu-linux_x86_64.whl #1.0之前的版本要在官网上下载
pip install torchvision==0.2.0
pip install numpy
pip install future
pip install matplotlib

然后github上说依赖pytorch-semseg
打开pytorch-semseg中的requirements.txt, 看到里面还有一些依赖要安装

pip install scikit-image
pip install opencv-python==3.3.0.10
pip install tqdm==4.11.2
pip install cython
pip install pydensecrf
pip install tensorboardX
pip install scipy==0.19.0
pip install imgaug

然后安装semantic_slam包

$ rosdep install semantic_slam
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
semantic_slam: Cannot locate rosdep definition for [catkin]

这一步会报找不到相关依赖的错误
命令改为:

$ rosdep install --from-paths semantic_slam --ignore-src --rosdistro=kinetic -r -y
#All required rosdeps installed successfully

这些都安装好之后,到~/catkin_ws下catkin_make

开始启动launch:

roslaunch semantic_slam semantic_mapping.launch

会报如下错误:
ImportError: No module named google.protobuf.internal
解决方法:

pip install protobuf

再启动launch:
会报错:AttributeError: ‘module’ object has no attribute ‘_cuda_getDevice’
Traceback (most recent call last):
File “/home/xx/catkin_ws/src/semantic_slam/semantic_cloud/src/semantic_cloud.py”, line 295, in
main(sys.argv)
File “/home/xx/catkin_ws/src/semantic_slam/semantic_cloud/src/semantic_cloud.py”, line 288, in main
seg_cnn = SemanticCloud(gen_pcl = True)
File “/home/xx/catkin_ws/src/semantic_slam/semantic_cloud/src/semantic_cloud.py”, line 123, in init
state = torch.load(model_path)

这是因为它的weight, 也就是pth文件,是用GPU训练出来的,
而docker里面没有GPU, 要把这个pth转为cpu模式:
把这个 state = torch.load(model_path)
改为:

state = torch.load(model_path, map_location={'cuda:0': 'cpu'})

到~/catkin_ws下

$ rm -rf build devel
$ catkin_make

再试一次

$ roslaunch semantic_slam semantic_mapping.launch
[ INFO] [1655366319.121127159]: Semantic octomap generator [max fusion]
Generate semantic point cloud [max fusion].
Setting up CNN model...
Setting up ROS...
Ready.

另起一个窗口

$ rosbag play demo.bag

图建出来了
在这里插入图片描述

<think>好的,我现在要帮用户了解如何实现ORB-SLAM3的语义分割功能。首先,我需要回顾一下用户提供的引用内容,看看有没有相关的信息。根据引用[2],ORB-SLAM3结合了语义分割算法,将场景分割为不同的语义类别,并融合语义信息与几何信息。引用[3]提到基于ORB-SLAM2的语义地图构建,使用了COCO-Stuff数据集和DeepLabv2模型。用户现在想实现ORB-SLAM3的语义功能,可能需要参考这些方法。 首先,ORB-SLAM3本身可能没有内置的语义分割模块,所以需要集成外部模型。用户需要选择一个合适的语义分割模型,比如DeepLab、PSPNet或Mask R-CNN。然后,考虑如何将这些模型的输出与ORB-SLAM3的地图点或关键帧结合。可能需要修改ORB-SLAM3的数据结构,添加语义标签的存储。此外,实时性是一个挑战,因为语义分割通常计算量大,可能需要优化模型或用轻量级网络。 接下来,要处理数据关联,将分割结果与SLAM的特征点对应起来。可能需要使用几何信息或投影方法。然后,在回环检测或地图优化时利用语义信息,比如通过语义一致性来优化位姿或地图。最后,生成语义地图可能需要将语义标签映射到3D点云或网格上,并可视化。 用户可能需要查阅ORB-SLAM3的代码结构,找到关键帧插入的地方,插入语义处理模块。同时,确保实时性可能需要多线程处理,比如在单独线程运行分割模型。此外,数据集的选择和模型的训练也是关键,如果使用预训练模型,可能需要调整输入尺寸或输出格式。 需要提醒用户注意版本兼容性,比如ORB-SLAM3的代码是否支持所需的深度学习框架,如PyTorch或TensorFlow。可能涉及ROS集成,如果用户是在机器人平台上应用。最后,推荐参考已有的实现,如引用[3]中的方法,或者查找最新的相关论文和开源项目,看看有没有现成的解决方案可以借鉴。</think>### ORB-SLAM3语义分割功能实现方法 #### 一、技术路线分析 ORB-SLAM3的语义功能实现主要包含以下技术环节: 1. **语义分割模块集成** 需选择高效的语义分割网络(如DeepLab系列、PSPNet等),推荐使用轻量化改进的$MobileNetV3+DeepLabV3+$结构[^1]。输入图像尺寸建议调整为$480\times 640$以匹配ORB特征提取尺度。 2. **数据关联策略** 通过投影将2D语义标签与3D地图点关联,定义投影误差函数: $$ E_{sem}=\sum_{i=1}^{n}\| \pi(T_{cw}X_i) - u_i \|_{\Sigma}^{2} $$ 其中$\pi$为相机投影模型,$T_{cw}$为位姿矩阵,$X_i$为地图点坐标,$u_i$为像素坐标[^2]。 #### 二、代码实现步骤 1. **框架改造** 在`KeyFrame`类中添加语义属性容器: ```cpp class KeyFrame { public: std::vector<cv::Mat> semantic_masks; // 语义掩码 std::vector<int> object_classes; // 物体类别标签 }; ``` 2. **实时语义处理线程** 创建独立处理线程运行分割模型: ```python # 示例PyTorch推理代码 def semantic_thread(): model = torch.hub.load('pytorch/vision', 'deeplabv3_resnet50', pretrained=True) while True: img = get_camera_frame() with torch.no_grad(): output = model(img.unsqueeze(0))['out'] send_semantic_result(output) ``` #### 三、优化策略 1. **特征-语义关联优化** 使用ORB特征点坐标反投影语义标签,建立联合优化因子图: ```mermaid graph LR A[相机位姿] --> B[ORB特征点] A --> C[语义标签] B --> D[重投影误差] C --> E[语义一致性约束] ``` 2. **动态物体过滤** 基于语义标签构建动态概率模型: $$ P(dyn|cls)=\frac{1}{1+e^{-(w_0+w_1\cdot cls)}} $$ 其中$cls$为物体类别编码,$w_0,w_1$为可学习参数[^3]。 #### 四、实现建议 1. **硬件配置要求** - NVIDIA GPU(建议RTX 3060以上) - 至少16GB内存 - ROS Melodic/MoveIt环境 2. **调试技巧** - 先离线测试语义分割模块的mIoU指标 - 使用TUM数据集进行带语义标签的仿真测试 - 逐步增加语义约束权重(建议从0.3开始)
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值