机器人操作系统ROS—深度相机+激光雷达实现vSLAM建图与导航 转载

2023-05-16

原文:机器人操作系统ROS—深度相机+激光雷达实现vSLAM建图与导航_wx5d23599e462fa的技术博客_51CTO博客

这次将带大家学习如何使用深度相机实现机器人的视觉SLAM建图及导航。

目录 

一、 概述

    1.深度相机

    2.常见的深度相机

        2.1 双目视觉(Stereo)

        2.2 结构光(Structured-light)

        2.3 光飞行时间法(TOF)

    2.4 综合对比

二、 摄像头通路打通

    1.硬件连接

    2.安装驱动

    3.测试摄像头

    4.点云显示

    5.转激光雷达数据测试

三、 视觉 vSLAM 建图及导航

    1.vSLAM建图

    2.导航

四、视觉+激光雷达建图及导航

    1.视觉+激光雷达建图

    2.视觉vSLAM +激光雷达导航

一、 概述
1.深度相机
随着机器视觉,自动驾驶等颠覆性的技术逐步发展,采用3D相机进行物体识别,行为识别,场景建模的相关应用越来越多,可以说深度相机就是终端和机器人的眼睛,那么什么是深度相机呢,跟之前的普通相机(2D)想比较,又有哪些差别?深度相机又称之为3D相机,顾名思义,就是通过该相机能检测出拍摄空间的景深距离,这也是与普通摄像头最大的区别。

普通的彩色相机拍摄到的图片能看到相机视角内的所有物体并记录下来,但是其所记录的数据不包含这些物体距离相机的距离。仅仅能通过图像的语义分析来判断哪些物体离我们比较远,哪些比较近,但是并没有确切的数据。而深度相机则恰恰解决了该问题,通过深度相机获取到的数据,我们能准确知道图像中每个点离摄像头距离,这样加上该点在2D图像中的(x,y)坐标,就能获取图像中每个点的三维空间坐标。通过三维坐标就能还原真实场景,实现场景建模等应用。

深度相机也具备普通相机的一些不足,容易受视差影响:包括黑色物体(特征点少)、透明物体(光的穿透)、光滑物体(光反射太强)、图像无纹理(特征点少)、过度曝光(特征点少)等。

2.常见的深度相机
目前市面上常有的深度相机方案有以下三种:

2.1 双目视觉(Stereo)
双目立体视觉(Binocular Stereo Vision)是机器视觉的一种重要形式,他是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取物体三维几何信息的方法。

双目相机的主要优点有:

1)硬件要求低,成本也低。普通 CMOS 相机即可
2)室内外都适用。只要光线合适,不要太昏暗
但是双目的缺点也是非常明显:

1)对环境光照非常敏感。光线变化导致图像偏差大,进而会导致匹配失败或精度低
2)不适用单调缺乏纹理的场景。双目视觉根据视觉特征进行图像匹配,没有特征会导致匹配失败
3)计算复杂度高,需要很高的计算资源。该方法是纯视觉的方法,对算法要求高,实时性差
4)基线限制了测量范围。测量范围和基线(两个摄像头间距)成正比,导致无法小型化
代表公司:

Leap Motion, ZED, 大疆
2.2 结构光(Structured-light)
通过近红外激光器,将具有一定结构特征的光线投射到被拍摄物体上,再由专门的红外摄像头进行采集。这种具备一定结构的光线,会因被摄物体的不同深度区域,而采集不同的图像相位信息,然后通过运算单元将这种结构的变化换算成深度信息,以此来获得三维结构。简单来说就是,通过光学手段获取被拍摄物体的三维结构,再将获取到的信息进行更深入的应用。通常采用特定波长的不可见的红外激光作为光源,它发射出来的光经过 一定的编码投影在物体上,通过一定算法来计算返回的编码图案的畸变来得到物体的位置和深度信息。下图是一个典型的结构光相机的示意图:

结构光(散斑)的优点主要有:

1)方案成熟,相机基线可以做的比较小,方便小型化。
2)资源消耗较低,单帧 IR 图就可计算出深度图,功耗低。
3)主动光源,夜晚也可使用。
4)在一定范围内精度高,分辨率高,分辨率可达 1280×1024,帧率可达 60FPS。
散斑结构光的缺点与结构光类似:

1)容易受环境光干扰,室外体验差。
2)随检测距离增加,精度会变差。
代表公司:

