利用手机摄像头采集图片运行ORB-SLAM2

2023-05-16

一、ROS配置安装

二、ORB_SLAM2配置安装

可参考前文  

ROS仿真环境安装与配置_身在江湖的郭大侠的博客-CSDN博客

三、Android手机摄像头与ROS建立通信

GitHub有个开源的项目,可以通过wifi将摄像头捕捉到的图片传输到ROS,地址:

https://github.com/hitcm/Android_Camera-IMU

作者也给出了博文,

ROS实时采集Android的图像和IMU数据 - hitcm - 博客园

下载代码、安装工具包

git clone https://github.com/hitcm/Android_Camera-IMU.git

sudo apt-get install ros-melodic-imu-tools  # 按实际安装indigo、Kinetic 等安装对应的工具包

三个文件

Camera_Imu.apk安装到手机上,注意有的手机可能因为安装版本过高导致无法运行此程序,可以试着在手机上装一个虚拟软件如VMOS Pro,这个安卓版本是7.1可以运行,还有一个版本的apk

Releases · huaibovip/android_ros_sensors · GitHub

这个版本的apk带源码,大佬可以二次开发,但是此apk笔者并未试成功

手机和电脑要在同一局域网下,在实验前可以在手机上安装一个ping工具,确保电脑和手机的网络是互通的,笔者是虚拟机,为了让手机与虚拟机的网互通,这是把虚拟机的网络模式设为桥接模式

 

 虚拟机打开

Terminal1 输入:

roscore

Android: 打开应用,在 在 IP Port 中修改 IP 地址为 PC的 IP地址,port不需要修改(PC 的 IP 可在 PC 终端输入 ifconfig 查看),之后点击 Connect,连接成功则进入相机界面。

Terminal 2 到下载git文件的目录打开android_cam-imu.launch:

cd Android_Camera-IMU      
roslaunch android_cam-imu.launch

这是会弹出一个Rviz界面:

如果要实时显示则

  • 如果要实时显示 image,需要 Add - By topic - 添加/camera/image_raw/image。
  • 如果要显示 imu,则需要 Add - By topic - 添加 imu,且在 Fix Frame 中 将 map 改为 imu。

 

 PS:

可以在Ubuntu里面用

rostopic list

查询订阅的主题,可以看到有订阅的图像和imu

 

 

 手机摄像头标定

为了 ORB-SLAM2 准确运行,需要对手机摄像头进行标定。标定方式为:对棋盘格标定板进行各个方向的拍照,之后基于 OpenCV 进行标定。注意这里采集的图片需要和 ORB-SLAM2 程序读取到的一致,所以不能直接使用手机自带相机 app 拍照,因为手机会自动通过算法进行校正,而上述通信传输的是 raw images。因此,首先我们需要完成的任务是:采集并保存摄像头图像。

使用下图作为标定板(参考资料),可直接在电脑屏幕上显示,对其拍照即可。

注意:

  • 实验发现,使用长宽格数不一样的棋盘标定板效果更好。
  • 实验发现,标定板周围要是白色的才行,黑色的提取不出角点来(在电脑屏幕上显示标定板时尤其需要注意)。
  • 摄像头需要从不同方向拍摄棋盘格,可参考 OpenCV 安装目录下 samples/data 中的 left0x.jpg 系列标定图片。

采集并保存图片

目前没有找到直接保存的方法,所以我们选择写一个 ROS node 来接收手机传来的图像,再通过 OpenCV 进行显示和保存。

为了方便,我们选择直接在 ORB-SLAM2 的 ros_mono.cc 的代码基础上进行修改,在 ros_mono.cc 同一目录下写了个 ros_camera_capture.cc:

/**
* This file is to capture images from Android phone, for camera calibration
* This file is used with Android_Camera-IMU
*/

#include<iostream>
#include<algorithm>
#include<fstream>
#include<chrono>

