自主飞行无人机开发--SALM cartographer开源框架 rplidar A2/3

2023-05-16

参考学习网站:https://google-cartographer-ros.readthedocs.io/en/latest/

问题提出:四旋翼搭载激光雷达A3进行SLAM室内定位,其怎样Running Cartographer ROS on your own bag //https://google-cartographer-ros.readthedocs.io/en/latest/ 特意去carto...的官方网站上学习了一下,并结合自己的平台做一些记录。

在自己的包里运行 Cartographer ROS

现在,您已经在提供的几个包上运行了Cartographer ROS,您可以继续让Cartographer使用您自己的数据。找到一个你想用来做Slam的.bag录音,并完成本教程。

注:当您想运行制图器ROS时,您可能需要首先运行source install_isolated/setup.bash来获得您的ROS环境(如果您的shell是zsh,则将bash替换为zsh)

验证您的包

Cartographer ROS提供了一个名为“cartographer_rosbag_validate”的工具,可以自动分析包中存在的数据。一般来说,在尝试调整Cartographer的错误数据之前运行此工具是一个好主意。

它从Cartographer自身的经验中得到好处,并能检测出一种常见的错误在bags中的种类。就实例而言,如果确定了一个sensor_msgs/Imu,该工具将确保重力矢量没有从IMU测量中被清除,因为Cartographer使用重力标准来确定地面的方向。

该工具还可以提供有关如何提高数据质量的提示。例如,对于Velodyne激光雷达,例如,对于Velodyne激光雷达,建议传感器发送每个UDP数据包一条sensor_msgs/PointCloud2 消息,而不是每转一条消息。通过这种粒度,制图员就可以将机器人运动引起的点云变形展开,从而得到更好的重建效果。

如果您已经获得了Cartographer的ROS环境,您可以简单地运行如下工具:

cartographer_rosbag_validate -bag_filename your_bag.bag

Create a .lua configuration

Cartographer是高度灵活的,可以配置为工作在各种机器人。robot配置是从必须从lua脚本定义的options数据结构中读取的。示例配置在src/cartographer_ros/cartographer_ros/configuration_files/中定义,并安装在install_isolated/share/cartographer_ros/configuration_files/中。

注意:理想情况下,.lua配置应该是特定于机器人的,而不是特定于包的。

//You can start by copying one of the example and then adapt it to your own need. If you want to use 3D SLAM:

cp install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua

If you want to use 2D SLAM:

cp install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua

然后您可以编辑我的robot.lua以满足您的机器人的需求。options 块中定义的值定义了制图员ROS前端应如何与您的包交互。options 段后定义的值用于调整制图员的内部工作,现在我们将忽略这些值。

也可以看:https://google-cartographer-ros.readthedocs.io/en/latest/configuration.html和https://google-cartographer.readthedocs.io/en/latest/configuration.html (The reference documentation of the Cartographer ROS configuration values and of the Cartographer configuration values.

在需要调整的值中,您可能需要提供环境和机器人的tf帧ID

在需要调整的值中,您可能需要在地图帧、跟踪帧、发布帧和Odom帧(map_frametracking_framepublished_frame and odom_frame)中提供环境和机器人的tf帧ID。

您可以从包中的 /tf主题分发机器人的tf树,也可以在.urdf机器人定义中定义它。

注意:你应该相信你的姿势!在你的机器人和IMU或激光雷达之间的链路上稍微偏移一点,就会导致地图重建不连贯。Cartographer 通常可以纠正小的姿势错误,但不是所有的错误!


在/carto_ws/install_isolated/share/cartographer_ros/configuration_files/中定义了自己激光雷达的.lua文件 rplidar.lua