奥比中光,苹果(Prime Sense),微软 Kinect-1,英特尔 RealSense, Mantis Vision 等。
2.3 光飞行时间法(TOF)
顾名思义是测量光飞行时间来取得距离,具体而言就是通过给目标连续发射激光脉冲,然后用传感器 接收从反射光线,通过探测光脉冲的飞行往返时间来得到确切的目标物距离。因为光速激光,通过直接测 光飞行时间实际不可行,一般通过检测通过一定手段调制后的光波的相位偏移来实现。TOF 法根据调制方法的不同,一般可以分为两种:脉冲调制(Pulsed Modulation)和连续波调制 (Continuous Wave Modulation)。脉冲调制需要非常高精度时钟进行测量,且需要发出高频高强度激光,目 前大多采用检测相位偏移办法来实现 TOF 功能。简单来说就是,发出一道经过处理的光,碰到物体以后会反射回来,捕捉来回的时间,因为已知光速和调制光的波长,所以能快速准确计算出到物体的距离。

其原理示意图:

因为 TOF 并非基于特征匹配,这样在测试距离变远时,精度也不会下降很快,目前无人驾驶以及一些高端的消费类 Lidar 基本都是采用该方法来实现。

TOF 的优点主要有:

1)检测距离远。在激光能量够的情况下可达几十米
2)受环境光干扰比较小
但是 TOF 也有一些显而易见的问题:

1)对设备要求高,特别是时间测量模块。
2)资源消耗大。该方案在检测相位偏移时需要多次采样积分,运算量大。
3)边缘精度低。
4)限于资源消耗和滤波,帧率和分辨率都没办法做到较高。
代表公司:

微软 Kinect-2,PMD,SoftKinect, 联想 Phab。

传感器技术不是很成熟,因此,分辨率较低,成本高,但由于其原理与另外两种完全不同,实时性高,不需要额外增加计算资源,几乎无算法开发工作量,是未来。
2.4 综合对比
从上面三种主流的 3D 相机成像方案来看,各有优劣,但是从实际应用场景来看,在非无人驾驶域,结构光,特别是散斑结构光的用途是最广泛。因为从精度,分辨率,还有应用场景的范围来看双目和 TOF 都没有办法做到最大的平衡。而且对于结构光容易受环境光干扰,特别是太阳光影响问题,鉴于此类相机都有红外激光发射模块,非常容易改造为主动双目来弥补该问题。

结构光与TOF的对比:

对比来看,结构光技术功耗更小,技术更成熟,更适合静态场景。而TOF方案在远距离下噪声较低,同时拥有更高的FPS,因此更适合动态场景。

目前,结构光技术主要应用于解锁以及安全支付等方面,其应用距离受限。而TOF技术主要用于智能机后置摄影,并在AR、VR等领域(包括3D拍照、体感游戏等)有一定的作用。

3D结构光和TOF两者其实各有优劣势。结构光最大的优势是发展的较为成熟,成本比较低,劣势是只适合中短距离使用。ToF优势是抗干扰性较好,视角较宽,缺陷是功耗高,造价贵,精度及深度图分辨率较低。两项技术各有侧重点和适配使用场景。

结构光相机硬件说明:

综合考虑成本,本文将采用此类相机,在这里单独说明下。

Kinect(xbox游戏机配件):

乐视体感相机(乐视tv配件):

相机一般有三只眼睛,从左到右分别为:

投射红外线pattern的IR Projector(左)
摄像头Color Camera(中)
读取反射红外线的IR Camera(右)
Depth传感器读取左右两边投射的红外线pattern,通过pattern的变形来取得Depth的信息。

二、 摄像头通路打通
1.硬件连接
考虑成本,我们在上一次组装的ROS+底盘套装的基础上,新增一个深度相机即可:

乐视体感三合一摄像头 * 1
usb子母延长线          * 1
2.安装驱动
# 安装相关依赖
sudo apt install ros-$ROS_DISTRO-rgbd-launch ros-$ROS_DISTRO-libuvc-camera ros-$ROS_DISTRO-libuvc-ros ros-$ROS_DISTRO-camera-info-manager   # ros-$ROS_DISTRO-libuvc 
# 安装vslam相关依赖
sudo apt install ros-$ROS_DISTRO-rtabmap ros-$ROS_DISTRO-rtabmap-ros ros-$ROS_DISTRO-depthimage-to-laserscan

