Win10 RealSense L515 ORBSLAM2 配置全攻略

2023-05-16

目录

  • 背景简介
  • Step 1 准备 SDK
  • Step 2 连接设备
  • Step 3 测试例程
  • Step 4 配置环境
  • Step 5 相机标定
  • Step 6 编写入口
  • Step 7 实地运行
  • 附录A:获取内参代码
  • 附录B:yaml 参数文件
  • 附录C:入口程序

背景简介

  最近几天项目到达收尾阶段,需要在真实传感器上运行测试一下我们的系统。实验室正好拥有 Inter RealSense L515 这款传感器,故计划基于此测试。但是同门的师姐都是在 ROS 系统上运行,网上的资料也大多如此,最次也是 Ubuntu 系统,鲜少有 Win10 下的相关中文资料。但是 L515 本身是支持 Win10 系统的,故撰此博客记录配置过程,以飨后来者。

Step 1 准备 SDK

  登陆IntelRealSense的官方github,网址如右:https://github.com/IntelRealSense/librealsense/releases

  这里顺便提供一下IntelRealSense的官网上介绍SDK的部分,上面的很多资料以及介绍都是非常有用的:https://www.intelrealsense.com/sdk-2/

  目前(2021年12月9日)的最新版本是Intel® RealSense™ SDK 2.0 (v2.49.0),在对应位置的Assets模块中,下载:Intel.RealSense.SDK-WIN10-2.49.0.3474.exe,一共791MB

  不过不知为何,上述链接死活就是没法下载,类似的情况之前其实也遇到过。最后没办法,在CSDN上搜索到了别人上传的该安装文件,最后通过万能的某宝成功搞了下来,并一路默认完成安装。

  这里提供一下上述SDK的网盘下载地址:
  链接:https://pan.baidu.com/s/1_rtzxeIq2thyZd58ngeasw
  提取码:qri0

Step 2 连接设备

&esmp; L515 的连接方法非常简单,用自带的 USB 连接线将传感器与 PC 连接即可。插上即可,不必点击任何按钮。

  这部分的详细教程在官网上有图文并茂的介绍,不过其实都是傻瓜式操作,不看也罢。这里提供下官网教程链接:https://www.intelrealsense.com/get-started-depth-camera/

  成功连接后,电脑上应该有下列图标的提示。
在这里插入图片描述
  然后打开 SDK 中安装的Intel RealSense Viewer

在这里插入图片描述
  可以在左侧看到 L515 已经被成功识别,将下侧三个红色的按钮中的L500 Depth Sensor以及Motion Module点开后,就可以在右侧的空间中看到传感器当前的深度画面如下:

在这里插入图片描述  可以看到一排排的桌椅,此时设备就已连接成功了。

Step 3 测试例程

  打开Intel RealSense SDK 2.0的安装目录中的samples文件夹,可见名为rs-examples.sln的 VS2015 解决方案,此即 SDK 自带的例程。该解决方案在我电脑上的绝对路径是:C:\Program Files (x86)\Intel RealSense SDK 2.0\samples\rs-examples.sln,此应是默认安装路径,读者可以参考。

  打开解决方案后,可见左侧有很多例程项目,将hello-realsense项目右键设置为启动项目,然后点击本地Windows调试器生成运行,注意我这里采用的是Release x64模式。或者不想编译的话,直接在 SDK 根目录的tools文件夹下,也已经有上述所有例程的可执行文件,直接运行即可。

  注意启动例程的时候,要关闭Intel Realsense Viewer,否则两者之间会发生冲突,例程无法正常运行,显示结果。

  通过查看源代码,可知该例程显示的是相机深度图像中心点的距离,注意测试的时候不要太近也不要太远,否则都无法正常测距。我这里测试的效果如下:

在这里插入图片描述  除此之外还有其他很多例程,这里就不继续测试了,有兴趣的读者可以自己逐个查看源代码,明晰功能,测试效果。或者前往官网相关部分查看每个例程的介绍:https://dev.intelrealsense.com/docs/code-samples