#include<ros/ros.h>
#include <cv_bridge/cv_bridge.h>

#include<opencv2/core/core.hpp>

#include"../../../include/System.h"

using namespace std;

string save_dir = "PATH"; // 修改为自己保存图片的路径
int imgId = 0;

void GrabImage(const sensor_msgs::ImageConstPtr& msg);

int main(int argc, char **argv)
{

    std::cout << "To save the current frame, please press 'Q' or 'q' " << std::endl;
    std::cout << "The images will be saved to " <<  save_dir << std::endl;

    ros::init(argc, argv, "PClistener");
    ros::start();

    ros::NodeHandle nodeHandler;
    ros::Subscriber sub = nodeHandler.subscribe("/camera/image_raw", 1, GrabImage);

    ros::spin();

    ros::shutdown();

    return 0;
}

void GrabImage(const sensor_msgs::ImageConstPtr& msg)
{
    string imgname;
    cv_bridge::CvImageConstPtr cv_ptr;
    try
    {
        cv_ptr = cv_bridge::toCvShare(msg);
        cv::Mat img = cv_ptr->image;
        cv::imshow("img_name", img);

        char key = cv::waitKey(1);
        // press "q" to save the image 
        if(key == 'q' || key == 'Q'){  
            imgId++;
            imgname = "img_" + to_string(imgId) + ".jpg";
            cv::imwrite(save_dir + imgname, img);
            std::cout << "has saved image "<< imgId << " to " << save_dir << std::endl;
        }
    }
    catch (cv_bridge::Exception& e)
    {
        ROS_ERROR("cv_bridge exception: %s", e.what());
        return;
    }
}

注意捕捉图像存储地址换成自己的

另外,在 ORB_SLAM2/Examples/ROS/ORB_SLAM2 目录中的 CMakeLists.txt 中添加如下内容(添加在 # Node for monocular camera 上方即可):

# Node for capture images for camera calibration
rosbuild_add_executable(CameraCapture
src/ros_camera_capture.cc
)

target_link_libraries(CameraCapture
${LIBS}
)

之后重新编译 ORB_SLAM2 项目。

cd PATH/ORB_SLAM2
./build_ros.sh

使用方法:

Terminal 1:

roscore

手机进入 app 运行

Terminal 2: 在 Android_Camera-IMU 目录

roslaunch android_cam-imu.launch

(可以关掉 Rviz)

Terminal 3:

rosrun ORB_SLAM2 CameraCapture

鼠标选中弹出的图像框,按下 q 键保存图像。一定要多角度多捕捉几张图片,否则很难捕捉到关键点。像这样

 

进行标定

使用 OpenCV samples 中的代码实现。参考资料

标定例程

新建一个工作目录(文件夹)camera_calibration_opencv,将 OpenCV 安装目录中的 samples/cpp/tutorial_code/calib3d/camera_calibration 文件夹内的内容拷贝至该目录。

修改 VID5.xml

VID5.xml 中存储着标定图像的路径,所以要在 VID.xml 中添加所有标定图像的路径,eg:图片换成自己捕捉照片存储的位置

<?xml version="1.0"?>
<opencv_storage>
<images>
/home/ghj/Desktop/slam/pictureimg_1.jpg
/home/ghj/Desktop/slam/pictureimg_2.jpg
/home/ghj/Desktop/slam/pictureimg_3.jpg
/home/ghj/Desktop/slam/pictureimg_4.jpg
/home/ghj/Desktop/slam/pictureimg_5.jpg
</images>
</opencv_storage>

修改 in_VID5.xml

表示棋盘格的宽和高,注意,这里的宽度和高度是指内部交叉点的个数,而不是方形格的个数。如上图棋盘的数据就是9和6。

<BoardSize_Width> 9</BoardSize_Width>
<BoardSize_Height>6</BoardSize_Height>

修改为每格的边长 (mm),拿尺子量。

<Square_Size>20</Square_Size>

修改 输入的VID5.xml 的路径(换成自己的))