-- Copyright 2016 The Cartographer Authors
--
-- Licensed under the Apache License, Version 2.0 (the "License");
-- you may not use this file except in compliance with the License.
-- You may obtain a copy of the License at
--
--      http://www.apache.org/licenses/LICENSE-2.0
--
-- Unless required by applicable law or agreed to in writing, software
-- distributed under the License is distributed on an "AS IS" BASIS,
-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-- See the License for the specific language governing permissions and
-- limitations under the License.

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
  map_builder = MAP_BUILDER,
  trajectory_builder = TRAJECTORY_BUILDER,
  map_frame = "map",
  tracking_frame = "base_link",
  published_frame = "base_link",
  odom_frame = "odom",
  provide_odom_frame = false,
  publish_frame_projected_to_2d = false,
  use_odometry = false,
  use_nav_sat = false,
  use_landmarks = false,
  num_laser_scans = 1,  --//Number of sensor_msgs/LaserScan topics you’ll use.
  num_multi_echo_laser_scans = 0, --//Number of sensor_msgs/MultiEchoLaserScan topics you’ll use.
  num_subdivisions_per_laser_scan = 1,
  num_point_clouds = 0,  --//Number of sensor_msgs/PointCloud2 topics you’ll use.
  lookup_transform_timeout_sec = 0.2,
  submap_publish_period_sec = 0.3,
  pose_publish_period_sec = 5e-3,
  trajectory_publish_period_sec = 0.1,
  rangefinder_sampling_ratio = 1.,
  odometry_sampling_ratio = 1.,
  fixed_frame_pose_sampling_ratio = 1.,
  imu_sampling_ratio = 1.,
  landmarks_sampling_ratio = 1.,
}

MAP_BUILDER.use_trajectory_builder_2d = true

TRAJECTORY_BUILDER.pure_localization = true
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.min_range = 0.15
TRAJECTORY_BUILDER_2D.max_range = 8.

TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true


return options

还可以使用“使用地标(use_landmarks)”和“导航卫星(use_nav_sat)”启用地标和GPS作为附加定位源。options块中的其余变量通常应保持不变。

但是,有一个全局变量是您绝对需要适应您的包的需求的:

TRAJECTORY_BUILDER_3D.num_accumulated_range_data or TRAJECTORY_BUILDER_2D.num_accumulated_range_data.

这个变量定义了构造完整扫描(通常是一个完整的旋转)所需的消息数。

如果您遵循"cartographer_rosbag_validate”建议,每次扫描使用100条ROS消息,则可以将此变量设置为100。如果有两个测距传感器(例如,两个激光雷达)同时提供全扫描,则应将此变量设置为2。

Create .launch files for your SLAM scenarios

您可能已经注意到,上一节中介绍的每个演示都是使用不同的roslaunch命令运行的。推荐使用制图器确实是为每个机器人提供一个定制的.launch文件和slam类型。The example .launch files are defined in src/cartographer_ros/cartographer_ros/launch and installed in install_isolated/share/cartographer_ros/launch/.


例如我们的设置:

在文件目录:

/home/nvidia/carto_ws/src/cartographer_ros/cartographer_ros/launch  和

/home/nvidia/carto_ws/install_isolated/share/cartographer_ros/launch  分别复制了rplidar.launch

<launch>  
      
      <param name="/use_sim_time" value="false" /> 
 
      <node name="cartographer_node" pkg="cartographer_ros"  
          type="cartographer_node" args="  
              -configuration_directory $(find cartographer_ros)/configuration_files  
              -configuration_basename rplidar.lua"  
          output="screen">  
        <remap from="scan" to="scan" />  
      </node>
  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />


</launch>

从复制提供的示例之一开始:

cp install_isolated/share/cartographer_ros/launch/backpack_3d.launch install_isolated/share/cartographer_ros/launch/my_robot.launch
cp install_isolated/share/cartographer_ros/launch/demo_backpack_3d.launch install_isolated/share/cartographer_ros/launch/demo_my_robot.launch
cp install_isolated/share/cartographer_ros/launch/offline_backpack_3d.launch install_isolated/share/cartographer_ros/launch/offline_my_robot.launch
cp install_isolated/share/cartographer_ros/launch/demo_backpack_3d_localization.launch install_isolated/share/cartographer_ros/launch/demo_my_robot_localization.launch
cp install_isolated/share/cartographer_ros/launch/assets_writer_backpack_3d.launch install_isolated/share/cartographer_ros/launch/assets_writer_my_robot.launch

my_robot.launch: 是用来在机器人上用真实的传感器数据在线(实时)执行SLAM。

demo_my_robot.launch: 是指从开发机器上使用,并期望使用bag文件名参数来重放记录中的数据。此启动文件还生成一个配置为可视化绘图器状态的rviz窗口。