# 克隆功能包源码
cd ~/catkin_ws/src
git clone git@github.com:orbbec/ros_astra_camera.git
git clone git@github.com:yanjingang/robot_vslam.git

# 创建udev规则
cd ros_astra_camera
chmod +x ./scripts/create_udev_rules
./scripts/create_udev_rules
# 配置并加载环境变量(机器人端执行)
cd ~/catkin_ws/src
./robot_vslam/script/setrgbd.sh astrapro
source ~/.bashrc          # export CAMERA_TYPE=astrapro

# 编译
cd ~/catkin_ws
catkin_make --pkg astra_camera robot_vslam
source ~/catkin_ws/devel/setup.bash
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
3.测试摄像头
在完成第一步的功能包编译之后,将摄像头连接到机器人的主机

# 0.检查摄像头是否正常识别
ll /dev/astra*
  lrwxrwxrwx 1 root root 15 Jan  6 12:50 /dev/astra_pro -> bus/usb/001/014
  lrwxrwxrwx 1 root root 15 Jan  6 12:50 /dev/astrauvc -> bus/usb/001/015

# 1.机器人端启动摄像头(启动后会弹出几个警告,不用管它,这是由于驱动中的一些参数摄像头不支持)
#roslaunch astra_camera astra.launch  # Use Astra
roslaunch robot_vslam astrapro.launch
# 如果报Warning: USB events thread - failed to set priority. This might cause loss of data...,是因为没有权限,执行以下命令
#sudo -s
#source /home/work/.bashrc
#roslaunch robot_vslam astrapro.launch

# 2.PC 端查看图像(常用topic:深度:/camera/depth/image;彩色:/camera/rgb/image_raw/compressed;红外:/camera/ir/image;注:ir图像只能通过rviz显示,在rqt_image_view 中显示会是全黑,这和图像格式有关,并非设备问题)
rviz  或 rqt_image_view
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
4.点云显示
这一部分为了让大家了解一下 rviz 中的各类插件的使用,将带着大家一起搭建一个 rviz 显示环境。(如果不想进行手动配置,也可以直接使用预先配置好的文件:/robot_vslam/rviz/astrapro.rviz)

首先我们添加一个点云显示插件,点击”Add”,在弹出的界面中双击” PointCloud2”:

展开左侧PointCloud2选型卡,选择Topic:

将 Fixed Frame 选择为 camera_link:

此时界面中就会显示出点云图:

在 Color Transformer 中选择不同的颜色模式可以给点云按照不同的规则着色:

最后通过左上角的”File”选项卡中 Save Config As 可以将当前 rviz 配置保存到指定位置,下次打开 rviz 候可以通过 Open Config 直接打开配置文件避免再次手动配置界面。

5.转激光雷达数据测试
# 启动深度相机(机器人端)
roslaunch robot_vslam camera.launch
# 启动深度图到雷达数据的转换
roslaunch robot_vslam depth_to_laser.launch

# pc端可视化
rviz

配置一下界面就可以正常显示雷达数据了

这里可以注意到,相对于机器人的 TF 坐标位置,雷达数据并不是像我们常见的激光雷达数据是 360 度的,这是由于深度相机的视场角(即 FOV,我们这款相机水平 FOV 为 58.4 度,垂直FOV 为 45.5 度)是有限的,所以转换出的雷达数据角度范围和相机是水平 FOV是一致的,简单理解就是,只能看到相机前方一定角度范围内的东西。

三、 视觉 vSLAM 建图及导航
1.vSLAM建图
机器人端启动建图:

# 启动底盘base control
roslaunch ros_arduino_python arduino.launch
# 启动camera
roslaunch robot_vslam camera.launch
# 启动rtab vslam
roslaunch robot_vslam rtabmap_rgbd.launch

在 rtabmap_rgbd.launch 启动完成后,camera 节点和 rtabmap 的节点中会分别输出以下信息(因为这里输出的信息较多且有参考价值,所以我们没有将所有的启动文件写成一个 launch 文件在同一个终端中输出)

PC端查看建图过程:

# PC端打开rviz终端(在rviz终端中就可以看到所建立的平面地图和立体地图)
roslaunch robot_vslam rtabmap_rviz.launch
# 也可以使用rtabmap自带的图形化界面rtabmapviz在PC端来观测建图过程(不建议,带宽占用100M以上)
# roslaunch robot_vslam rtabmapviz.launch