<Input>"/home/ghj/Desktop/slam/camera_calibration_opencv/VID5.xml"</Input>

修改输出参数信息存储的地址(换成自己的)

  <Write_outputFileName>"/home/ghj/Desktop/slam/camera_calibration_opencv/out_camera_data.xml"</Write_outputFileName>

 此处原来是0,需要改为1,表示引入切向畸变参数(因为 ORB-SLAM2 中也引入了切向畸变参数),否则只有径向畸变参数。

<Calibrate_FixPrincipalPointAtTheCenter> 1 </Calibrate_FixPrincipalPointAtTheCenter>

其它地方应该不需要改动,想进一步了解可看其中的注释。

<?xml version="1.0"?>
<opencv_storage>
<Settings>
  <!-- Number of inner corners per a item row and column. (square, circle) -->
  <BoardSize_Width> 9</BoardSize_Width>
  <BoardSize_Height>6</BoardSize_Height>
  
  <!-- The size of a square in some user defined metric system (pixel, millimeter)-->
  <Square_Size>20</Square_Size>
  
  <!-- The type of input used for camera calibration. One of: CHESSBOARD CIRCLES_GRID ASYMMETRIC_CIRCLES_GRID -->
  <Calibrate_Pattern>"CHESSBOARD"</Calibrate_Pattern>
  
  <!-- The input to use for calibration. 
		To use an input camera -> give the ID of the camera, like "1"
		To use an input video  -> give the path of the input video, like "/tmp/x.avi"
		To use an image list   -> give the path to the XML or YAML file containing the list of the images, like "/tmp/circles_list.xml"
		-->
  <Input>"/home/ghj/Desktop/slam/camera_calibration_opencv/VID5.xml"</Input>
  <!--  If true (non-zero) we flip the input images around the horizontal axis.-->
  <Input_FlipAroundHorizontalAxis>0</Input_FlipAroundHorizontalAxis>
  
  <!-- Time delay between frames in case of camera. -->
  <Input_Delay>100</Input_Delay>	
  
  <!-- How many frames to use, for calibration. -->
  <Calibrate_NrOfFrameToUse>25</Calibrate_NrOfFrameToUse>
  <!-- Consider only fy as a free parameter, the ratio fx/fy stays the same as in the input cameraMatrix. 
	   Use or not setting. 0 - False Non-Zero - True-->
  <Calibrate_FixAspectRatio> 1 </Calibrate_FixAspectRatio>
  <!-- If true (non-zero) tangential distortion coefficients  are set to zeros and stay zero.-->
  <Calibrate_AssumeZeroTangentialDistortion>1</Calibrate_AssumeZeroTangentialDistortion>
  <!-- If true (non-zero) the principal point is not changed during the global optimization.-->
  <Calibrate_FixPrincipalPointAtTheCenter> 1 </Calibrate_FixPrincipalPointAtTheCenter>
  
  <!-- The name of the output log file. -->
  <Write_outputFileName>"/home/ghj/Desktop/slam/camera_calibration_opencv/out_camera_data.xml"</Write_outputFileName>
  <!-- If true (non-zero) we write to the output file the feature points.-->
  <Write_DetectedFeaturePoints>1</Write_DetectedFeaturePoints>
  <!-- If true (non-zero) we write to the output file the extrinsic camera parameters.-->
  <Write_extrinsicParameters>1</Write_extrinsicParameters>
  <!-- If true (non-zero) we show after calibration the undistorted images.-->
  <Show_UndistortedImage>1</Show_UndistortedImage>
 
</Settings>
</opencv_storage>

编译

在工作目录 camera_calibration_opencv 中新建 CMakeLists.txt:

project(Camera_Calibration)
set(CMAKE_CXX_STANDARD 11)

