使用Intel RealSense D435i自制离线数据集跑通BundleFusion

2023-05-16

内容概览

  • 摘要
  • 操作环境
  • 大致流程
  • 录制数据集
  • 格式转换
    • 解析.bag文件
    • 时间戳对齐
    • 制作源格式
    • 封装为.sens格式
  • 离线三维重建
    • 修改 zParametersDefault.txt
    • 修改 zParametersBundlingDefault.txt
    • 重建效果
  • 结语

摘要

本文主要讲述如何使用 Intel RealSense D435i 深度相机录制 Rosbag 离线数据集,并基于此数据集跑通 BundleFusion。关于如何基于 BundleFusion 使用 Intel RealSense D435i 深度相机实现实时三维建图可参照 《Intel RealSense D435i + BundleFusion 实现实时三维建图》。

操作环境

环境项版本/型号
操作系统Win10_x64、Ubuntu 18.04
开发工具集Visual Studio 2013、Pycharm Professional 2019.1.3
计算架构CUDA 8.0
深度相机Intel RealSense D435i
显卡NVIDIA GeForce 940MX

Ubuntu 18.04 系统中需完成 ROS 配置,具体配置过程可参考 《ROS开发之环境搭建:Ubuntu 18.04安装ROS Melodic》。ROS 配置完成后,需为 Pycharm 设定环境变量,从而实现在 Pycharm 中编写 ROS 代码。通过 sudo gedit /usr/share/applications/pycharm.desktop 命令编辑 “ pycharm.desktop ” 文件,路径取决于安装 Pycharm 时的选项,选择为所有用户安装(/usr/share/applications),选择为当前用户安装(~/.local/share/applications)。将该文件中的 Exec = /... 修改为 Exec = bash -i -c /... ,从而实现在通过快捷方式启动 Pycharm 的同时加载 “ ~/.bashrc ” 中的 ROS环境变量,修改后如下图所示:

pycharm配置ros

大致流程

  1. 录制数据集
  2. 解析 bag 文件,提取深度图和彩色图并制作成源格式
  3. 将源格式封装为 sens 格式
  4. 基于 BundleFusion 进行离线三维重建

录制数据集

使用 USB 线连接好深度相机和电脑,打开 Intel RealSense Viewer 。设置 Depth Stream 以及 Color Stream 的图像分辨率为 640 × 480 ,设置采集帧率为 30 fps 。点击左上角的 Record 按钮即可进行录制,开始录制后,点击左上角的 Stop 按钮即可结束录制并保存录制结果,如下图所示:

开始录制
结束录制
若点击 Record 按钮后出现以下报错,说明默认存储路径为 “ C:\Users\ ”,软件无权在该路径下创建文件。通过点击右上角的齿轮图标,选择 Settings 并改变存储路径即可解决此问题,具体如下图所示:

报错
解决方案
结束录制后,在相应存储路径下即生成 .bag 文件,按需重命名该文件。至此,完成离线数据集的录制过程。

录制结果

格式转换

此步骤的目的在于将录制好的数据集转换为 BundleFusion 所要求的离线输入格式,即 .sens 格式。BundleFusion 提供了将源格式封装成 .sens 格式的实现,因此只需将录制好的数据集存储为源格式即可。从 BundleFusion 官网下载源格式数据集,查看其存储格式如下图所示:

源格式
BundleFusion 官网对于数据存储格式也有相应说明:

数据存储格式

解析.bag文件

.bag 是 ROS 常用的数据存储格式,由于 ROS 的配置在 Ubuntu 18.04 系统中,因此切换至 Ubuntu 系统完成 .bag 文件的解析并从中提取出深度图和彩色图。首先,进入 bag 文件的存储路径并打开终端,通过 rosbag info ***.bag 查看待提取的深度图及彩色图所对应的 topic,如下图所示:

查看topic
Intel RealSense D435i 深度相机所录制的数据包括 Depth、RGB 以及 IMU,使用 BundleFusion 进行三维重建只需使用 Depth 及 RGB,因此新建两个文件夹分别用于存放此两种类型的数据。

新建文件夹
执行以下 Python 脚本,提取深度图及彩色图。其中,深度图的命名格式为 时间戳.png,彩色图的命名格式为 时间戳.jpg。同时将深度图与彩色图的时间戳及相对路径按照 (时间戳 相对路径) 的形式分别存储至两个文本文件中。

import roslib
import rosbag
import rospy
import cv2
import os
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError

rgb = '/home/magus/jizongxing-workspace/slam/rosImage/rgb/'  #rgb path
depth = '/home/magus/jizongxing-workspace/slam/rosImage/depth/'   #depth path
bridge = CvBridge()

file_handle1 = open('/home/magus/jizongxing-workspace/slam/rosImage/depth-stamp.txt', 'w')
file_handle2 = open('/home/magus/jizongxing-workspace/slam/rosImage/rgb-stamp.txt', 'w')

with rosbag.Bag('/home/magus/jizongxing-workspace/bedroom.bag', 'r') as bag:
    for topic,msg,t in bag.read_messages():
        if topic == "/device_0/sensor_0/Depth_0/image/data":  #depth topic
            cv_image = bridge.imgmsg_to_cv2(msg)
            timestr = "%.6f" %  msg.header.stamp.to_sec()   #depth time stamp
            image_name = timestr+ ".png"
            path = "depth/" + image_name
            file_handle1.write(timestr + " " + path + '\n')
            cv2.imwrite(depth + image_name, cv_image)
        if topic == "/device_0/sensor_1/Color_0/image/data":   #rgb topic
            cv_image = bridge.imgmsg_to_cv2(msg,"bgr8")
            timestr = "%.6f" %  msg.header.stamp.to_sec()   #rgb time stamp
            image_name = timestr+ ".jpg"
            path = "rgb/" + image_name
            file_handle2.write(timestr + " " + path + '\n')
            cv2.imwrite(rgb + image_name, cv_image)
file_handle1.close()
file_handle2.close()

提取结果如下:

depth
rgb
depth stamp
rgb stamp

时间戳对齐

由执行结果可知,深度图及彩色图的时间戳并非严格一一对齐,存在一定的时间差,因此需将深度图及彩色图按照时间戳最接近原则进行两两配对。将 associate.py 脚本文件存储至上述两个文本文件所在的路径下,如图所示:

associate.py
associate.py 脚本文件:

"""
The RealSense provides the color and depth images in an un-synchronized way. This means that the set of time stamps from the color images do not intersect with those of the depth images. Therefore, we need some way of associating color images to depth images.

For this purpose, you can use the ''associate.py'' script. It reads the time stamps from the rgb.txt file and the depth.txt file, and joins them by finding the best matches.
"""

import argparse
import sys
import os
import numpy


def read_file_list(filename):
    """
    Reads a trajectory from a text file.

    File format:
    The file format is "stamp d1 d2 d3 ...", where stamp denotes the time stamp (to be matched)
    and "d1 d2 d3.." is arbitary data (e.g., a 3D position and 3D orientation) associated to this timestamp.

    Input:
    filename -- File name

    Output:
    dict -- dictionary of (stamp,data) tuples

    """
    file = open(filename)
    data = file.read()
    lines = data.replace(",", " ").replace("\t", " ").split("\n")
    list = [[v.strip() for v in line.split(" ") if v.strip() != ""] for line in lines if
            len(line) > 0 and line[0] != "#"]
    list = [(float(l[0]), l[1:]) for l in list if len(l) > 1]
    return dict(list)