键盘控制机器人移动:

# 键盘控制
rosrun

我们建议是将机器人的直线运动速度不超过 0.2m/s,旋转速度不超过 0.4rad/s 以保证建图质量。建图过程和激光雷达建图基本一致,遥控机器人在环境中遍历一遍完成建图。

地图是默认保存在机器人端~/.ros/rtabmap.db 文件中,由于这个文件包含了建图过程中的图片和特征点的信息,所以文件会比较大。

注意:启动 roslaunch robot_vslam rtabmap_rgbd.launch 都会覆盖掉 rtabmap.db 文件,如果需要保留上次建图的结果,注意备份文件。

建图完成后 rviz 中的地图如下所示

这里我们也可以修改点云显示的颜色来实现其他效果,例如这样

2.导航
机器人端打开四个终端,分别运行:

# 启动底盘base control
roslaunch ros_arduino_python arduino.launch
# 启动camera
roslaunch robot_vslam camera.launch
# 启动rtab并自动定位
roslaunch robot_vslam rtabmap_rgbd.launch localization:=true
# 启动movebase(纯前向视觉无法后退)
roslaunch robot_vslam move_base.launch planner:=dwa move_forward_only:=true

这里 move_base 的 planner 参数可以选择 dwa 和 teb,这部分在激光雷达导航部分已经介绍过,这里就不再赘述,move_forward_only 参数是为了只允许机器人向前运动(视觉传感器只有前向感知) 。启动后检查各个节点有无报错,正常应该是可以直接定位成功的。

# pc端rviz查看和控制
roslaunch

# pc端rtabmap查看(需手动下载全局地图)
roslaunch

在 rtabmapviz 中点击红框中的按钮同步地图数据库的信息,可能会花费一点时间,取决于你的局域网条件。如果左下位置中没有出现图像且图像两侧处为黑色,则机器人尚未完成初始位置的确定。如果如下图所示,则机器人已经完成定位,可以开始导航无需执行下面的步骤(通常机器人从纹理比较丰富且上次已经到达过的位置启动,都可以直接完成定位,这里文档中是为了说明初始定位这一过程故意从一处几乎没有纹理的区域启动使机器人不能完成初始定位)

如果没有自动定位成功,则可以在 PC 端或机器人端启动一个键盘控制节点:

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

控制慢速移动机器人,直到左下角位置出现图像且两侧为绿色表示定位成功

接下来就可以在地图中指定目标点让机器人导航过去了。

注意:rgbd 相机的视场角较小,且深度信息存在较大的盲区,在导航中有可能会发生碰撞,可以通过调节增大 robot_vslam/param/MarsRobot/costmap_common_params.yaml中的inflation_radius 参数来改善,但是很难达到和激光雷达导航或rgbd相机+激光雷达的效果。

四、视觉+激光雷达建图及导航
1.视觉+激光雷达建图
这里操作过程和第三章节完全一致,只是部分启动指令有差异,所以这里只列出启动指令,不再描述操作过程。
机器人端打开三个终端,分别运行:

# 启动激光雷达+base_control
roslaunch robot_navigation robot_lidar.launch
# 启动深度摄像头
roslaunch robot_vslam camera.launch
# 启动rgbd+lidar联合建图
roslaunch robot_vslam rtabmap_rgbd_lidar.launch

# pc端查看
roslaunch robot_vslam rtabmap_rviz.launch
# pc端控制移动
rosrun teleop_twist_keyboard teleop_twist_keyboard.py

我们建议是将机器人的直线运动速度不超过 0.2m/s,旋转速度不超过 0.4rad/s 以保证建图质量建图过程和激光雷达建图基本一致,遥控机器人在环境中遍历一遍完成建图。这里可以看到,由于加入了360 度的激光雷达数据,建图在 2D 的地图方面表现要更好一些。

2.视觉vSLAM +激光雷达导航
机器人端打开四个终端,分别运行:

# 启动激光雷达+base_control
roslaunch robot_navigation robot_lidar.launch
# 启动camera
roslaunch robot_vslam camera.launch
# 启动rtab并自动定位
roslaunch robot_vslam rtabmap_rgbd_lidar.launch localization:=true
# 启动movebase(允许后退)
roslaunch robot_vslam move_base.launch planner:=dwa move_forward_only:=false