find_package(OpenCV 3.0 QUIET)
if(NOT OpenCV_FOUND)    
    find_package(OpenCV 2.4.3 QUIET)
    if(NOT OpenCV_FOUND)
        message(FATAL_ERROR "OpenCV > 2.4.3 not found.")
    endif()
endif()

include_directories(${OpenCV_INCLUDE_DIR})
add_executable(Camera_Calibration camera_calibration.cpp)
target_link_libraries(Camera_Calibration ${OpenCV_LIBS})

之后编译:

cd camera_calibration_opencv
mkdir build
cd build
cmake ..
make

运行,标定

cd camera_calibration_opencv
./build/Camera_Calibration ../in_VID5.xml

程序启动后会显示标定图像的角点提取情况,之后会显示校正后图像,一个一个全部关闭后才会保存标定参数至 out_camera_data.xml。

 标定结果写入camera_calibration/out_cam

 

  • <camera_matrix type_id="opencv-matrix"> 是相机内参矩阵,顺序为 fx, 0, cx; 0, fy, cy; 0, 0, 1。
  • <distortion_coefficients type_id="opencv-matrix"> 是畸变参数,其顺序为 k1, k2, p1, p2, k3。

之后在 ORB_SLAM2 中新建一个配置文件 mycam.yaml(建哪儿都行),将 TUM1.yaml 的内容拷贝过来,并把其中的 Camera 参数进行修改。

注意: 相机参数对 ORB-SLAM2 的运行效果有极大影响(尤其是初始化),所以标定过程须认真完成。

运行 ORB-SLAM2 Mono

Terminal 1:

roscore

手机进入 app 运行

Terminal 2: 在 Android_Camera-IMU 目录

roslaunch android_cam-imu.launch

(可以关掉 Rviz)

Terminal 3(加载的两个文件换成自己的):

rosrun ORB_SLAM2 Mono /home/ghj/ROS_SIM/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/ghj/ROS_SIM/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/mycam.yaml

运行效果展示:

 

注意: ORB-SLAM2 Mono 还是比较难以初始化的(其设置的初始化条件相对苛刻),在开始时,选择特征纹理丰富的区域,多上下左右平移相机,有利于初始化。

简化启动

上述启动步骤需要启动3个终端,挺麻烦的,所以可以选择写一个脚本来自动启动这3个终端。参考资料

新建 ORB_SLAM2_with_AndroidPhone.sh,在其中填入:

gnome-terminal --title="roscore" -x bash -c "roscore"
# 暂停 2s,保证几个不同终端的启动顺序
sleep 2s;  

gnome-terminal --title="AndroidPhone" -x bash -c "cd /home/ghj/Desktop/slam/Android_Camera-IMU; roslaunch android_cam-imu.launch"
sleep 2s;

gnome-terminal --title="ORB-SLAM2" -x bash -c "rosrun ORB_SLAM2 Mono /home/ghj/ROS_SIM/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/ghj/ROS_SIM/src/ORB_SLAM2/Examples/ROS/ORB_SLAM2/mycam.yaml"

之后赋予权限(仅需一次):

chmod +x ORB_SLAM2_with_AndroidPhone.sh

运行:

./ORB_SLAM2_with_AndroidPhone.sh

即可一次性打开3个终端,并运行相关命令。之后手机再打开 app 就可以了。

注意: 此时终端运行结束后会自动退出,如果不想自动退出,可 在terminal点右键,选择Preferences然后找到Command,里面有一项When command exits,后面选择为Hold the terminal open。参考资料

 

 

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