Step 4 配置环境

  我们在ORBSLAM2中配置Intel RealSense SDK 2.0的环境。

  在 SDK 的根目录下,可见官方已经将对应 Visual Stuidio 的属性表文件给我们弄好了:glfw-imgui.propsintel.realsense.propsopencv.props

  将上述属性表,直接拖到ORBSLAM2的属性管理器中即可,只是注意这里我采用的是Release x64模式,并且我没有使用 SDK 自带的OpenCV3.4的属性表,而是使用我自己的OpenCV3.1

  在ORBSLAM2的工程目录下新建main.cpp,将之前的例程中rs-hello-realsense.cpp文件的内容复制进去,然后生成运行,测试能否成功运行。若运行成功,则说明环境配置OK

  这里要注意,glfw-imgui这个第三方库貌似 SDK 中并未提供库文件,不过例程的解决方案一旦编译,这些第三方库的库文件也会自动生成,库文件的生成目录在我电脑上是:C:\Program Files (x86)\Intel RealSense SDK 2.0\samples\x64\Release\glfw-imgui.lib 。因此,需要将上述库目录以及附加依赖项追加到对应的属性表中,上述测试main函数才能成功运行。

Step 5 相机标定

  运行ORBSLAM2,需要相关的yaml配置文件,其中就包含相机的几个内参。Intel RealSense SDK 2.0的 API 似乎有获取内参的相关命令,因此我们就以此获取其内参。

  获取内参的代码参考的是这篇博客:https://blog.csdn.net/ahelloyou/article/details/108965550,在此致以感谢。保险起见,这里将他的代码精简附载在附录A中,需要的读者可以直接取用。

  注意采用USB3.0接口,否则直接运行他的代码将报错。

  基于我所采用的相机,其输出如下:

在这里插入图片描述  由于我不清楚其彩色相机内参输出的诸参数之间的对应关系,这里就暂且参照 ORBSLAM2 参数文件中参数标明的顺序以及其大小与正负,审慎地将六个畸变参数按照输出次序视作k1、k2、p1、k3、p2,将ppx作为cx,ppy作为cy,写入 yaml 文件中。

  官网https://www.intelrealsense.com/lidar-camera-l515/上提供了L515的相关参数文件,但是原谅我实在没有找到他的baseline数据,深度比例也没有找到,因此无奈之下只能参照https://blog.csdn.net/weixin_41732319/article/details/102469604这篇博客中D435i的数据,即50mm。将其换算成米,然后乘以fx,最终得到Camera.bf30.33325。深度图比例DepthMapFactor则暂时设作1000.0

  如果有读者能够得到准确的yaml文件参数,万望联系我,不胜感谢之至。我上述采用的yaml文件附载在附录B中。

Step 6 编写入口

  由于ORBSLAM2本身工程性极佳,封装得非常完善,因此入口程序非常好编写,这里直接放在附录C里了。

Step 7 实地运行

  大抵是由于 yaml 参数文件的问题,具体运行起来非常容易丢失,而且特征的分布看起来也不太完全,建图的效果也不太对劲。但不管怎么讲,究竟是配置完成并跑出来了。

  参数问题是大问题,不过由于我们的项目暂时用不上建图与定位部分的功能,因此这里就暂不深究。希望在此能够抛砖引玉,期待后来者解决。

附录A:获取内参代码

#include <librealsense2/rs.hpp> 
#include <opencv2/opencv.hpp>

#include <iostream>