def associate(first_list, second_list, offset, max_difference):
    """
    Associate two dictionaries of (stamp,data). As the time stamps never match exactly, we aim
    to find the closest match for every input tuple.

    Input:
    first_list -- first dictionary of (stamp,data) tuples
    second_list -- second dictionary of (stamp,data) tuples
    offset -- time offset between both dictionaries (e.g., to model the delay between the sensors)
    max_difference -- search radius for candidate generation

    Output:
    matches -- list of matched tuples ((stamp1,data1),(stamp2,data2))

    """
    first_keys = first_list.keys()
    second_keys = second_list.keys()
    potential_matches = [(abs(a - (b + offset)), a, b)
                         for a in first_keys
                         for b in second_keys
                         if abs(a - (b + offset)) < max_difference]
    potential_matches.sort()
    matches = []
    for diff, a, b in potential_matches:
        if a in first_keys and b in second_keys:
            first_keys.remove(a)
            second_keys.remove(b)
            matches.append((a, b))

    matches.sort()
    return matches


if __name__ == '__main__':

    # parse command line
    parser = argparse.ArgumentParser(description='''
    This script takes two data files with timestamps and associates them   
    ''')
    parser.add_argument('first_file', help='first text file (format: timestamp data)')
    parser.add_argument('second_file', help='second text file (format: timestamp data)')
    parser.add_argument('--first_only', help='only output associated lines from first file', action='store_true')
    parser.add_argument('--offset', help='time offset added to the timestamps of the second file (default: 0.0)',
                        default=0.0)
    parser.add_argument('--max_difference',
                        help='maximally allowed time difference for matching entries (default: 0.02)', default=0.02)
    args = parser.parse_args()

    first_list = read_file_list(args.first_file)
    second_list = read_file_list(args.second_file)

    matches = associate(first_list, second_list, float(args.offset), float(args.max_difference))

    if args.first_only:
        for a, b in matches:
            print("%f %s" % (a, " ".join(first_list[a])))
    else:
        for a, b in matches:
            print("%f %s %f %s" % (a, " ".join(first_list[a]), b - float(args.offset), " ".join(second_list[b])))

在该路径下打开终端并通过执行如下命令生成配对结果 associate.txt

python associate.py depth-stamp.txt rgb-stamp.txt > associate.txt

associate.txt

制作源格式

根据配对结果,将深度图及彩色图按对重命名。相机位姿是在重建过程中估计所得,作为输入无需精确的位姿数据,因此将源格式中的相机位姿统一预设为:

1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

将相机位姿文件按格式命名并与深度图、彩色图组成序列,执行如下 Python 脚本文件实现上述需求。

import shutil
import os

bp='/home/magus/jizongxing-workspace/slam/rosImage/'  # base path
rp='/home/magus/jizongxing-workspace/slam/rosImage/result/'  # result path
file_handle1 = open('/home/magus/jizongxing-workspace/slam/rosImage/associate.txt', 'r')

count = 0
for line in file_handle1.readlines():
    line = line.strip()
    # relative path of depth and color
    path_d = line.split()[1]   # relative path of depth
    path_c = line.split()[3]   # relative path of rgb

    if (os.path.exists(bp+path_d)==True) and (os.path.exists(bp+path_c)==True):
        rName = "frame-" + str(count).zfill(6) + ".color.jpg"   # rename rgb
        dName = "frame-" + str(count).zfill(6) + ".depth.png"   # rename depth
        pName = "frame-" + str(count).zfill(6) + ".pose.txt"   # name pose
        # create pose file
        file_handle2 = open(rp+pName, 'w')
        file_handle2.write("1 0 0 0\n0 1 0 0\n0 0 1 0\n0 0 0 1")   # initialize pose.txt
        file_handle2.close()
        shutil.copy(bp+path_d,rp+dName)
        shutil.copy(bp+path_c,rp+rName)
        count=count+1
file_handle1.close()

执行结果如下:

align
最终,将 info.txt 文件拷贝至 result 文件夹中,将其中的 m_frames.size 按照实际大小进行设置。

