多传感器融合-搭建ROS工程

2023-05-16

多传感器融合搭建记录1-Tag3.0

  • 一 安装Terminator
  • 二 vscode创建功能包
  • 三 ROS相关基础
    • 1.添加源文件
    • 2.添加launch文件
    • 3.ROS话题通讯
  • 四 添加代码
    • 1. 发布者publisher
      • a.点云发布类CloudPublisher:
      • b.里程计发布类OdometryPublisher:
      • c.如何发布
    • 2. 订阅者subscriber
      • a.gnss订阅者
      • b.cloud订阅者
      • c.imu订阅者
      • d.如何订阅
    • 3. sensor_data
    • 4. tf_listener
  • 五 CMakeLists文件规划
    • CMakeLists详解:
    • 关于catkin CMakeLists.txt
      • 总体结构:
      • cmake版本
      • 软件包名
      • 查找编译依赖的CMake包
      • catkin_package()
      • 头文件目录
      • 库目录
      • 库目标(生成库)
      • target_link_libraries

说明:针对任乾大佬的知乎专栏,详细记录如何用vscode搭建ros工程

一 安装Terminator

sudo apt install terminator

二 vscode创建功能包

这里参考奥特学园的视频,简直太详细了->ROS理论与实践

  1. 创建ros工作空间
mkdir -p localization_ws/src
cd localization_ws
catkin_make
  1. 启动vscode
cd localization_ws
code .
  1. vscode中编译ros配置
    设置快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build
    可以点击配置设置为默认,修改.vscode/tasks.json 文件
{
// 有关 tasks.json 格式的文档,请参见
    // https://go.microsoft.com/fwlink/?LinkId=733558
    "version": "2.0.0",
    "tasks": [
        {
            "label": "catkin_make:debug", //代表提示的描述性信息
            "type": "shell",  //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
            "command": "catkin_make",//这个是我们需要运行的命令
            "args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
            "group": {"kind":"build","isDefault":true},
            "presentation": {
                "reveal": "always"//可选always或者silence,代表是否输出信息
            },
            "problemMatcher": "$msCompile"
        }
    ]
}
  1. 创建ROS功能包
    选定 src 右击 —> create catkin package.
    设置包名 添加依赖,先加roscpp rospy std_msgs,其他包可以之后用到再添加.

     自动增加了include和src文件夹,以及CMakeList.txt和package.xml
    

在这里插入图片描述
5. 添加源文件
6.配置CMakeLists.txt
是功能包里边自动生成的CmakeLists.txt

add_executable(节点名称
  src/C++源文件名.cpp
)
target_link_libraries(节点名称
  ${catkin_LIBRARIES}
)

三 ROS相关基础

1.添加源文件

	先增加一个简单的cpp测试一下.
#include "ros/ros.h"

int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    //执行节点初始化
    ros::init(argc,argv,"HelloVSCode");

    //输出日志
    ROS_INFO("Hello VSCode!!!哈哈哈哈哈哈哈哈哈哈");
    return 0;
}
	配置功能包里的CMakeLists.txt

在这里插入图片描述

	ctrl shift b编译

	启动roscore

在这里插入图片描述

	设置环境变量
	运行节点

在这里插入图片描述

2.添加launch文件

type是跟CMakeLists.txt中add_executable的名字相同的.
ros::init的名字跟name是一个,但是name可以覆盖ros::init的名字.

<launch>
    <node pkg="lidar_localization" type="hahaha" name="hello" output="screen" />
</launch>

node —> 包含的某个节点

pkg -----> 功能包

type ----> 被运行的节点文件

name --> 为节点命名,这个名字可以覆盖代码中的名字,以这个为准

output-> 设置日志的输出目标

3.ROS话题通讯

发布者

1.初始化ROS节点
2.向ROS Master注册节点信息
3.按照一定频率循环发布消息

订阅者

1.初始化ROS节点
2.订阅需要的话题
3.循环等待话题消息,接收到消息后进入回调函数
4.在回调函数中完成消息处理

大佬把这种消息发布和订阅的方式做了修改:我们把每一类信息的订阅和发布封装成一个类,它的callback做为类内函数存在,这样我们在node文件中想要订阅这个消息的时候只需要在初始化的时候定义一个类的对象,就可以在正常使用过程中从类内部直接取它的数据了。

四 添加代码

1. 发布者publisher