# pc端查看
roslaunch robot_vslam rtabmap_rviz.launch
roslaunch robot_vslam rtabmapviz.launch

这里由于加入了 360 度的激光雷达,机器人具备了全向的感知能力,所以可以将 move_forward_only 参数设置为 false 允许机器人向后运动。今天带大家学习了如何使用深度相机实现视觉slam建图和导航,同时我们也尝试了视觉+激光雷达的协同使用,机器人在障碍物感知和避障方面有了明显改善,同时通过摄像头我们也能更方便的实现远程监控和控制。下一次你想看到什么呢?欢迎留言,我将带大家一起实现~!
-----------------------------------
机器人操作系统ROS—深度相机+激光雷达实现vSLAM建图与导航
https://blog.51cto.com/u_14439393/5723988

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

机器人操作系统ROS—深度相机+激光雷达实现vSLAM建图与导航 转载 的相关文章

  • Java变量名规则

    给大家简单介绍一下java中的变量名规则 和实用的起名工具 记忆变量名起名规则小技巧 变量名开头可用的类型 字下美人 字母 下划线 美元符号 人民币符号 变量名开头后面可用的类型 字下美人数非 字母 下划线 美元符号 人民币符号 数字 非关
  • Linux中的字符串和字节序列处理函数

    花了两天的时间总结了Linux编程时的字符串操作函数和字节序列操作函数 xff0c 以便后续查阅 这些函数大都不会去检查传入的参数是否为NULL xff0c 因此在使用之前要自己做检查 xff0c 否则后果你懂的 一个基本知识点 xff1a
  • extern "c"用法解析

    引言 C 43 43 保留了一部分过程式语言的特点 xff0c 因而它可以定义不属于任何类的全局变量和函数 但是 xff0c C 43 43 毕竟是一种面向对象的程序设计语言 xff0c 为了支持函数的重载 xff0c C 43 43 对全
  • 解决树莓派Unbuntu mate 使用VNC连接灰屏报错“Could not acquire name on session bus”问题

    修改 vnc xstartup 文件 打开 vnc xstartup 文件 1 添加两行 unset SESSION MANAGER unset DBUS SESSION BUS ADDRESS 2 查看桌面环境是什么 xff1a 先查看系
  • python:isinstance用法

    isinstance xff08 object xff0c type xff09 只要object是type类型 xff0c 返回True xff1b 否则返回False 作用 xff1a 来判断一个对象是否是一个已知的类型 其第一个参数
  • windows下开启Qemu串口调试

    1 EDKII 包编译 如果要在 windows 下启用串口信息打印 xff0c 需要在 build 时加 D DEBUG ON SERIAL PORT 选项 需要注意的是 xff0c 在 target txt 中 TARGET 只能是 D
  • 关于深度学习主机的一些选配问题

    作为一个深度学习的初学者 xff0c 你可能会遇到这样的问题 xff1a 我该如何训练我自己或者别人的Model xff1f 我该如何配置一台合适的主机 xff1f 目前有哪几种训练模型的方式 xff1f 接下来 xff0c 我将会对此进行
  • FreeRTOS中两个同等级无阻塞打印任务,只有一个能正常打印

    环境 xff1a STM32CubeMX 43 MDK5 printf重定向用的是官方例子 ifdef GNUC With GCC small printf option LD Linker gt Libraries gt Small pr
  • putty 连接Debian linux 报错Connection refused

    ubuntu默认并没有安装ssh服务 xff0c 如果通过ssh链接ubuntu xff0c 需要自己手动安装ssh server 判断是否安装ssh服务 xff0c 可以通过如下命令进行 xff1a xjj 64 xjj desktop
  • python 使用playsound模块出现编码问题。

    Error 259 for command play sound zhou mp3 wait 驱动程序无法识别指定的命令参数 Error 263 for command close sound zhou mp3 指定的设备未打开 xff0c
  • C/C++ 编程推荐学习顺序和书籍

    自学或者学习C C 43 43 编程不知道怎么办 xff1f 那么恭喜你看到本文 xff0c 本文将会为你提供C C 43 43 编程的学习书籍顺序推荐 xff0c 希望对大家有帮助 xff01 C C 43 43 语言基础入门书籍 xff
  • Android Studio 控制台中文乱码,解决方案都在这里了,完美解决

    前言 Android Studio 如果不进行配置的话 xff0c 运行程序时控制台中文乱码问题会非常严重 xff0c 甚至影响我们对信息的获取和程序的跟踪 通过历年的开发经验 xff0c 在本文中我总结出四点用于解决控制台中文乱码问题的方
  • 【C/C++】中的__FILE__、__LINE__、#line、__func__关键字(预定义宏)

    c 43 43 11预先定义了一些标识符 xff0c 其实也就是宏 现在简单说几个 xff1a 1 FILE 用于指示本行语句所在源文件的文件名 xff0c 如下 xff08 test c xff09 xff1a include lt st
  • 视觉SLAM入门十四讲

    视觉SLAM入门十四讲 写在前面的话什么是视觉SLAM视觉SLAM中所使用的摄像头传感器单目摄像头双目摄像头深度摄像头 经典视觉SLAM框架 写在前面的话 考研期间迷上了SLAM xff0c 买来了高翔 张涛等著的 视觉SLAM十四讲 从理
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • 敏捷开发:做一个合格的Scrum Master

    图片来源于网络 Scrum Master Beauty and Beast 在Scrum敏捷开发中有三种主要的角色 xff1a Product Owner xff08 产品负责人 xff0c 简称 34 PO 34 xff09 Scrum
  • 嵌入式软件:通过串口进行调试的一些思考和实践

    最近的工作还是改那坨代码 维护这摊东西也快要2年了 xff0c 好几次想重构它 xff0c 顺便整理一下 xff0c 不过我还是缺乏那种毅力 在这段时间里我还加了一些功能模块 xff0c 估计如果以后有新人接手这摊东西 xff0c 会抱怨这
  • 串口调试助手没有显示

    用cubeMX生成工程之后 xff0c 笔者写了下面两句话 xff08 向串口发送一个字符串 xff09 xff1a 但是 xff0c 打开调试工具怎么也接受不到数据 xff0c 魔术棒里面的 芯片型号 xff0c 调试 xff08 J L
  • vscode使用gitee

    vscode使用gitee 首先选择文件夹右键用vscode打开 然后打开vscode的终端 xff1a 在终端输入命令 xff1a xff08 每行命令输入完成之后记得敲回车 xff09 xff1a git init然后敲回车就有 xff
  • 深度揭秘阿里(蚂蚁金服)技术面试流程!附前期准备,学习方向

    上半年公司的项目很闲 xff0c 很多人觉得没意思陆续走了 xff0c 我考虑到自己的发展 xff0c 从6月底开始面 xff0c 面到7月底 xff0c 三十家公司 我从不打没准备的仗 xff0c 我是一个喜欢总结经验的人 xff0c 每