int main(int argc, char * argv[]) try
{
	// 注意采用USB3.0接口否则报错
	rs2::log_to_console(RS2_LOG_SEVERITY_ERROR);

	rs2::config cfg;

	// 配置彩色图像流:分辨率640*480,图像格式:BGR, 帧率:30帧/秒
	cfg.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_BGR8, 30);
	///配置深度图像流:分辨率640*480,图像格式:Z16, 帧率:30帧/秒
	cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);

	rs2::pipeline pipe;

	pipe.start(cfg);

	rs2::frameset data;
	data = pipe.wait_for_frames();		// 等待一帧数据,默认等待5s

	rs2::depth_frame depth = data.get_depth_frame(); 
	rs2::video_frame color = data.get_color_frame();  
	rs2::stream_profile dprofile = depth.get_profile();
	rs2::stream_profile cprofile = color.get_profile();

	// 获取彩色相机内参
	rs2::video_stream_profile cvsprofile(cprofile);
	rs2_intrinsics color_intrin = cvsprofile.get_intrinsics();
	std::cout << "\ncolor intrinsics: ";
	std::cout << color_intrin.width << "  " << color_intrin.height << "  ";
	std::cout << color_intrin.ppx << "  " << color_intrin.ppy << "  ";
	std::cout << color_intrin.fx << "  " << color_intrin.fy << std::endl;
	std::cout << "coeffs: ";
	for (auto value : color_intrin.coeffs)
		std::cout << value << "  ";
	std::cout << std::endl;
	std::cout << "distortion model: " << color_intrin.model << std::endl;	//畸变模型

	// 获取深度相机内参
	rs2::video_stream_profile dvsprofile(dprofile);
	rs2_intrinsics depth_intrin = dvsprofile.get_intrinsics();
	std::cout << "\ndepth intrinsics: ";
	std::cout << depth_intrin.width << "  " << depth_intrin.height << "  ";
	std::cout << depth_intrin.ppx << "  " << depth_intrin.ppy << "  ";
	std::cout << depth_intrin.fx << "  " << depth_intrin.fy << std::endl;
	std::cout << "coeffs: ";
	for (auto value : depth_intrin.coeffs)
		std::cout << value << "  ";
	std::cout << std::endl;
	std::cout << "distortion model: " << depth_intrin.model << std::endl;	//畸变模型

	// 获取深度相机相对于彩色相机的外参,即变换矩阵: P_color = R * P_depth + T
	rs2_extrinsics extrin = dprofile.get_extrinsics_to(cprofile);
	std::cout << "\nextrinsics of depth camera to color camera: \nrotaion: " << std::endl;
	for (int i = 0; i < 3; ++i) {
		for (int j = 0; j < 3; ++j) {
			float value = extrin.rotation[3 * i + j];
			std::cout << value << "  ";
		}
		std::cout << std::endl;
	}
	std::cout << std::endl;

	std::cout << "translation: ";
	for (auto value : extrin.translation)
		std::cout << value << "  ";
	std::cout << std::endl;

	while (1)
	{
		// 等待一帧数据,默认等待5s
		data = pipe.wait_for_frames();

		rs2::depth_frame depth = data.get_depth_frame();  //获取深度图像数据
		rs2::video_frame color = data.get_color_frame();  //获取彩色图像数据
		int color_width = color.get_width();
		int color_height = color.get_height();

		int depth_width = depth.get_width();
		int depth_height = depth.get_height();

		if (!color || !depth) break;					  //如果获取不到数据则退出

		// 将彩色图像和深度图像转换为Opencv格式
		cv::Mat image(cv::Size(color_width, color_height), CV_8UC3, (void*)color.get_data(), cv::Mat::AUTO_STEP);
		cv::Mat depthmat(cv::Size(depth_width, depth_height), CV_16U, (void*)depth.get_data(), cv::Mat::AUTO_STEP);

		// 显示
		cv::imshow("image", image);
		cv::imshow("depth", depthmat);
		cv::waitKey(1);
	}
	return EXIT_SUCCESS;
}
catch (const rs2::error & e)
{
	// 捕获相机设备的异常
	std::cerr << "RealSense error calling " << e.get_failed_function() << "(" << e.get_failed_args() << "):\n    " << e.what() << std::endl;
	return EXIT_FAILURE;
}
catch (const std::exception& e)
{
	std::cerr << "Other error : " << e.what() << std::endl;
	return EXIT_FAILURE;
}

附录B:yaml 参数文件

%YAML:1.0

#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------

# Camera calibration and distortion parameters (OpenCV) 
Camera.fx: 606.665
Camera.fy: 606.971
Camera.cx: 311.165
Camera.cy: 243.516