利用手机摄像头采集图片运行ORB-SLAM2 的相关文章

  • 安卓开发环境搭建

    系统 xff1a windows 64位 安卓开发环境是在java jdk的基础上配合android studio 集成开发环境或者eclipse 43 Android SDK 43 ADT的形式 一 JDK安装 JDK的全称是Java S
  • Helloworld应用程序结构分析

    一 新建HelloWorld工程 1 打开 Eclipse xff0c 点击 File gt 34 New 34 gt 34 Project 34 Android Application Project 34 34 在弹出的 New And
  • Ubuntu软件包apt-get无法更新解决办法

    Ubuntu软件更新的时候报错 Reading package lists Building dependency tree Reading state information You might want to run 39 apt ge
  • 游戏开发人员需要看的书籍

    编码习惯及设计基础 程序员修炼之道 http product dangdang com 9053091 html 这本书讲解的一些设计原理很实用 对设计感兴趣的同学可以一看 推荐指数 5星 图形渲染 客户端 3D绘图程序设计 http pr
  • 【MySql】杂记

    1 mysqldump常用于MySQL数据库逻辑备份 二进制日志文件 中提供了执行mysqldump之后对数据库的更改进行复制所需要的信息 2 要显示存储过程传出的值 xff0c 需要使用show关键字 3 MySQL数据类型 decima
  • 智能车调速部分

    下载本文 xff1a http pan baidu com s 1qWAW49m 杂谈 本文是自己在整理智能车项目相关心得时所作 xff0c 与大家分享 如需转载请注明出处 xff0c 谢谢 xff01 1 1 智能车简单调速 测速 要实现
  • Linux网络编程——UDP通信 代码实现

    UDP通信 1 UDP 代码实现流程如下所示 UDP通信过程 span class token comment 服务器端 span span class token number 1 span span class token functi
  • 为什么要防止头文件多重包含

    网上有大量文章说如何防止头文件多重包含 xff0c 却从来不去说为什么要去防止头文件多重包含 xff1f 还有极少数文章讲到了头文件多重包含的危害 xff0c 但是只提到了其中一点 先把题目的结论抛出来 xff0c 防止头文件多重包含的真正
  • rtthread ulog 日志组件

    ulog 简介 日志的定义 xff1a 日志是将软件运行的状态 过程等信息 xff0c 输出到不同的介质中 xff08 例如 xff1a 文件 控制台 显示屏等 xff09 xff0c 并进行显示和保存 为软件调试 维护过程中的问题追溯 性
  • UDS_19服务学习笔记

    1 19 01 ReportNumberOfDTCBByStatusMask 服务的目的 xff1a 通过上位机定义的DTCStatus 来获取服务端与状态掩码匹配的个数 Request 19 01 43 Status Response x
  • FreeRTOS-Systick笔记

    1 在Cortem M内核中 xff0c 继承了systick的定时器 xff0c 属于NVIC的一部分 xff0c 异常类型为 15 systick是一个24位的向下计数器 2 Systick寄存器 3 如何使用该定时器 1 xff09
  • FreeRTOS-任务调度

    1 系统配置完成systick模块后 xff0c 通常下每当产生一个systick中断就会运行SysTick Handler 2 分析void xPortSysTickHandler void a 通过操作寄存器basepri关闭一些中端
  • FreeRTOS-延迟分析vTaskDelay

    void vTaskDelay const TickType t xTicksToDelay 这个函数比较简单 xff0c 主要分析prvAddCurrentTaskToDelayedList这个函数 xff1a 将该任务挂到延迟列表里面
  • 华为荣耀刷机失败,不断重启的解决办法

    如果你因为用第三方的recovery刷了官方的rom xff0c 那么就会出现不断重启的情况 xff01 解决办法就是先刷回华为官方的recovery xff0c 再通过三键强刷一开始的华为官方rom xff0c 即可成功救砖 xff01
  • FreeRTOS笔记---列表和列表项

    1 列表结构体 xff1a typedef struct xLIST listFIRST LIST INTEGRITY CHECK VALUE 用来检查数据的完整性 configLIST VOLATILE UBaseType t uxNum
  • FreeRTOS学习笔记-----队列

    1 创建队列 define xQueueCreate uxQueueLength uxItemSize xQueueGenericCreate uxQueueLength uxItemSize
  • Autosar CAN通讯——CANSM

    关于CANSM参考 xff1a https zhuanlan zhihu com p 126073070
  • UDS一些时间参数

    最近在做 xff21 xff55 xff54 xff4f xff53 xff41 xff52 诊断 xff0c 发现在诊断中有一些时间参数需要配置 xff08 其实这个时间参数 xff21 xff55 xff52 xff4f xff53 x
  • sql server 数据库开发 知识点

    sql server 数据库开发 1 含义 xff1a 数据库设计实际上就是规划和结构化数据库中的数据对象以及这些数据对象之间关系的过程 E R图组成包括 xff1a 矩形表示实体集 椭圆表示属性 菱形表示关系 直线用来连接实体集与属性 x
  • Activiti学习笔记一 工作流基本概念

    最近刚接触流程引擎这一概念 xff0c 对Activiti进行学习 xff0c 感觉正在入门中 xff0c 整理下自己的学习笔记把 xff01 1 xff1a 工作流的概念 工作流 Workflow xff0c 就是 业务过程的部分或整体在