随机推荐

  • Git 中submodule的使用,终于有人说明白了

    背景 面对比较复杂的项目 xff0c 我们有可能会将代码根据功能拆解成不同的子模块 主项目对子模块有依赖关系 xff0c 却又并不关心子模块的内部开发流程细节 这种情况下 xff0c 通常不会把所有源码都放在同一个 Git 仓库中 有一种比
  • git 工具GitEye使用

    二 xff1a 签入 右键commit 可以选择需要签入的 xff0c 要加入注释才能签入 一 xff1a 比较
  • ROS笔记十(基于Python、Kinetic):rviz基础——快速配置并渲染点云和摄像机图像数据

    前言 xff1a rviz xff08 ROS visualization xff09 xff1a 用于机器人 传感器和算法的通用3D可视化系统 rviz能够绘制多种类型的数据流 特别是三维的数据 在ROS中所有类型的数据都被关联到一个参考
  • java面试必看书单

    编程之法 https legacy gitbook com book wizardforcel the art of programming by july details 白话经典算法之七大排序 链接 xff1a https pan ba
  • Java基础 - Integer和int的区别

    一 int和Integer的区别 两者的区别主要体现在以下几个方面 xff1a 1 数据类型不同 xff1a int 是基础数据类型 xff0c 而 Integer 是包装数据类型 xff1b 2 默认值不同 xff1a int 的默认值是
  • Lua + GraphicsMagick安装

    Lua 43 GraphicsMagick安装 图片的实时缩放功能是Nginx调用Lua脚本 xff0c Lua脚本在FastDFS中下载对应的图片保存到本地 xff0c 然后Lua调用GraphicsMagick实现图片的缩放功能 1 安
  • 零基础应该选择学习 C、C++、Java、python、web前端、C#、PHP、Linux选哪个编程语言好呢?

    众多的语言 xff0c 到底哪一门才是适合我呢 xff1f 小白 xff1a 大佬 xff0c 大佬 xff0c 编程语言也太多了 xff0c 到底我应该选择哪一种呢 xff1f 大佬 xff1a 首先呢 xff0c 我们先对常见的编程语言
  • 如何看英文技术文档

    https www jianshu com p af7d39cac6b8
  • 从工具的奴隶到工具的主人

    摘要 xff1a 我们每个人都是工具的奴隶 随着我们的学习 xff0c 我们不断的加深自己对工具的认识 xff0c 从而从它们里面解脱出来 现在我就来说一下我作为各种工具的奴隶 xff0c 以及逐渐摆脱它们的思想控制的历史吧 当我高中毕业进
  • 程序员,这四个学习建议值得收藏

    大家好 xff0c 我是本周的值班编辑 江南一点雨 xff0c 本周将由我为大家排版并送出技术干货 xff0c 大家可以在公众号后台回复 springboot xff0c 获取最新版 Spring Boot2 1 6 视频教程试看 在我看来
  • 底层原理解析

    目录 HashMap底层原理 xff1a ConcurrentHashMap 底层原理 HashMap底层原理 xff1a 1 HashMap概述 xff1a HashMap是一个散列桶 xff08 数组和链表 xff09 xff0c 它存
  • Java ServerSocket & Socket 实现 单组【客户端⇄服务端】双工通信(双向通信)

    Server java 服务器端开启服务 package com example socket service import lombok SneakyThrows import java net ServerSocket import j
  • docker搭建容器过程

    docker 环境创建 配置apt国内镜像源 备份源 span class token function cp span etc apt sources list etc apt sources list backup span class
  • FreeRTOS进程间通信-消息队列

    消息队列是进程间的一种通信机制 xff0c 实际项目运用很多 1 什么是消息队列 xff1f 2 消息队列API函数 3 在进程间通信使用消息队列 4 在中断中使用消息队列 1 1 消息队列是什么 xff1f 消息队列是realtime o
  • 三十岁了从零开始学python还有前途吗?很迷茫啊

    对于学习这件事 xff0c 我一直认为没有时间先后 xff0c 啥时候学习都不晚 xff0c 不管你现在年龄多大 xff0c 只要有心想学习 xff0c 一切都好说 首先 xff0c 你要学的python是属于技术类的知识 xff0c 对于
  • SpringBoot:使用Caffeine实现缓存

    在本博客中 xff0c 我们将探讨如何使用Spring的缓存框架向任何Spring Boot应用程序添加基本缓存支持 xff0c 如果没有正确实现 xff0c 还将探讨缓存的一些问题 最后但并非最不重要的一点是 xff0c 我们将看几个在真
  • 树莓派结合PIXHAWK飞控实现四轴双目视觉避障

    树莓派结合Pixhawk飞控实现四轴双目视觉避障 灰信网 xff08 软件开发博客聚合 xff09 无人机双目视觉避障的实现 本文将介绍如何使用树莓派结合PIX飞控实现无人机双目视觉避障的功能 主要硬件 我们以双目摄像头 43 树莓派 43
  • ::在c++中什么意思

    好多年没有用c 43 43 了 xff0c 今天在研究深度学习部署框架ncnn xff0c 看到这个突然想不起来了 xff0c 就查了一下资料 34 34 在C 43 43 中表示作用域 xff0c 和所属关系 34 34 是运算符中等级最
  • 基于Jetson Nano嵌入式平台的YOLOV3-tiny模型部署

    1 嵌入式平台简介 嵌入式是指可以嵌入设备或装置的特殊计算机系统 一般来说 xff0c 具有数字接口的设备都有嵌入式系统 xff0c 如手机 车载电脑 智能手表等 xff0c 而嵌入式人工智能则是使人工智能算法能够在终端设备上运行的技术概念
  • 机器人操作系统ROS—深度相机+激光雷达实现vSLAM建图与导航 转载

    原文 xff1a 机器人操作系统ROS 深度相机 43 激光雷达实现vSLAM建图与导航 wx5d23599e462fa的技术博客 51CTO博客 这次将带大家学习如何使用深度相机实现机器人的视觉SLAM建图及导航 目录 一 概述 1 深度