m_versionNumber = 4
m_sensorName = StructureSensor
m_colorWidth = 640
m_colorHeight = 480
m_depthWidth = 640
m_depthHeight = 480
m_depthShift = 1000
m_calibrationColorIntrinsic = 582.871 0 320 0 0 582.871 240 0 0 0 1 0 0 0 0 1 
m_calibrationColorExtrinsic = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 
m_calibrationDepthIntrinsic = 583 0 320 0 0 583 240 0 0 0 1 0 0 0 0 1 
m_calibrationDepthExtrinsic = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 
m_frames.size = 2016

至此,成功生成与源格式相同的数据格式。

封装为.sens格式

在 BundleFusion 工程的 sensorData.h 文件中提供了将源格式封装为 .sens 格式的相关实现 loadFromImages 。先拷贝两份 BundleFusion 工程代码,一份用于将源格式封装为 .sens 格式,另一份用于运行 sens 生成 ply 模型。

封装成sens格式
因此,将其中一份 BundleFusion 工程中原来的主函数全部注释并替换为:

int main()
{
	ml::SensorData sd;
	sd.loadFromImages("H:/ROSImage/result", "frame-", "jpg");
	sd.saveToFile("H:/ROSImage/test.sens");
}

同时在 sensorData.h 文件的第812与813行对深度图及彩色图的压缩类型进行初始化,从而使代码能够正常运行,生成可用的sens文件。

修改sensorData.h
生成解决方案后,点击 FriedLiver.exe 即可对源格式进行封装,在相应路径下生成 sens 文件。

生成sens文件

离线三维重建

将生成的 sens 文件重命名后拷贝至另一份 BundleFusion 工程的 “ BundleFusion-master\FriedLiver\x64\data ” 目录下。

添加sens文件
同时将 GlobalAppState.h 文件中的深度相机全部注释掉。

注释深度相机
生成解决方案后,将 “ BundleFusion-master\FriedLiver ” 下的 zParametersBundlingDefault.txt 以及 zParametersDefault.txt 文件拷贝至 “ BundleFusion-master\FriedLiver\x64\Release ” 路径下,并作如下修改:

修改 zParametersDefault.txt

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

修改 zParametersBundlingDefault.txt

在这里插入图片描述

重建效果

点击 FriedLiver.exe 即可进行离线三维重建,重建过程如下所示:

三维重建
运行结束后,“ BundleFusion-master\FriedLiver\x64\data ” 路径下将生成 ply 模型,如下图所示:

生成ply
使用 Meshlab 查看该 ply 文件,重建效果如下所示:

重建效果

结语