Camera.k1: 0.19043
Camera.k2: -0.590583
Camera.k3: 0.00189283
Camera.p1: -0.00175337
Camera.p2: 0.527222

Camera.width: 640
Camera.height: 480

# Camera frames per second 
Camera.fps: 30.0

# IR projector baseline times fx (aprox.)
Camera.bf: 30.33325

# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 1

# Close/Far threshold. Baseline times.
ThDepth: 40.0

# Deptmap values factor
DepthMapFactor: 1000.0

#--------------------------------------------------------------------------------------------
# ORB Parameters
#--------------------------------------------------------------------------------------------

# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 1000

# ORB Extractor: Scale factor between levels in the scale pyramid 	
ORBextractor.scaleFactor: 1.2

# ORB Extractor: Number of levels in the scale pyramid	
ORBextractor.nLevels: 8

# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast			
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7

#--------------------------------------------------------------------------------------------
# Viewer Parameters
#--------------------------------------------------------------------------------------------
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1
Viewer.GraphLineWidth: 0.9
Viewer.PointSize: 2
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3
Viewer.ViewpointX: 0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -1.8
Viewer.ViewpointF: 500

附录C:入口程序

#include <librealsense2/rs.hpp> 
#include <opencv2/opencv.hpp>

#include <string>
#include <iostream>

#include<System.h>