offline_my_robot.launch: 与demo_my_robot.launch非常相似,但尝试尽可能快地执行slam。这可以显著加快地图的绘制。此启动文件还可以使用提供给bag文件名参数的多个bag文件。

demo_my_robot_localization.launch: 与demo_my_robot.launch非常相似,但需要一个load_state_filename参数,指向以前Cartographer 执行的.pbstream记录。之前的记录将用作预先计算的地图,Cartographer 将仅在此地图上执行定位。

assets_writer_my_robot.launch: 用于从以前制图器执行的.pstream记录中提取数据。

同样,需要对这些文件进行一些调整以适应您的机器人。
 

给-configuration_basename指定的每个参数都应该适合指向my_robot.lua。

如果决定使用机器人的.urdf描述,则应将描述放在install_isolated/share/cartographer_ros/urdf中,并调整robot_description参数以指向您的文件名。

如果决定使用/tf消息,则可以删除robot的描述参数、robot的state_publisher节点以及使用-urdf的行statring。

如果您的包或传感器发布的主题名称与制图员ROS预期的名称不匹配,则可以使用<remap>元素重定向主题。预期的主题名称取决于所使用的范围查找设备的类型。

注意:IMU主题应命名为“IMU”
           如果只使用一个sensor_msgs/LaserScan主题,则应将其命名为scan。如果你有更多,他们应该被命名为scan_1scan_2等…
           如果您只使用一个sensor_msgs/multiecholaserscan主题,则应将其命名为echos。如果你有更多,他们应该被命名为echoes_1echoes_2等…
           如果只使用一个sensor_msgs/pointcloud2主题,则应将其命名为points2。如果您有更多,它们应该命名为points2_1、points2_2等…

Try your configuration

一切都安排好了!现在,您可以使用以下命令开始制图:

roslaunch cartographer_ros my_robot.launch bag_filename:=/path/to/your_bag.bag

如果你够幸运的话,一切都应该已经按预期工作了。但是,您可能有一些需要调优的问题。



总结:

在使用Rplidar A2/A3 激光雷达和cartographer算法进行激光SLAM的时候,需要更改的主要有两个地方:

1. 在/home/nvidia/carto_ws/src/cartographer_ros/cartographer_ros/configuration_files/中定义,并在/home/nvidia/carto_ws/install_isolated/share/cartographer_ros/configuration_files/中安装.lua文件,并仿照修改

cp install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua install_isolated/share/cartographer_ros/configuration_files/my_robot.lua

修改后的rplidar.lua如下:

include "map_builder.lua"
include "trajectory_builder.lua"

options = {
  map_builder = MAP_BUILDER,
  trajectory_builder = TRAJECTORY_BUILDER,
  map_frame = "map",
  tracking_frame = "base_link",  //修改了端口号为base_link
  published_frame = "base_link",  //修改了端口号为base_link
  odom_frame = "odom",
  provide_odom_frame = false,  //关闭了里程计
  publish_frame_projected_to_2d = false,
  use_odometry = false,
  use_nav_sat = false,
  use_landmarks = false,
  num_laser_scans = 1,  //修改了激光传感器话题数量为1
  num_multi_echo_laser_scans = 0,  
  num_subdivisions_per_laser_scan = 1,
  num_point_clouds = 0,  //修改点云数量为0
  lookup_transform_timeout_sec = 0.2,
  submap_publish_period_sec = 0.3,
  pose_publish_period_sec = 5e-3,
  trajectory_publish_period_sec = 0.1,  //周期修改
  rangefinder_sampling_ratio = 1.,
  odometry_sampling_ratio = 1.,
  fixed_frame_pose_sampling_ratio = 1.,
  imu_sampling_ratio = 1.,
  landmarks_sampling_ratio = 1.,
}

MAP_BUILDER.use_trajectory_builder_2d = true

TRAJECTORY_BUILDER.pure_localization = true
TRAJECTORY_BUILDER_2D.use_imu_data = false
TRAJECTORY_BUILDER_2D.min_range = 0.15 //修改了激光雷达测量范围
TRAJECTORY_BUILDER_2D.max_range = 8.

TRAJECTORY_BUILDER_2D.use_online_correlative_scan_matching = true


return options