重建结果来看,整体具备辨识度,但细节处理欠缺,这是由于在录制数据集时,仅简单环绕一周,未对细节部分进行局部录制。在之后的工作中,我们将使用小车搭载 Intel RealSense D435i 深度相机,进行平稳匀速拍摄,并对细节部分的深度以及色彩信息进行采集。以上就是使用 Intel RealSense D435i 自制离线数据集跑通 BundleFusion 的全过程,相互学习,共克时艰,哈哈哈。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Intel RealSense D435i自制离线数据集跑通BundleFusion 的相关文章

  • [翻译]解决使用 git clone 命令时出现的 ‘gnutls_handshake() failed’ 错误

    错误介绍 使用 git clone 时出现如下错误 xff1a fatal unable to access 39 https github com Syllo nvtop git 39 gnutls handshake failed Th
  • 解决 pycharm 从快捷方式启动与从终端启动环境不同的问题

    前言 博主在安装了 ros 相关的两个python包 rospy 和 roslaunch 之后 xff0c pycharm 无法 import 这两个包 但是在终端中用同样的python解释器又可以import这两个包 同时 xff0c 从
  • Ubuntu 常用命令使用记录

    Linux 查找包含特定关键词的文件 grep r E 39 word1 word2 word3 39 yourpath gt gather log 如果要and关系查找 则要用管道 grep pattern1 files grep pat
  • Linux 通过 SSH 挂载远程文件夹

    前言 在两台Linux电脑之间 xff0c 我们可以通过ssh方便的登录另一台电脑并访问它的文件或者文件夹 但这都是我们用户在进行操作 想要在一台电脑上运行程序 xff0c 处理放在另一台电脑上的文件时 xff0c 我们应该如何设置呢 xf
  • ROS节点的初始化及退出详解(ros::init、SIGINT、ros::ok、ros::NodeHandle)

    希望大家收藏 xff1a 本文更新地址 xff1a https haoqchen site 2018 04 28 ROS node init 左侧专栏还在更新其他ROS实用技巧哦 xff0c 关注一波 xff1f 很多ROS新手编写节点的时
  • Ubuntu 终端前多了个 base

    Ubuntu 终端前多了个 base xff0c 想将base去掉 xff0c 如何操作 xff1f 原文 xff1a https blog csdn net qq 35544714 article details 109270602 装完
  • GNU __attribute__浅析

    GNU attribute 浅析 1 介绍 attribute 是GCC的特性 xff0c 其实是个编译器指令 xff0c 告诉编译器声明的特性 xff0c 或者让编译器进行更多的错误检查和高级优化 attribute 可以设置函数属性 x
  • FreeRTOS学习(一)

    1 FreeRTOS任务基础 1 1 多任务系统 在51单片机 AVR STM32裸机编程时 xff0c 我们通常都是用一个main函数里面加一个while 1 做一个大循环来完成所有的事务处理 xff0c 同时在加上中断处理一些较为紧急的
  • FreeRTOS学习(四)

    4 FreeRTOS信号量 4 1 信号量简介 信号量主要是用于对共享资源的访问和任务同步 具体的使用例子就不进行展开 4 2 二值信号量 4 2 1 二值信号量简介 二值信号量通常用于互斥访问或同步 xff0c 二值信号量与互斥信号量非常
  • FreeRTOS学习(七)

    7 系统裁剪 7 1 简介 FreeRTOS中的系统裁剪和配置其实是通过条件编译的方法来实现的 xff0c 不止FreeRTOS这么干 xff0c 很多的协议栈 RTOS系统和GUI库都是使用条件编译的方法来完成配置和裁剪的 在第二章使用静
  • 【APM】第一个应用程序

    第一个应用程序 此部分对应教程原文 http ardupilot org dev docs learning ardupilot the example sketches html HelloWorld 代码编写及编译 学习任何一种平台都从
  • 无人机定高算法

    高度控制 高于目标值时应该减速 xff0c 要输出负值 xff0c 所以高度差 61 目标高度 当前高度 速度控制 xff1a 向上时 速度为正 应该减速 xff0c 要输出负值 xff0c 所以速度差 61 高度差的速度 当前速度 如果只
  • Git -- 子模块

    子模块 如果想直接上手操作 xff0c 可以只看 适用场景 定义 快速使用 小节 否则看这篇文章或者 原文 都可以 文章目录 子模块适用场景定义快速使用添加子模块同步本地到远程克隆带有子模块的仓库分支操作同步远程到本地 相关命令信息补充遇到
  • 神经网络的参数为什么需要它的值很小,且变化范围小

    Tips xff1a 只不过是本人的感觉 xff0c 未经过试验验证 xff0c 同样也没有任何依据 值小的话在计算上基本不会出现上溢出由于目前在深度学习中数据都是用多维表示 xff0c 比如词向量的维度就有128 256维或者更高 xff
  • java:N的N次方

    题目描述 现给你一个正整数N xff0c 请问N N的最左边的数字是什么 xff1f 输入格式 输入包含多组测试数据 每组输入一个正整数N xff08 N lt 61 1000000 xff09 输出 对于每组输入 xff0c 输出N N的
  • ACM:入口的选择------深度优先搜索

    入口的选择 Time Limit 1000MS Memory Limit 32768K Description Zeism玩的赛车游戏中 xff0c 有一种树形的赛道 树根表示赛道的终点 xff0c 任何一个叶子结点表示一个赛道的入口 xf
  • 在服务端没接显示器的情况下,nomachine远程连接客户端看到的是黑屏的问题

    这里遇到一个问题 xff0c 在服务端没接显示器的情况下 xff0c nomachine远程连接客户端看到的是黑屏 xff08 我这里服务器是ubuntu18 04 xff09 参考链接 xff1a https blog csdn net
  • ACM:n!的位数 :斯特林公式

    n 的位数 Time Limit 2000MS Memory Limit 65536K Description 针对每个非负整数n xff0c 计算其n 的位数 Input 输入数据中含有一些整数n xff08 0 n xff1c 10 7
  • java 自定义封装jdbc dao类

    手动封装jdbc和dao层 xff0c 体会其中的优点与不足 注 xff1a 本次采用的mysql数据库记得添加数据库的驱动包 Dbhelper类 xff1a 对jdbc进行封装 xff0c 采用单例模式 xff0c 不用每次都去连接数据库
  • Mybatis 二级缓存

    mybatis的缓存分为一级缓存和二级缓存 xff0c 缓存是用来缓存部分经常性访问的数据 xff0c 而不必每一次都跑到数据库获取或运算 xff0c 目标是提高系统的性能 一级缓存 对于每一个sqlSession 其中有一个HashMap