随机推荐

  • Activiti学习笔记六 流程实例 任务 执行对象控制流程执行

    上一篇我们看了流程定义 xff0c 我们接下来看一下流程实例 xff0c 任务 xff0c 和执行对象 流程实例 任务的执行 1 流程图 2 部署流程定义 private final ProcessEngine processEngine
  • datetimepicker 控件验证问题

    34 baseStudents activistTime 34 trigger 39 blur 39 validators notEmpty message 39 确定积极分子时间不能为空 39 span class hljs tag lt
  • eclipse中SVN分支合并到主干

    在项目开发中 xff0c 需要添加一些新的功能 xff0c 但是又不想影响到其他开发人员的项目进度 xff0c 所以决定使用SVN分支进行开发 xff0c 分支开发完毕后再合并到主干 本文介绍如何在eclipse中合并分支到主干 要想将分支
  • 阿里云服务器

    一年多之前 xff0c 也就11年5月份的样子 xff0c 阿里云云服务器产品线终于上线了 但那时候 xff0c 国内完全没有能称得上云服务器的 xff0c 很多小公司就是搞个VPS就叫云服务器了 以至于阿里云云服务器刚出来的时候 xff0
  • 双控机制信息化系统管理平台建设的趋势和必要性

    什么是安全双控体系 xff1f 双控体系即风险分级管控和隐患排查治理双重预防机制 xff0c 目的是对生产经营单位内的所有安全隐患进行系统性的全面排查 xff0c 结合相关安全隐患的危险程度 发生的可能性以及带来的严重后果进行分级别的管控
  • mac 下 使用 iterm2 配置及快键键使用

    mac 下 使用 iterm2 配置及快键键使用 标签 xff08 空格分隔 xff09 xff1a mac 之前介绍过一篇关于mac 下使用和配置 iterm2的blog 今天这篇稍微详细一点介绍 并且搭配 zsh zsh 会单独开一篇博
  • 登录报错后,状态码是401并弹出登录框

    前后端分离的项目 xff0c 登录失败后会弹出一个非前端页面登录框 这是因为登录失败 xff0c 返回的响应表头里添加了WWW Authenticate属性 WWW Authenticate Basic realm 61 34 oauth2
  • 解决secureCRT账号密码正确,无法连接服务器,那大概因为不支持新的密钥交换算法

    连接比较新版本的linux类服务器 xff0c 是否出现下面这些问题 xff1f 或者是openstack新建centos7镜像的时候 xff0c 无法连接新创建的centos7系统 我百度或者谷歌好像都没有找到答案啊 xff0c 所以才写
  • 树莓派SSH连接-SSH服务安装与开机自动启动

    1 SSH连接 SSH连接比Telnet远程桌面连接使用更为安全 xff0c 已经成为行业标准 使用SSH连接树莓派 xff0c 可以对树莓派进行远程控制与编程开发 xff0c 在没有桌面环境的条件下使用SSH连接是非常合适的选择 第2节和
  • 【VSCode Git】stage和stash的区别

    VSCode Git stage和stash的区别 问题来源 用vscode提交变更的文件时 xff0c 会发现2个相似的选项 Stage Changes 和 Stash Changes xff0c 乍一看不知道用哪个 xff0c 它们有什
  • canal文档

    简介 github地址 canal k n l xff0c 译意为水道 管道 沟渠 xff0c 主要用途是基于 MySQL 数据库增量日志解析 xff0c 提供增量数据订阅和消费 canal 工作原理 canal 模拟 MySQL slav
  • 自然拼读与词根词缀简版

    词根词缀 词根词缀重点 1 ab abs 表示远离 或否定 2 ac acr 表示尖 xff0c 酸 xff1b 3 aer aero 表示空气 xff0c 天空 4 am 表示爱 5 ambi ambul 表示周围 xff1b 6 ani
  • MySQL递归查询上下级菜单

    正文 在传统的后台管理系统里面经常会需要展示多级菜单关系 xff0c 今天我们来学一下如何使用一条SQL语句展示多级菜单 现在我们有一张corpinfo单位表 xff0c 里面有一个belong字段指向上级单位 xff0c 首先来看一下现在
  • 基于ESP32双无刷FOC电机的瓦力平衡机器人(2)

    恍恍惚惚中 xff0c 感觉瓦力已经慢慢悠悠的向我走来 xff0c 看了他的孤独 xff0c 感觉自己的也就不算什么了 断断续续搞了差不多两周的时间 xff0c 总算是把这些底层模块都调通了 xff08 虽然还完全看不出任何瓦力的影子 xf
  • 嵌入式 职位描述 职位要求

    来于智联招聘 前程无忧 xff0c 有关工作经验 xff0c 管理经验 xff0c 学历一并删掉 xff0c 只剩职位描述 职位要求 看看自己还缺些什么 嵌入式软件工程师 关专业 xff0c 本科或以上学历 xff1b 2 基础扎实 xff
  • 信道脉冲响应CIR

    博客写作技巧 xff1a 遇到的问题 如何解决问题 需要那种帮助 信道脉冲响应 xff1a CIR 问题 xff1a 场强测量系统需要获取场强和信道信息 xff0c 那么CIR是什么 xff1f 如何利用CIR反映信道特性 xff1f 解决
  • OpenMV数据打包发送以及STM32对数据的解析(串口方式)

    今天尝试了使用Openmv用串口发送数据 xff0c 32接收 xff0c 遇到了一些坑 xff0c 但是最后还是实现了 xff0c 难住我的地方并不是关于传输的代码 xff0c 而是那个板子串口3不知道因为什么原因接收到的数据是错误的 x
  • linux下 c++ 服务器开发(一)

    苦逼的c 43 43 程序员还没找到工作 xff0c 所以顺便开始写服务器练手 对内容不满意不要喷我我是写给自己看的 xff08 把自己犯得错误记下来 xff09 1 我的电脑是win10的 xff0c 所以先去网上下虚拟机 xff0c 我
  • 最优化算法——常见优化算法分类及总结

    之前做特征选择 xff0c 实现过基于群智能算法进行最优化的搜索 xff0c 看过一些群智能优化算法的论文 xff0c 在此做一下总结 最优化问题 在生活或者工作中存在各种各样的最优化问题 xff0c 比如每个企业和个人都要考虑的一个问题
  • 利用手机摄像头采集图片运行ORB-SLAM2

    一 ROS配置安装 二 ORB SLAM2配置安装 可参考前文 ROS仿真环境安装与配置 身在江湖的郭大侠的博客 CSDN博客 三 Android手机摄像头与ROS建立通信 GitHub有个开源的项目 xff0c 可以通过wifi将摄像头捕