2. 在/home/nvidia/carto_ws/src/cartographer_ros/cartographer_ros/launch  和

/home/nvidia/carto_ws/install_isolated/share/cartographer_ros/launch  分别仿照修改rplidar.launch

cp install_isolated/share/cartographer_ros/launch/backpack_2d.launch install_isolated/share/cartographer_ros/launch/my_robot.launch

my_robot.launch: 是用来在机器人上用真实的传感器数据在线(实时)执行SLAM。

<launch>  
      
      <param name="/use_sim_time" value="false" /> 
 
      <node name="cartographer_node" pkg="cartographer_ros"  
          type="cartographer_node" args="  
              -configuration_directory $(find cartographer_ros)/configuration_files  
              -configuration_basename rplidar.lua"  
          output="screen">  
        <remap from="scan" to="scan" />  
      </node>
  <node name="cartographer_occupancy_grid_node" pkg="cartographer_ros"
      type="cartographer_occupancy_grid_node" args="-resolution 0.05" />


</launch>

3.最后需要在rplidar_ws驱动包里修改端口号

附上:

cartographer_ros 安装
cartographer_ros github 主页:
https://github.com/googlecartographer/cartographer_ros
cartographer_ros 官方安装指引:
https://google-cartographer-ros.readthedocs.io/en/latest/
安装步骤:
# Install wstool and rosdep.
sudo apt-get update
sudo apt-get install -y python-wstool python-rosdep ninja-build
# Create a new workspace in 'catkin_ws'.
mkdir catkin_ws (这里建议换一个名字,叫 cartographer 就行,这个工作空间专
用于 cartographer)
cd catkin_ws
wstool init src
# Merge the cartographer_ros.rosinstall file and fetch code for dependencies.
wstool merge -t src
https://raw.githubusercontent.com/googlecartographer/cartographer_ros
/master/cartographer_ros.rosinstall
wstool update -t src
这一步会报一个 ceres-solver failed 的错误,需要修改一个网址
#进入到 src 文件夹后 ctrl+h 显示出隐藏文件,打开.rosinstall
#更改 ceres-solver 中地址改为下面的地址:#>>uri: https://github.com/ceres-solver/ceres-solver.git
# Install proto3.
src/cartographer/scripts/install_proto3.sh (失败试一下前面加 sudo)
# Install deb dependencies.
# The command 'sudo rosdep init' will print an error if you have already
# executed it since installing ROS. This error can be ignored.
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} –y
(根据自己版本将${ROS_DISTRO } 替换为 kinetic 或者 indigo)
# Build and install.
catkin_make_isolated --install --use-ninja【此步编译成功 代表安装成功】
运行官方数据集 - Revo LDS 机器人:
1. 下载数据集
wget -P ~/Downloads https://storage.googleapis.com/cartographer-
public-data/bags/revo_lds/cartographer_paper_revo_lds.bag
2. 运行数据集
roslaunch cartographer_ros demo_revo_lds.launch \
bag_filename:=${HOME}/Downloads/cartographer_paper_revo_lds.bag
rplidar驱动安装
rplidar github主页:https://github.com/robopeak/rplidar_ros
1、安装步骤:
mkdir –p ~/rplidar_ws/src
cd rplidar_ws/src
catkin_init_workspace
git clone https://github.com/robopeak/rplidar_ros
cd ..
catkin_make
2、手动source
新开一个终端
sudo gedit .bashrc
在打开的txt文件下面加上
source /home/nvidia/rplidar_ws/devel/setup.bash 根据安装目录的不同,红色部分可能有所变化
3、运行
roslaunch rplidar_ros rplidar.launch (注意修改launch文件中的端口号和波特率才能正常运行)
运行起来不报错 且 雷达转起来 就代表OK!

4、对于tx1或者tx2,可能插上激光雷达没法识别设备,这是由于系统没有安装相关驱动,拷贝
cp210x.ko
至本地
sudo insmod cp210x.ko
但是这种方法必须每次手动安装,暂时没有找到永久安装的方法,但可以把这句话写到开机脚本中

 

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