一般的发布者实现(ros基础):

/*
    需求: 实现基本的话题通信,一方发布数据,一方接收数据,
         实现的关键点:
         1.发送方
         2.接收方
         3.数据(此处为普通文本)
         PS: 二者需要设置相同的话题
    消息发布方:
        循环发布信息:HelloWorld 后缀数字编号
    实现流程:
        1.包含头文件 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 发布者 对象
        5.组织被发布的数据,并编写逻辑发布数据
*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>

int main(int argc, char  *argv[])
{   
    //设置编码
    setlocale(LC_ALL,"");

    //2.初始化 ROS 节点:命名(唯一)
    // 参数1和参数2 后期为节点传值会使用
    // 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
    ros::init(argc,argv,"talker");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能

    //4.实例化 发布者 对象
    //泛型: 发布的消息类型
    //参数1: 要发布到的话题
    //参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)
    ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);

    //5.组织被发布的数据,并编写逻辑发布数据
    //数据(动态组织)
    std_msgs::String msg;
    // msg.data = "你好啊!!!";
    std::string msg_front = "Hello 你好!"; //消息前缀
    int count = 0; //消息计数器

    //逻辑(一秒10次)
    ros::Rate r(1);

    //节点不死
    while (ros::ok())
    {
        //使用 stringstream 拼接字符串与编号
        std::stringstream ss;
        ss << msg_front << count;
        msg.data = ss.str();
        //发布消息
        pub.publish(msg);
        //加入调试,打印发送的消息
        ROS_INFO("发送的消息:%s",msg.data.c_str());

        //根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;
        r.sleep();
        count++;//循环结束前,让 count 自增
        //暂无应用
        ros::spinOnce();
    }
    return 0;
}

我们把每一类信息的订阅和发布封装成一个类,它的callback做为类内函数存在(任大佬的修改):

a.点云发布类CloudPublisher:

//构造函数,需要传入句柄nh,话题名,有了这两个参数,就可以想一般的发布一样如发布信息了
CloudPublisher::CloudPublisher(ros::NodeHandle& nh,
                               std::string topic_name,
                               size_t buff_size,
                               std::string frame_id)
    :nh_(nh), frame_id_(frame_id) {
    publisher_ = nh_.advertise<sensor_msgs::PointCloud2>(topic_name, buff_size);
}

void CloudPublisher::Publish(CloudData::CLOUD_PTR  cloud_ptr_input) {
	...
    publisher_.publish(*cloud_ptr_output);
}

b.里程计发布类OdometryPublisher:

同上,

c.如何发布

在普通的方式中:

while (ros::ok())
{
	pub.publish(msg);
}

改进后的发布方式:

int main(int argc, char *argv[]) {
// 定义类对象指针
	//订阅者
    std::shared_ptr<CloudSubscriber> cloud_sub_ptr = std::make_shared<CloudSubscriber>(nh, "/kitti/velo/pointcloud", 100000);
    std::shared_ptr<IMUSubscriber> imu_sub_ptr = std::make_shared<IMUSubscriber>(nh, "/kitti/oxts/imu", 1000000);
    std::shared_ptr<GNSSSubscriber> gnss_sub_ptr = std::make_shared<GNSSSubscriber>(nh, "/kitti/oxts/gps/fix", 1000000);
    std::shared_ptr<TFListener> lidar_to_imu_ptr = std::make_shared<TFListener>(nh, "velo_link", "imu_link");
	//发布者
    std::shared_ptr<CloudPublisher> cloud_pub_ptr = std::make_shared<CloudPublisher>(nh, "current_scan", 100, "/map");
    std::shared_ptr<OdometryPublisher> odom_pub_ptr = std::make_shared<OdometryPublisher>(nh, "lidar_odom", "map", "lidar", 100);
   //订阅数据,发布数据
    while (ros::ok()) {
    	ros::spinOnce();
    	//取数据
    	cloud_sub_ptr->ParseData(cloud_data_buff);
        imu_sub_ptr->ParseData(imu_data_buff);
        gnss_sub_ptr->ParseData(gnss_data_buff);
        //经过一些计算...
        
		//发布数据
		cloud_pub_ptr->Publish(cloud_data.cloud_ptr);
		odom_pub_ptr->Publish(odometry_matrix);
    	rate.sleep();
	}
    return 0;
}

2. 订阅者subscriber

一般订阅者的实现:

/*
    需求: 实现基本的话题通信,一方发布数据,一方接收数据,
         实现的关键点:
         1.发送方
         2.接收方
         3.数据(此处为普通文本)


    消息订阅方:
        订阅话题并打印接收到的消息

    实现流程:
        1.包含头文件 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 订阅者 对象
        5.处理订阅的消息(回调函数)
        6.设置循环调用回调函数

*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h"

void doMsg(const std_msgs::String::ConstPtr& msg_p){
    ROS_INFO("我听见:%s",msg_p->data.c_str());
    // ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}
int main(int argc, char  *argv[])
{
    setlocale(LC_ALL,"");
    //2.初始化 ROS 节点:命名(唯一)
    ros::init(argc,argv,"listener");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;

    //4.实例化 订阅者 对象
    ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);
    //5.处理订阅的消息(回调函数)

    //     6.设置循环调用回调函数
    ros::spin();//循环读取接收的数据,并调用回调函数处理

    return 0;
}

改进成一个类后的实现:

a.gnss订阅者

//构造函数,传入句柄和话题
GNSSSubscriber::GNSSSubscriber(ros::NodeHandle& nh, std::string topic_name, size_t buff_size) 
    :nh_(nh) {
    subscriber_ = nh_.subscribe(topic_name, buff_size, &GNSSSubscriber::msg_callback, this);
}
//其中msg_callback就是它的callback函数,也就是接收和处理信息的地方
void GNSSSubscriber::msg_callback(const sensor_msgs::NavSatFixConstPtr& nav_sat_fix_ptr) {
    //...
    new_gnss_data_.push_back(gnss_data);
}
//函数ParseData就是实现从类里取数据的功能
void GNSSSubscriber::ParseData(std::deque<GNSSData>& gnss_data_buff) {
    if (new_gnss_data_.size() > 0) {
        gnss_data_buff.insert(gnss_data_buff.end(), new_gnss_data_.begin(), new_gnss_data_.end());
        new_gnss_data_.clear();
    }
}

b.cloud订阅者

同上,略

c.imu订阅者

同上,略

d.如何订阅

见上边的"c.如何发布"

3. sensor_data

包含点云, gnss, imu数据

4. tf_listener

五 CMakeLists文件规划

这里的CMakeLists.txt指的还是功能包里的那个,目前只有一个功能包lidar_localization.我们把每个包对应的这些操作放在cmake文件夹下对应的XX.cmake文件中,然后在CMakeLists中 include(cmake/XX.cmake)一行代码就可以搞定。
在这里插入图片描述

CMakeLists详解:

cmake_minimum_required(VERSION 2.8.3)
project(lidar_localization) 	#ros包的名称,在vscode中创建ros功能包时输入的那个名称,之后在输入了roscpp,rospy等依赖项

SET(CMAKE_BUILD_TYPE "Release")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
add_compile_options(-std=c++11)
add_definitions(-std=c++11)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  pcl_ros 	# 创建lidar_localization功能包时,只添加了上边三个依赖,遇到新的依赖,要在这里加进去
  geometry_msgs
  tf
  eigen_conversions
)

set(ALL_TARGET_LIBRARIES "") 	#为了避免target_link_libraries后面跟很长一串库的名字,而且库增减的时候它也得跟着增减,我们在CMakeLists文件一开始定义一个变量

include(cmake/glog.cmake) #变量ALL_TARGET_LIBRARIES在.cmake会添加新的内容
include(cmake/PCL.cmake)
include(cmake/eigen.cmake)
include(cmake/geographic.cmake)

include_directories(include ${catkin_INCLUDE_DIRS})
include(cmake/global_defination.cmake)
catkin_package()

# 除了库对应的变量,还有文件名字对应的变量,我们在add_executable的时候要把所需要的cpp文件路径都要写进去,文件多的时候也是太麻烦,所以可以使用下面的指令把所有cpp文件合并到一个变量中
file(GLOB_RECURSE ALL_SRCS "*.cpp")
#但是,当工程中有多个node文件的时候,就要把他们从这个变量中踢出去,因为多个node文件编到一个可执行文件中会出错。用下面的代码踢
file(GLOB_RECURSE NODE_SRCS "src/*_node.cpp")
file(GLOB_RECURSE THIRD_PARTY_SRCS "third_party/*.cpp")
list(REMOVE_ITEM ALL_SRCS ${NODE_SRCS}) #剔除src文件夹内的_node.cpp,都剔除,别担心,后边添加add_executable把需要的node.cpp单独加上就行
list(REMOVE_ITEM ALL_SRCS ${THIRD_PARTY_SRCS}) #剔除third_party文件夹内的.cpp

add_executable(test_frame_node src/test_frame_node.cpp ${ALL_SRCS})
target_link_libraries(test_frame_node ${catkin_LIBRARIES} ${ALL_TARGET_LIBRARIES})

关于catkin CMakeLists.txt

关于catkin CMakeList.txt的一些补充知识(引用):
catkin是ROS官方的一个编译构建系统,是原本的ROS的编译构建系统rosbuild的发展。catkin_make是将cmake与make的编译方式做了一个封装的指令工具,规范了工作路径与生成文件路径。
catkin是ROS官方的一个编译构建系统,是原本的ROS的编译构建系统rosbuild的发展。catkin_make是将cmake与make的编译方式做了一个封装的指令工具,规范了工作路径与生成文件路径。

总体结构:

  • 必需的CMake版本:cmake_minimum_required()
  • 软件包名:project()
  • 查找编译依赖的其他CMake/Catkin包(声明依赖库):find_package()
  • 启动Python模块支持:catkin_python_package()
  • 消息/服务/操作(Message/Service/Action)生成器:add_message_files(),add_service_files(),add_action_files()
  • 调用消息/服务/操作生成:generate_messages()
  • 指定包编译信息导出:catkin_package()
  • 添加要编译的库和可执行文件:add_library()/add_executable()/target_link_libraries()
  • 测试编译:catkin_add_gtest()
  • 安装规则:install()

cmake版本

软件包名

CMake中,可以通过使用变量 ${PROJECT_NAME}在CMake脚本后面的任何位置引用项目名称。

查找编译依赖的CMake包

编译一个项目,需要使用CMake 的 find_package函数确定依赖的其他CMake包并找到它们,一般情况下至少会有一个catkin依赖:

find_package(catkin REQUIRED)

除此之外,项目依赖的其他软件包,都会自动成为catkin的组件(components)(就CMake而言)。因此可以将这些依赖包指定为catkin的组件,而不必再使用find_package,这样将会变得简单

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  pcl_ros
  geometry_msgs
  tf
  eigen_conversions
)

find_package()查找到一个软件包,它就会创建几个CMake环境变量,以提供有关已查找到的软件包的信息。这些环境变量可以在后面的CMake脚本中使用,它们表示软件包导出的头文件所在的位置、源文件所在的位置、软件包依赖的库以及这些库的查找路径.

//catkin_INCLUDE_DIRS就是通过find_package()获得的
include_directories(include ${catkin_INCLUDE_DIRS})

如果不用组件的方式,也单独使用,比如.cmake中的:

find_package(PCL 1.7 REQUIRED)
list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4")
include_directories(${PCL_INCLUDE_DIRS})
list(APPEND ALL_TARGET_LIBRARIES ${PCL_LIBRARIES})

以catkin的组件的方式 find_package它们是有好处的,因为这个过程以catkin_prefix的形式创建了一组环境变量,这就意味着nodelet导出的头文件路径、库等都会附加到 catkin_variables上,比如,catkin_INCLUDE_DIRS不仅包含catkin的头文件路径,也包含了nodelet软件包的头文件路径,这在后面会派上用场。
Boost库:
如果使用C++和Boost库,需要在Boost上调用 find_package(),并指定Boost中将要作为组件的那部分。例如,如果想要使用Boost的线程,可以用:

find_package(Boost REQUIRED COMPONENTS thread)

catkin_package()

catkin_package()是一个由catkin提供的CMake宏。需要指定特定的catkin信息到编译系统,而这些信息又会被用于生成pkg-config和CMake文件。

该函数必须在使用 add_library()或add_executable()声明任何targets之前调用。其5个可选参数:

  • INCLUDE_DIRS:软件包导出的头文件路径(例如cflags)
  • LIBRARIES:项目导出的库
  • CATKIN_DEPENDS:当前项目依赖的其他catkin项目
  • DEPENDS:当前项目依赖的非catkin CMake项目,详细解释参见这里
  • CFG_EXTRAS:其他的配置选项

头文件目录

include_directories的参数应该是由调用find_package生成的* _INCLUDE_DIRS变量以及需要包含的任何其他目录。如果使用catkin和Boost,include_directories()的调用为:

include_directories(include {Boost_INCLUDE_DIRS} {catkin_INCLUDE_DIRS})

第一个参数“include”表示包中的include/目录也是路径的一部分。

库目录

CMake的 link_directories()函数可以添加其他的库目录,然而,并不推荐这么做。所有的catkin和CMake包在find_package时都会自动添加链接信息。只需链接到target_link_libraries()中的库。
添加其他库目录:

link_directories(~/my_libs)

库目标(生成库)

CMake函数 add_library()指定用于编译的库文件,默认情况下,catkin编译共享库。

add_library({PROJECT_NAME} {${PROJECT_NAME}_SRCS})

target_link_libraries

使用 target_link_libraries()函数指定可执行目标所要链接的库,即告诉CMake当链接此可执行文件时需要链接哪些库(这些库在上面的find_package中定义),通常在调用完add_executable()后被调用。如果出现ros未定义的引用错误,则添加${catkin_LIBRARIES}。

target_link_libraries(<executableTargetName>, <lib1>, <lib2>, ... <libN>)

完整的例子:

//将 foo与libmoo.so链接起来
add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多传感器融合-搭建ROS工程 的相关文章

  • hadoop自动故障转移集群搭建详解

    安装包地址 https archive apache org dist hadoop common stable 选择hadoop 3 3 2 tar gz包下载 环境 操作系统 span class token punctuation s
  • TX2 入坑总结(持续更新)

    1 新机无法使用hdmi转VGA连接显示器 xff0c 就算是换成1080p的显示器也不行 xff08 之前的树莓派可是啥都不挑各种连 xff09 更新内核后就可以连接1080p的显示器了 xff08 意外收获 xff09 xff0c 而且
  • 简单概念-BaseLine,PipeLine

    BaseLine 你训练一个模型 xff0c 获得了80 的准确率 xff0c 你觉得很高吗 xff1f 不能这么说 xff0c 因为你没有与别人的东西作对比 只有与当前的state of the art的算法比较才能有意义 xff0c 这
  • FreeRTOS中的变量,函数命名规则(u.v.x.p什么意思)

    写在前面 初学FreeRTOS时 xff0c 每次打开函数列表都一脸懵逼 xff1f 根本不知道这什么prv v ux是什么意思 xff0c 虽然平时使用也不需要知道这么多东西 xff0c 因为它不怎么影响开发 xff0c 但是理解总比疑惑
  • 水准网平差 WinForm C#软件

    水准网平差 span class token class name WinForm span C 软件 版权所有 需求源码请咨询 qq xff1a 849495327 仅供学习交流 界面UI设计 导入数据窗体 showViewdata cs
  • 基于K-d tree的Lidar点云检索C#

    版权所有 咨询请加qq 849495327 Form2 xff1a using System using System Collections Generic using System ComponentModel using System
  • C# 影像特征点提取

    版权所有 详情咨询qq 849495327 内容和要求如下 xff1a 任务 xff1a 提取一幅数字影像中的特征点 内容 xff1a 使用Moravec算子编写程序 xff0c 从一幅数字影像中自动提取出50个以上的特征点 要求 xff1
  • 解决朱有鹏开发板--主机--虚拟机不能互相PING通问题

    解决朱有鹏开发板 主机 虚拟机不能互相PING通问题 前言 xff1a 查遍整个网络 xff0c 没有人发表这个问题 xff0c 在视频中老朱得到的结论是UBOOT有问题 xff0c 结果 xff0c 经过实践发现 xff0c 是可以同时P
  • 一个简单的三层架构之用户登陆和注册在数据库中的存储

    一个简单的三层架构之用户登陆和注册在数据库中的存储 本人为一小白菜鸟 xff0c 在不断学习的过程中将自己学习所得的经验分享给大家 今天为大家介绍的是一个小实现 xff0c 一个三层架构的小实现 xff0c 关于登陆界面用户名输入与注册与数
  • 有哪些比较好的关于GIS和遥感的公众号?

    有哪些比较好的关于GIS和遥感的公众号 xff1f 作为一个正在学习的GISer和遥感学习者 xff0c 有哪些比较好的关于GIS和遥感的公众号呢 xff0c 下面来给大家分享一些我知道的 xff0c 当然又很多途径 xff0c 欢迎大家一
  • 一个简单的三层架构之仓库管理系统的入库出库

    一个简单的三层架构之仓库管理系统的入库出库 今天来讲一下一个简单的三层架构的程序 xff0c 一个仓库管理系统的简单的出库入库操作 xff0c 还有供应商的信息录入 欢迎大家添加 仓库管理系统群 xff08 matlab c java均可
  • C# 图像处理(一)

    下面是一个学习的过程 xff0c 一个小的图像处理软件的C 编程过程 xff0c 是我最近学习的过程 大家可以一起共同学习 欢迎大家加群 图像处理交流群 xff08 C opencv matlab xff09 672854897 1 打开图
  • Invalid bound statement (not found):的原因和解决方法

    在常见数据库异常中这算是比较简单的一类了 xff0c 细致一点就能很好的避免此类问题 xff0c 以下是我总结出容易出错的地方 xff0c 欢迎补充 检查Mapper xml中的方法名和Dao类方法是否一致 xff0c 若使用注解则检查SQ
  • Spring Boot 访问静态页面!

    SpringBoot访问静态页面 一 静态页面放在templates下面 xff08 多个页面可以添加相应的文件夹 xff0c 方便管理 xff09 xff1a 二 配置Controller 这里有两点值得注意 xff1a 其一 xff1a
  • Java动态代理的实现原理

    概述 AOP用到了两种动态代理来实现织入功能 xff1a jdk动态代理cglib动态代理比较 xff1a jdk动态代理是由java内部的反射机制来实现的 xff0c cglib动态代理底层则是借助asm来实现的 反射机制在生成类的过程中
  • MyBati 原理 - 【012】

    1 根据配置文件创建SQLSessionFactory 2 获取SQLSession的实现类DefaultSQLSession 3 getMapper返回接口代理对象 4 查询流程 5 查询流程总结 6 运行原理总结
  • JDK Tomcat MySQL一键安装

    文章目录 材料准备免安装版JDK免安装版Tomcat免安装版MySQL微软Visual C 43 43 运行库组件打包工具Inno Setup 统一目录创建所需文件 xff08 先创建好清楚整体流程 xff09 整体结构文件内容测试 打包步
  • SpringBoot2.1+WebSocket:详解及注意事项

    SpringBoot对WebSocket集成十分完美 xff0c 直接上步骤 引入Maven依赖 lt WebSocket gt lt dependency gt lt groupId gt org springframework boot
  • OVN入门

    参考链接 如何借助 OVN 来提高 OVS 在云计算环境中的性能 OVN简介 Open vSwitch Documentation OVSDB介绍及在OpenDaylight中的调用 OpenDaylight即将迈入 七年之痒 xff1f
  • 阿里智能运维平台的演进:从自动化到无人化(附PPT)

    差不多在两年前 xff0c 阿里内部出现了很多运维中台 研发中台等等 xff0c 那有没有后台呢 xff1f 不好意思 xff0c 我们只有中台 xff0c 没有后台 xff0c 会在中台上构建与业务相关的各个前台 目前阿里的业务几乎覆盖了

随机推荐

  • windows通过vnc远程连接ubuntu

    windows通过vnc远程连接ubuntu 实验室的电脑装好了ubuntu16 04的系统 xff0c 显卡比较好 xff0c 想要跑程序的话人太多了 xff0c 不能大家都排队来使用 xff0c 因此我想使用windows直接连接ubu
  • vscode如何连接gitlab代码库

    零 前期准备工作 1 已安装好vscode xff0c 如未安装 xff0c 按如下地址下载并且安装 xff08 或参考其他安装教程 xff09 xff1a https code visualstudio com Download 2 已安
  • 对rtthread系统的理解

    写这个的目的就是记录下自己对rtthread系统框架的理解 xff0c 并不会对相关的知识点做介绍 xff0c 因为官方文档介绍的比较详细 xff08 也有介绍不细致的地方 xff09 xff0c 我没必要去摘录一遍 在工作中用rtthre
  • performance API 中什么指标可以衡量首屏时间

    performance timing loadEventEnd 返回当前网页 load 事件的回调函数运行结束时的 Unix 毫秒时间戳 如果该事件还没有发生 返回 0 performance timing navigationStart
  • C++中的双冒号

    文章目录 https www cnblogs com kimmychul p 3951229 html 另外 xff0c 在ros中 xff0c 创建的xxx msg xxx srv等文件中定义的变量a xff0c 在使用时要写packag
  • Python使用ros的TF变换

    https www cnblogs com xialuobo p 6097806 html
  • CMakeList.txt文件详解

    1 整体结构 CMakeList txt文件必须遵循以下的格式 xff1a 所需的CMake版本 xff08 cmake minimum required xff09 软件包的名称 xff08 project xff09 查找构建所需要的其
  • centos7.5 + ryu+mininet+docker+wireshark+ovs

    1 安装pip 没有python pip包就执行命令 yum y install epel release 执行成功之后 xff0c 再次执行yum install python pip 2 安装ryu4 30 pip install ry
  • 【C++学习】——(五)数组

    C 43 43 学习 xff08 五 xff09 数组 开篇 上一篇讲解了类型 xff0c 通过类型来开始本篇的学习 xff1b int a 10 上述代码中的a是什么类型呢 xff1f 相信很多人都知道是一个数组类型 xff0c 具体来说
  • openstack中ipv6三种获取IP地址方式

    前言 openstack共有三种用于ipv6的寻址的模式 xff0c 分别是dhcpv6 stateful dhcp stateless以及slaac 1 xff09 slaac模式 Address discovered from an O
  • 华为S5720-52X-PWR-LI/S5720-52X-LI交互机堆叠和VLAN配置

    主要配置流程为 xff1a 交换机设备上电通过console线或网线连接到交换机后 xff0c 进行参数和堆叠配置断电 xff0c 连接好光纤重新上电 1 首次登录交换机 使用Putty软件 xff0c 通过串口 xff0c 连接到交换机
  • 配置Intel REALSENSE相机的一些坑

    最近入手了一个intel REALSENSE相机 xff0c 看别人都是直接使用配套的USB3的线连接电脑就安装好了 xff0c 但是我却要倒霉的配置了一个下午 xff0c 终于在今天晚上配置好了 xff0c 记录一下这个下午踩过的坑 xf
  • 高斯滤波知识点总结——KF、EKF、UKF以及IF、EIF等

    高斯滤波知识点总结 KF EKF UKF以及IF EIF等 1 引言 本文是我在学习 Probabilistic Robotics 这本书中第三章 高斯滤波过程中的一些知识总结 本文主要是整理高斯滤波算法的知识点和一些讨论 xff0c 具体
  • Git 学习小结

    Git 安装和使用教程 git 提交 全部文件 git add git add xx命令可以将xx文件添加到暂存区 xff0c 如果有很多改动可以通过 git add A 来一次添加所有改变的文件 注意 A 选项后面还有一个句点 git a
  • ROS 串口

    64 TOC ROS学习笔记 ROS中使用串口进行通讯测试 参考两篇文献 xff0c 感谢原作者 xff1a https blog csdn net qq 44623066 article details 125626937 https b
  • sklearn库之sklearn.cluster.KMeans的学习

    这篇呢是接着上一篇kmeans的学习 xff0c 这篇主要是介绍调用机器学习的库来使用集成的kmeans 哈哈会调用就行 xff0c 主要学习呢就是看官方文档 xff0c 学习这个包装类的参数 xff0c 返回值以及它方法 这里面有好多ex
  • docker容器开启ssh端口

    docker容器开启ssh端口 启动一个docker容器 加端口 port 22 docker run dit p port 22 p port1 port restart span class token operator 61 span
  • PID中各个参数意义

    1 比例部分 xff1a PID是比例 积分 微分的简称 xff0c PID控制的难点不是编程 xff0c 而是控制器的参数整定 增大比例系数使系统反应灵敏 xff0c 调节速度加快 xff0c 并且可以减小稳态误差 但是比例系数过大会使超
  • 关于多线程,你必须知道的那些玩意儿

    进程与线程 概念 进程和线程作为必知必会的知识 xff0c 想来读者们也都是耳熟能详了 xff0c 但真的是这样嘛 xff1f 今天我们就来重新捋一捋 xff0c 看看有没有什么知识点欠缺的 先来一张我随手截的活动监视器的图 xff0c 分
  • 多传感器融合-搭建ROS工程

    多传感器融合搭建记录1 Tag3 0 一 安装Terminator二 vscode创建功能包三 ROS相关基础1 添加源文件2 添加launch文件3 ROS话题通讯 四 添加代码1 发布者publishera 点云发布类CloudPubl