随机推荐

  • win10系统下CUDA示例项目编译出错MSB3721解决

    在win10系统下安装好cuda9 1后 xff0c 在VS2017中打开cuda corporation中的项目 xff0c 编译发现一直报错MSB3721 xff0c 无法导入windows h文件 xff0c 错误提示如下 xff1a
  • Wi-Fi放大器、中继、桥接和mesh组网的理解

    前言 针对路由器其实有很多的知识可以去学习 xff0c 包括路由器的路由功能 Wi Fi放大功能 中继 桥接和近几年才流行的mesh组网功能 xff0c 下面我将针对这几个功能说说我自己的通过相关资料的学习形成自己的一些理解 xff0c 强
  • MAC下虚拟机PD转换成win上可以用的vmware

    最近是需要mac机子转windows xff0c 然后之前在mac上面安装的虚拟机Ubuntu需要移到window上面使用 xff0c mac上面是使用Parallel Desktop安装的虚拟机 xff0c 在windows上面使用的是V
  • Openresty之实现http访问请求

    如果是第一次看这个文章 xff0c 可以先看下这篇openresty介绍性的文章 xff1a Openresty概述介绍 在openresty里面可能有访问其他服务的需求 xff0c 我们当时是需要定时去另外一个服务拉取一些配置信息 xff
  • 服务器系统缓存问题总结

    做后端的同学都知道缓存 xff0c 而且越是大的访问量的后端服务 xff0c 缓存的作用越是重要 最近看了些大佬的解说 xff0c 觉得说的很好 xff0c 在此将我理解的记录下来 xff0c 下面总结下后端缓存的一些知识点 顾名思义 xf
  • fwknop的安装和使用测试

    SPA名为单包授权 xff0c 是一种认证方法 xff0c 它是一种端口敲门的方法 xff0c 是之前早起端口敲门的升级版本 目的是为了隐藏服务端口 xff0c 防止DOS等其他网络攻击 xff0c 保证服务端的安全 SPA的具体定义这里不
  • win7连接共享“请检查名称的拼写.否则网络可能有问题”

    我他妈也是这个问题 xff0c 折腾了我好多天 xff0c 我的win7电脑突然就不能连接FTP的服务器 xff0c 然后我虚拟机的samba共享也连接不上 xff0c 终于找到解决办法 xff0c 别人的电脑没事 xff0c 就我的电脑有
  • Intel RealSense D435i + BundleFusion 实现实时三维建图

    内容概览 摘要操作环境RealSense D435i 介绍BundleFusion工程环境配置安装 RealSense SDKRealSense SDK 本地环境配置BundleFusion 工程属性表相机类型设置修改 GlobalAppS
  • CrazePony与计算机视觉

    大家好 我是CrazePony的视觉攻城狮 Ziv Lin 我擅长的部分是计算机视觉和嵌入式编程 非常荣幸地能够加入CrazePony团队 众所周知 一个飞行器想要做到悬停的话 xff0c 必须引入一个位置环进行反馈 xff0c 也就是说需
  • Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿

    来这里找解决方案的童鞋 xff0c 如果你的机器还没过保 果断去找官修 xff0c 忽略这篇文章 xff01 心急的童鞋直接看目录 xff0c 有传送门 xff01 但是仔细看文章可能有奇效 xff01 最近博客更新进度严重滞后 因为我遭遇
  • linux环境打包python工程为可执行程序

    本次又个需求 xff0c 在ubuntu上面开发的python代码程序需要打包成一个可执行程序然后交付给甲方 xff0c 因为不能直接给源码给甲方 xff0c 所以寻找方法将python开发的源码打包成一个可执行程序 xff0c 注意是打包
  • windows下python调用海康威视网络摄像头sdk

    本文参考以下博文加自己的实践 xff0c 发现有些步骤是不必要的 xff0c 例如不需要为opencv等第三方库指定路径 运行环境 xff1a 准备工作 1 海康SDK下载 2 下载安装vcpkg 3 安装Swig 4 下载OpenCV s
  • Apollo代码学习(七)—MPC与LQR比较

    Apollo代码学习 MPC与LQR比较 前言研究对象状态方程工作时域目标函数求解方法 前言 Apollo中用到了PID MPC和LQR三种控制器 xff0c 其中 xff0c MPC和LQR控制器在状态方程的形式 状态变量的形式 目标函数
  • 27 | Ubuntu18.04.5 安装python3.7及卸载

    目录 1 前期准备1 1安装所需依赖 重要 1 2 配置Python版本切换1 2 1 查看候选列表中已有的Python版本1 2 2 添加 python amp python3 指向选择1 2 3 查看候选列表中已有的Python版本1
  • opencv库作为第三方库

    在编译一个依赖opencv库的库时 xff0c 报出以下错误 xff1a undefined reference to symbol ZN2cv6imreadERKNS 6StringEi libopencv core so 2 4 err
  • 银河麒麟V10系统NetworkManager服务启动失败的解决方法

    目录 一 NetworkManger网络服务启动失败 二 故障定位过程 xff08 一 xff09 重装NetworkManager未解决 xff08 二 xff09 重装openssl未解决 三 解决方案 xff08 一 xff09 修改
  • argparse模块

    1模块简介2Example3argparse三个主要函数 parser argparseArgumentParserparseradd argumentargs parserparse args 4ArgumentParser对象 对象参数
  • 【Docker】非root用户加入docker用户组省去sudo (三)

    你问我爱你有多深 xff0c 这坑后面还有坑 为什么需要创建docker用户组 xff1f Docker守候进程绑定的是一个unix socket xff0c 而不是TCP端口 这个套接字默认的属主是root xff0c 其他是用户可以使用
  • 带你玩转Jetson Xavier NX系列教程 | Xavier NX刷机教程

    写在最前 xff1a xff08 转载请注明文章出处 xff09 NVIDIA AGX Jetson Xavier NX 开发人员套件终于拿到手了 xff0c Nx的性能虽然被砍了不少 xff0c 但是完全碾压了Nano和TX2 xff0c
  • 使用Intel RealSense D435i自制离线数据集跑通BundleFusion

    内容概览 摘要操作环境大致流程录制数据集格式转换解析 bag文件时间戳对齐制作源格式封装为 sens格式 离线三维重建修改 zParametersDefault txt修改 zParametersBundlingDefault txt重建效