自主飞行无人机开发--SALM cartographer开源框架 rplidar A2/3 的相关文章

  • STM32bootloader原理解释

    STM32bootloader原理解释 一 STM32的常规启动流程 STM32的内部flash地址起始于0x8000000 xff0c 一般情况下 xff0c 程序文件就从此地址开始写入 此外STM32是基于Cortex M3内核的微控制
  • 模糊PID基本原理及matlab仿真实现(新手!新手!新手!)

    有关模糊pid的相关知识就把自己从刚接触到仿真出结果看到的大部分资料总结一下 xff0c 以及一些自己的ps 以下未说明的都为转载内容 1 转自 https blog csdn net weixin 36340979 article det
  • VMware+ubuntu+win10笔记本实现笔记本连接WIFI且ubuntu既可以上网又能连接开发板

    背景 最近在学习imx6ull开发板的时候 xff0c 发现开发板通过网线连接笔记本电脑却无法ping通ubuntu xff0c 于是捣鼓了很久终于可以了 xff0c 却又发现ubuntu不能上网了 xff0c 经过一番查找资料和尝试 xf
  • 在windows上用vscode打造比vc++6.0好用的C/C++ IDE,适用编程小白

    准备 xff1a 1 安装MinGW xff0c 添加gcc gdb等编译调试工具bin目录 头文件Include目录 库lib的路径到系统环境变量 xff0c 安装LLVM 添 加Clang编译器所在bin目录到系统环境变量 具体操作百度
  • C语言数据结构——线性表的链式存储结构

    文章目录 线性表的链式存储结构1 基本概念2 设计与实现3 优点和缺点 线性表的链式存储结构 1 基本概念 链式存储定义 xff1a 为了表示每个数据元素与其直接后继元素之间的逻辑关系 xff0c 每个元素除了存储本身的信息之外 xff0c
  • 智能车浅谈——硬件篇

    目录 初识小车硬件系统1 电源系统线性电源开关电源 2 人机交互系统3 MCU最小系统4 传感器系统摄像头电感编码器 5 驱动系统 机械结构 17届完赛代码智能车系列文章汇总 前言 xff1a 作为一名老三本玩家 xff0c 笔者深知一些同
  • 智能车浅谈——图像篇

    文章目录 前言认识图像基本含义图像类型数字图像彩色图像灰度图像黑白图像 小结 图像处理图像压缩二值化固定阈值法大津法 图像降噪 xff08 腐蚀 xff09 寻边线 总结17届完赛代码17届完赛代码智能车系列文章汇总 前言 前面已经记录了智
  • 智能车浅谈——手把手让车跑起来(电磁篇)

    文章目录 前言材料准备备赛组车模硬件 练习组车模硬件方案 整车原理赛道信息获取及转向原理工字电感运放模块转向原理元素判断 电机及舵机控制原理 代码实现效果欣赏总结17届完赛代码智能车系列文章汇总 前言 电磁寻迹小车 之前智能车系列已经做了一
  • 手把手教你OneNET数据可视化

    文章目录 前言OneNET实现数据可视化效果一览发布项目 xff08 5 17更新 xff09 总结 前言 之前介绍了Hi3861使用MQTT协议接入OneNET实现数据的上传以及命令的下发 xff0c 本文主要是介绍一下如何使用OneNE
  • linux---进程间通信(ipc)之管道

    进程间通信方式 管道共享内存消息队列信号量本地套接字等等都能作为我们进程间通信的方法 操作系统提供进程间通信方式的原因 因为对于我们进程来说 xff0c 每一个进程都是相互独立的 xff0c 具有独立性 xff0c 如果我们需要两个不同的进
  • 嵌入式学习笔记——STM32的USART收发字符串及串口中断

    USART收发字符串及串口中断 前言字符串的收发发送一个字符串接收字符串需求 利用串口实现printf 中断中断是什么串口的接收中断以及空闲中断实现代码实现效果 总结M4系列目录 前言 上一篇中 xff0c 介绍了串口收发相关的寄存器 xf
  • 嵌入式学习笔记——PWM与输入捕获(下)

    输入捕获 前言输入捕获的概述框图输入通道部分比较捕获寄存器与事件生成 寄存器编程思路 实际需求配置流程打开对应的时钟配置GPIO为复用模式定时器的时基部分配置定时器输入通道部分配置定时器中断配置 代码 xff1a 运行效果 xff1a 需求
  • 嵌入式学习笔记——SPI通信的应用

    SPI通信的应用 前言屏幕分类1 3OLED概述驱动芯片框图原理图通信时序显示的方式页地址 列地址初始化指令 程序设计初始化代码初始化写数据与写命令清屏函数 初始化代码字符显示函数 总结M4系列目录 前言 上一篇中介绍了STM32的SPI通
  • 嵌入式学习笔记——IIC通信

    IIC通信 前言IIC概述通信特征物理拓扑结构IIC通信的流程IIC的特点 xff1a STM32的IIC通信GPIO模拟IICIIC的时序组成 xff08 主机对从机写入数据 xff09 1 起始信号2 器件地址与读写位3 从机应答信号5
  • 立创梁山派学习笔记——GPIO输出控制

    梁山派 前言开发板简介GD32F407ZGT6官方资源数据手册1 系统框图2 引脚复用表3 命名规则4 其他 用户手册固件库与PACK包 开发环境搭建立创官方的资料包资料齐活 xff0c 开发1 工程搭建2 使用寄存器点亮LEDGPIO数量
  • C51_day5:串口通信UART

    3 1 串口基本认知 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 串行接口 xff08 Serial Interface xff09 是指
  • 哈希表/哈希冲突及解决方法(较全)

    哈希表的概念请参阅他人文章 xff0c 关于哈希冲突的解决这篇文章基本都整理到了 xff0c 还有几个常见的面试题 解决hash冲突的几种方法 前导 xff08 题外话 xff09 xff1a 一 开放定址法 xff08 闭散列 xff09
  • 关于构造函数,拷贝构造函数,析构函数的调用顺序(1)

    导言 对象是由 底层向上 开始构造的 xff0c 当建立一个对象时 xff0c 首先调用基类的构造函数 xff0c 然后调用下一个派生类的构造函数 xff0c 依次类推 xff0c 直至到达派生类次数最多的派生次数最多的类的构造函数为止 因
  • vector的内存释放

    xff11 vector内存分配机制 C 43 43 中vector的一个特点是 xff1a 内存空间只会增长 xff0c 不会减小 即为了支持快速的随机访问 xff0c vector容器的元素以连续方式存放 xff0c 每一个元素都挨着前
  • MFC多人在线聊天室

    我已经在我的资源里上传了这个聊天室的代码了 基于MFC的C 43 43 的select模型的TCP聊天室 采用select网络模型 xff0c 支持多人同时登陆 xff0c 功能有上线 下线 群聊 私聊 使用CjsonObject进行数据传