int main(int argc, char * argv[]) try
{
	rs2::config cfg;

	// 配置彩色图像流:分辨率640*480,图像格式:BGR, 帧率:30帧/秒
	cfg.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_BGR8, 30);
	///配置深度图像流:分辨率640*480,图像格式:Z16, 帧率:30帧/秒
	cfg.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16, 30);

	rs2::pipeline pipe;

	pipe.start(cfg);

	rs2::frameset data;

	std::string voc = "E:\\Download\\Source\\ORB-SLAM2\\Run\\Vocabulary\\ORBvoc.bin";
	std::string settings = "E:\\L515.yaml";

	ORB_SLAM2::System SLAM(voc, settings, ORB_SLAM2::System::RGBD, true);

	while (1)
	{
		data = pipe.wait_for_frames();

		rs2::depth_frame depth = data.get_depth_frame(); 
		rs2::video_frame color = data.get_color_frame(); 
		int color_width = color.get_width();
		int color_height = color.get_height();

		int depth_width = depth.get_width();
		int depth_height = depth.get_height();

		if (!color || !depth) break;					 

		cv::Mat imRGB(cv::Size(color_width, color_height), CV_8UC3, (void*)color.get_data(), cv::Mat::AUTO_STEP);
		cv::Mat imD(cv::Size(depth_width, depth_height), CV_16U, (void*)depth.get_data(), cv::Mat::AUTO_STEP);

		SLAM.TrackRGBD(imRGB, imD, color.get_timestamp());

		// cv::imshow("image", image);
		// cv::imshow("depth", depthmat);
		// cv::waitKey(1);
	}
	SLAM.Shutdown();

	return EXIT_SUCCESS;
}
catch (const rs2::error & e)
{
	std::cerr << "RealSense error calling " << e.get_failed_function() << "(" << e.get_failed_args() << "):\n    " << e.what() << std::endl;
	return EXIT_FAILURE;
}
catch (const std::exception& e)
{
	std::cerr << "Other error : " << e.what() << std::endl;
	return EXIT_FAILURE;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Win10 RealSense L515 ORBSLAM2 配置全攻略 的相关文章

  • VMware Workstation 与 Device/Credential Guard 不兼容 解决方案

    win10专业版官方解决方案 https kb vmware com s article 2146361 win10家庭版解决方案 win10家庭版本身是不支持Hyper V服务的 但是如果是 win10预览体验家庭版 会在 服务 中发现有
  • win10开机后电脑磁盘占用百分之百解决方法

    1 我的电脑 管理 服务与应用程序 服务 superfetch 禁用 重启 2 控制面板 管理工具 服务 找到 HomeGroupListener 家庭组 服务 禁用 3 关闭自动维护计划任务 选中磁盘C 属性 工具 对驱动器进行优化和碎片
  • 【已解决】戴尔笔记本电脑的卡顿问题.

    问题说明 戴尔笔记本电脑有个毛病 就是时不时的会卡一下 有的时候几天都不卡顿一次 有的时候几分钟就卡顿一次 这个问题让人很不舒服 也很困惑 怎么才能解决这个问题呢 本文给出了答案 查找原因 根据任务管理器详细信息选项卡 卡顿检测程序和录屏软
  • 修改注册表解决Win10 SSD卡顿

    转自 http www pconline com cn win10 739 7395324 html 11月12日 微软发布了Win10的首个大版本更新TH2 Threshold 2 小编也在第一时间下载并安装了它 然而奇怪的是 自从装上这
  • 无线网开机不能用显示红色叉号

    操作系统不能上无线网络 一般是先检查无线网卡驱动程序是否正常 然后检查无线服务是否开启 用操作系统中自带网络诊断之后 显示此计算机上没有运行的windows无线服务 开始 运行 输入 services msc 点击确定 或按下回车键 Ent
  • 联想笔记本安装win10 ubuntu配置步骤

    一 准备ubuntu分区 在win10下用磁盘管理工具 磁盘管理工具可以右键我的电脑 gt 属性 gt 磁盘管理工具打开 选中安装ubuntu的目标硬盘 右键 gt 压缩卷 会自动计算出可以分出的空间大小 根据自己需求进行压缩 压缩后会生成
  • 解决WIN10 ,在资源管理器搜索文件时,必须按回车才能开始搜索的问题

    解决WIN10 在资源管理器搜索文件时 必须按回车才能开始搜索的问题 在使用WIN10中 在资源管理器中经常搜索文件 而每次搜索文件时 必须按回车才能开始搜索 不像WIN7那个 每输入一个字符 就自动搜索所输入的字符或字条串 如果偶尔用一下
  • win10 电脑 .Net framework3.5 组件无法安装0x800f801f

    最近在win10上安装了MotorControl Workbench 5 4 0软件需要用到 Net framework3 5 但是安装Net framework3 5老是出错 无论是下载离线安装包安装 还是通过 控制面板 中 程序 的 启
  • win10 安装 Ubuntu 子系统

    参考 Linux Ubuntu 20 04换阿里源 Ubuntu 20 04换国内源 清华源 阿里源 中科大源 163源 开启win10下Ubuntu子系统的SSH服务 Win10 wsl linux子系统ssh服务自启动设置 安装使用oh
  • vhdx中的win10进行大版本系统升级

    文章目录 前言 普通的win10大版本iso升级方式 vhdx中的win10大版本升级方式 难点分析 无法在虚拟驱动器上安装windows 解决方案 HyperV升级vhdx win10 过程效果图 hyperV虚机创建mbr引导启动项 h
  • 【SLAM学习笔记3】ORB-SLAM2中的方向梯度直方图(HOG,Histogram of Gradient)

    文章目录 前言 一 基础知识 1 梯度 gradient 2 一阶微分 3 图像梯度计算 图像微分 的应用 4 卷积 二 方向梯度直方图 旋转直方图 1 HOG特征 1 核心思想 2 实现方法 3 进一步优化 4 优点 具有尺寸不变性和光照
  • Win 10系统无法连接蓝牙耳机问题

    问题描述 本人刚入手的笔记本电脑 设置里面也有 蓝牙 的开关 由于处于实验室的环境不能开外放 有线耳机显得很不舒服 于是本人兴奋地拿起平时用的蓝牙耳机 想和电脑连起来 但是打开蓝牙开关之后 遇到了下面的情况 打开添加完设备之后 不仅仅是本人
  • vhd win10系统蓝屏问题(inaccessible boot device/0x000000c1)

    我的win10 是安装在vhdx虚拟磁盘中 在安装云桌面软件后 重启无法进入win10系统 出现蓝屏现象 具体的报错信息为 inaccessible boot device或 0x000000c1 问题根源 根源是云桌面软件为了接管系统的u
  • Windows 0x80190001错误解决

    Windows 0x80190001错误 笔者使用的系统版本为win10 2004 若同学们正在使用的系统为Windows 11 请移步这篇文章 Windows11 0x80190001错误解决 windows出现这样的错误 初步判断为wi
  • Win10、Win11 增加系统暂停更新时间教程

    在我们日常电脑的使用中 经常会遇到系统弹出系统更新提示 还不想更新系统的用户就会设置暂停更新 但是暂停更新是有时间限制的 在设置中我们可以看得到最多只能暂停 5 周更新 下面是延长暂停时间的教程 基本等于永久关闭更新 1 首先 按键盘上的
  • 常规键盘快捷键以及win10常用命令

    文章目录 常规键盘快捷键 win10常用命令 常规键盘快捷键 所有窗口最小化 win d 打开 我的电脑 win e 调出 运行 win r 全选 ctrl a 剪切 ctrl x 复制 ctrl c 粘贴 ctrl v 查找 ctrl f
  • log4j漏洞复现

    第一步 下载marshalsec 源码进行编译 https github com mbechler marshalsec 下载后进行编译打包 mvn clean package DskipTests 得到jar文件 在这里插入图片描述 第二
  • windows10下安装kali子系统

    写在前面 为什么我会想到在窗下装一个卡利 作为一个小白 平时做CTF题的时候 有时会用到python2 7环境 比如一些脚本需要 还有窗户下用的SqlMap的话 好像只支持在python2 7 之前被这个坑了好久 想用它的时候突然发现我的S
  • 联想Win10安装Ubuntu双系统教程

    前言 最近为了更好的做一名程序员 猿 所以准备装一个双系统 也就是Ubuntu系统 网上坑太多 所以决定自己写一点操作步骤 首先看一下我的计算机配置 联想小新700 Tip 这里的安装步骤仅仅针对联想Win10改型号或者相关型号 其他品牌型
  • win10 的图标丢失了怎么办?

    情况说明 几分钟前 自己手贱 居然一不小心把那D盘的分区表给删了 虽然说是借助DiskGenius即使找了回来 但是一个尴尬的情况出现了 原来装在D盘的程序虽然可以用 但是图标却没了 这对于有强迫症的我来说 让我浑身不舒服 解决方案 首先

随机推荐

  • Cmake 2 静态链接

    代码地址cmake examples 01 basic C static library at master ttroy50 cmake examples GitHub 文件路径这样 cmake文件这样 1 生成静态链接库 2 填充包括目录
  • Cmake 3 动态链接库

    代码地址 cmake examples 01 basic D shared library at master ttroy50 cmake examples GitHub 文件结构 1 添加动态链接库 和静态链接一样 这个add libra
  • PelcoD_协议指令分析

    通过协议收发控制第三方云台转动 一般的云台指令协议格式例如 xff1a span class token comment 发送带正负号的垂直角度 span span class token keyword float span vert a
  • 【学习笔记】Esp32 Arduino 串口中断函数 缓冲区修改

    Esp32 Arduino 串口中断函数 缓冲区修改 一 前景描述1 遇到的问题2 开发环境 二 解决问题1 示例代码2 代码缺陷2 解决办法 三 最后的话 一 前景描述 最近需要用Esp32上传数据 xff0c 有一块数据采集板 xff0
  • C++程序编译过程

    C 43 43 程序编译的四个步骤 xff1a 编译预处理 xff0c 编译优化 xff0c 汇编 xff0c 链接 编译预处理 xff1a 处理以 开头的指令 xff0c 将源码 cpp 文件处理成 i 文件 编译优化 xff1a 将 i
  • 查询方式/中断方式/DMA方式的区别及适用范围

    区别 xff1a 查询方式 xff1a CPU与设备串行工作 数据传送与主程序串行工作 xff1b 中断方式 xff1a CPU与设备并行工作 数据传送与主程序串行工作 xff1b DMA方式 xff1a CPU与设备并行工作 数据传送与主
  • vscode、idea、vim 开发工具快捷键

    vscode vscode快捷键文字版 配置启用 禁用 VSCodeVim 插件的快捷键 xff1a Vim Toggle Vim Mode 项 配置启用 vimrc 文件 idea 配置启用 禁用 Idea Vim 插件的快捷键 xff1
  • TDK一体化 IMU 评估板SmartBug2.0 像七星瓢虫一样可爱

    继 2019 年最初的 SmartBug 取得成功后 xff0c 2023 年 1 月初 xff0c TDK 公司宣布宣布推出 InvenSense SmartBug 2 0 评估板 SmartBug2 0 外观与 SmartBug 相似
  • C++ 指针(二)char与指针

    一 char字符串数组和char指针 上一小节对指针的操作进行简单的介绍 xff0c 本小节主要介绍的是char类型和指针之间的一些联系 xff08 虽然使用std string很方便 xff0c 但是我觉得了解这个还是有必要的 xff09
  • stm32f103单线半双工uart通信程序

    文章目录 前言 一 使用步骤 1 打开STMcubemx 2 添加代码 总结 前言 在使用数字舵机时 所用到的通信方式为uart通信 但舵机只有三根接线 出去vcc和gnd 只有一条通信线 也就是说要实现双向通信 只能使用单线半双工模式 本
  • BlueROV加舵机控制以及走过的弯路

    BlueROV加舵机控制以及走过的弯路 因实验需求 xff0c 需要在BlueROV上加上一个一自由度的机械臂 xff0c 由一个水下舵机控制 xff0c 水下舵机需要通过PWM控制 xff0c PWM输出由手柄控制 思路也很简单 xff1
  • ORB_SLAM2 CMakeLIsts文件注释

    最近在学习ORB SLAM 发现基本找不到CMakeLists的代码注释 就决定自己注释一份 如果发现有问题的地方 欢迎和我交流 span class token function cmake minimum required span s
  • UART、RS232 、RS485 区别

    UART RS232 RS485 区别 UART RS232 RS485这些物理层的串口通信 xff0c 它们都是在同一时间发送一位 RS232 RS485只是串口通讯的变种 xff0c 理解了UART串口通讯 xff0c 那么RS232和
  • 在STM32中使用printf()的方法(可直接复制粘贴)

    1 使用printf的方法 1 1 重定向 在使用printf之前添加重定向代码 xff1a span class token macro property span class token directive hash span span
  • 【字符串】字符串长度与字节长度

    字符串长度 xff1a 字符串在遇到 0 之前一共有几个字符 字节长度 字符串里出现的所有元素 例如 xff1a char str 61 123abc 0123 字符串长度 xff1a 6 字节长度 xff1a 11 PS xff1a 如果
  • C语言-字符串拼接(不用strcat函数)

    include lt stdio h gt int main char str1 100 char str2 100 int i 61 0 j 61 0 printf 34 请输入字符串1 xff1a n 34 gets str1 prin
  • Qt(十四)——实现机器人完整导航功能

    Qt xff08 十四 xff09 实现机器人完整导航功能 目录 1 ui 设计2 核心代码 1 ui 设计 2 核心代码
  • vector容器存放自定义数据类型及指针

    include lt iostream gt using namespace std include lt vector gt class person public person string a int b name a age b s
  • unreal 启动报错:运行引擎需要D3D11兼容GPU(功能级别11.0,着色器模型5.0)处理

    问题 AMD核显电脑 xff0c 突然有一天开机后显示器显示效果发白 xff0c 刚开始没在意 xff0c 后来某天想使用Unreal时发现启动不了了 xff0c 弹窗报错 xff1a 运行引擎需要D3D11兼容GPU xff08 功能级别
  • Win10 RealSense L515 ORBSLAM2 配置全攻略

    目录 背景简介Step 1 准备 SDKStep 2 连接设备Step 3 测试例程Step 4 配置环境Step 5 相机标定Step 6 编写入口Step 7 实地运行附录A xff1a 获取内参代码附录B xff1a yaml 参数文