随机推荐

  • linux---进程间通信(ipc)之共享内存

    前面我们讲解了进程间通信之管道 xff0c 这段我们讲解我们的共享内存 共享内存是所有进程间通信方式最快的一种 内存共享模型就像下面的图一样 xff0c 就是将物理内存映射到我们进程的虚拟地址上 xff0c 我们就可以直接操作我们虚拟地址空
  • Effective C++总结

    explicit关键字 C 43 43 中的explicit关键字只能用于修饰只有一个参数或者是其他参数有默认值的类构造函数 它的作用是表明该构造函数是显式的 而非隐式的 跟它相对应的另一个关键字是implicit 意思是隐藏的 类构造函数
  • 计算机网络(5)TCP之重传机制

    重传机制 超时重传数据包丢失确认应答丢失 快速重传SACKD SACK例一 ACK 丢包例2 xff1a 网络延时 TCP 是通过序列号 确认应答 重发控制 连接管理以及窗口控制等机制实现可靠性传输的 TCP 实现可靠传输的方式之一 xff
  • 中断与回调

    1 xff0c 回调函数 回调函数的原理是使用函数指针实现类似 软中断 的概念 比如在上层的两个函数A和B xff0c 把自己的函数指针传给了C xff0c C通过调用A和B的函数指针达到 当做了什么 xff0c 通知上层来调用A或者B 的
  • CUDA 程序的优化(3) 任务划分

    4 3 1任务划分原则 首先 xff0c 需要将要处理的任务划分为几个连续的步骤 xff0c 并将其划分为CPU端程序和GPU端程序 划分时需要考虑的原则有 列出每个步骤的所有可以选择的算法 xff0c 并比较不同算法在效率和计算复杂度上的
  • C++ Matlab混合编程时“函数或变量 ‘matlabrc‘ 无法识别”

    在QT中调用Matlab初始化时 xff0c 出现了 函数或变量 matlabrc 无法识别 的情况 xff0c 接着崩溃 而且比较神奇的是 xff0c 前一次是可以初始化的 xff0c 但运行过程中发生了崩溃 直接搜解决办法 xff0c
  • Notepad++全选一整列的靠谱办法

    遇到行数较少的可以直接按住ALT手动选取 xff0c 但遇到行数较多 xff0c 就得这么干 xff1a 鼠标放在第一行某一列 xff0c 按住Alt 43 Shift xff0c 然后鼠标选择最后一行该列 xff0c 输入内容即可 xff
  • 对象转xml格式工具类

    import com ruiyun gui store haikang haikang bean FCSearchDescription import com ruiyun gui store haikang haikang bean FD
  • 【无标题】MQ静态图片获取

    public void getImageV40 String path Integer buildingProjectId HttpServletResponse response JSONObject param 61 new JSONO
  • 数据加解密时Base64异常:Illegal base64 character 3a

    现象 用base64工具类对中文进行处理时出现异常 xff0c 在数据加解密场景中经常使用 java lang IllegalArgumentException Illegal base64 character 3a at java uti
  • Winsock编程实例---TCP&UDP

    0x1 基于TCP的通信 1 服务端 1 1 创建基本流程 创建一个TCP服务端的程序需要调用的函数流程 xff1a 初始化函数库 gt gt WSAStartup 创建套接字 gt gt socket 绑定套接字 gt gt bind 监
  • 数据结构---选择排序(直接选择排序和堆排序图解)

    选择排序思想 xff1a 每一次从待排序的数据元素中选出最小 xff08 或最大 xff09 的一个元素 xff0c 存放在序列的起始位置 xff0c 直到全部待排序的 数据元素排完 直接选择排序 在元素集合array i array n
  • Java HttpUtils类

    Java HttpUtils类 Java HttpUtils类 定义 Public class HttpUtils 收集HTTP Servlet使用的静态的有效方法 方法 1 getRequestURL public static Stri
  • Ubuntu打造家用NAS三——网盘与影视中心

    Ubuntu打造家用NAS三 网盘与影视中心 一 Ubuntu 挂载硬盘 通过 Putty 连接 NAS查看硬盘位置 xff1a sudo fdisk l找到需要挂载的硬盘 xff0c 我的是 Disk dev sdb xff1a xxx
  • Ardupilot笔记:Rover auto模式下的执行流程

    先从mode auto cpp的update 开始分析 流程如图 xff1a 进入函数update 后会执行函数navigate to waypoint mode auto cpp span class token keyword void
  • 串口通信协议 UART+I2C+SPI

    UART 异步 串行 全双工 I2C SPI 不同通信协议比较 UART UART协议详解 UART通信 xff0c 接收与发送 xff08 详细版 xff0c 附代码 xff09 UART串行通信详解 待整理 UART是Universal
  • c语言---宏

    宏 1 仅仅替换 2 不能定义宏参类型 3 不会检查宏参有没有定义 定义带参数的宏 define JH a b t t 61 a a 61 b b 61 t xff0c 对两个参数a b的值进行交换 xff0c 下列表述中正确的是 xff0
  • Ros安装rosdep update出错,解决办法(从根本入手)

    博主作为一个ros刚入门的新手 xff0c 之前也安装过ros ros2但是在Ros安装在进行rosdep update 时运气与网络是成功的关键 xff0c 在尝试了好多次 xff0c 运气好一次就成功了 xff0c 运气不好得不停的试错
  • vscode使用方法

    01 ctrl 43 u 返回上一个光标焦点 02 发送请求插件 到VSCode插件中搜索REST Client 搜索到 xff0c 点击install进行安装 创建一个 http文件 编写测试接口文件 右键选择 发送请求 xff0c 测试
  • 自主飞行无人机开发--SALM cartographer开源框架 rplidar A2/3

    参考学习网站 xff1a https google cartographer ros readthedocs io en latest 问题提出 xff1a 四旋翼搭载激光雷达A3进行SLAM室内定位 xff0c 其怎样Running Ca