基于rf2o_laser_odometry纯激光里程计的gmapping建图

article/2025/7/21 23:53:17
  • ROS环境:ubuntu16.04 & ROS kinetic
  • 激光雷达:EAI-X4 or RPlidar-A1
  • 激光里程计:rf2o_laser_odometry
  • 建图:gmapping

对于很多刚入门的同学,购买一台带有高精度轮式里程计的ROS小车经济上往往不允许。但是大多数同学都接触过那种基于51或Arduino之类的简易智能小车,就是那种做寻迹比赛的小车(不带里程计解析算法和ROS驱动接口),如图1。那么能不能在这种简易智能小车上只用一个激光雷达就能进行SLAM建图呢?答案是肯定的,下面一步步教你怎么做。

图1  简易智能车

温馨提示:

本篇文章已经收录在我最新出版的书籍《机器人SLAM导航核心技术与实战》,感兴趣的读者可以购买纸质书籍来进行更加深入和系统性的学习,购买链接如下:

点这里购买:《机器人SLAM导航核心技术与实战》购买链接

1.将激光雷达安装到你的小车上

理论上讲,选择哪种型号的激光雷达都是可以的,只是安装雷达ROS驱动时会有所不同而已。不过市面上比较常见的是EAI-X4或者Rrplidar-A1这种低成本激光雷达,我这里用的是EAI-X4这款雷达,就以这个为例讲解吧。其实就是将激光雷达固定到你的小车上,然后找根USB线将雷达连接到电脑(电脑需支持ubuntu&ROS)就行了,如图2所示。

图2  雷达有线连接

那么问题来了,你的小车是要移动建图的,电脑与雷达之间这根烦人的USB线肯定是不行的。由于雷达基本都是USB串口协议通信的,找个USB串口透传模块就能轻松替代这根USB线,如下图3所示。

图3  雷达无线连接

2.安装激光雷达ROS驱动

按上面连好雷达,就可以在电脑中安装雷达ROS驱动了,驱动到雷达原厂官网可以下载到,或者从购买渠道商家那里索取。下面是EAI-X4雷达的ROS驱动下载链接:

下载与技术支持_ydlidar|机器人激光雷达领导品牌

下载好后,将驱动板解压到自己的ROS工作空间(比如路径~/catkin_ws/src/),然后编译。没有建立ROS工作空间或者不知道ROS工作空间的同学可以看我之前的教程(SLAM导航机器人零基础实战系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world..._小虎哥哥爱学习-CSDN博客)。

2.1编译

#编译命令
cd catkin_ws/
catkin_make 

2.2设置串口号及权限

雷达插入电脑后通常被识别出的串口号为/dev/ttyUSB0,具体看你自己的情况(也可能是/dev/ttyUSB1或者/dev/ttyUSB2等等),需要将这个串口号赋予可读写权限。

#赋予权限
sudo chmod 777 /dev/ttyUSB0

然后雷达驱动包里面路径为ydlidar/launch/lidar.launch的启动文件中port、frame_id和tf发布参数要修改,修改好的参数如下:

<launch><node name="ydlidar_node"  pkg="ydlidar"  type="ydlidar_node" output="screen"><param name="port"         type="string" value="/dev/ttyUSB0"/>  <param name="baudrate"     type="int"    value="115200"/><param name="frame_id"     type="string" value="laser_frame"/><param name="angle_fixed"  type="bool"   value="true"/><param name="low_exposure"  type="bool"   value="false"/><param name="heartbeat"    type="bool"   value="false"/><param name="resolution_fixed"    type="bool"   value="true"/><param name="angle_min"    type="double" value="-180" /><param name="angle_max"    type="double" value="180" /><param name="range_min"    type="double" value="0.08" /><param name="range_max"    type="double" value="16.0" /><param name="ignore_array" type="string" value="" /><param name="samp_rate"    type="int"    value="9"/><param name="frequency"    type="double" value="7"/></node><node pkg="tf" type="static_transform_publisher" name="base_link_to_laser4"args="0.2245 0.0 0.2 0.0 0.0  0.0 /base_footprint /laser_frame 40" />
</launch>

2.3启动雷达

#启动
roslaunch ydlidar lidar.launch

3.安装rf2o_laser_odometry激光里程计

说起了rf2o_laser_odometry的工作原理也很简单,就是利用相邻两帧雷达数据匹配得到里程位移量。

3.1下载rf2o_laser_odometry源码

#依然是将rf2o_laser_odometry下载到ROS工作空间
cd catkin_ws/src/
git clone https://github.com/MAPIRlab/rf2o_laser_odometry.git

3.2代码bug修复

下载得到的原始rf2o_laser_odometry代码有两个问题,如果不修复会有下面这两个报错:

#报错1:

ERRO:“base_link” passed to lookupTransform argument source_frame does not exist. 或者 ERRO:Invalid argument passed to lookupTrasform argument source_frame in tf2 frame_ids cannot be empty

#报错2:

[rf2o] ERROR: Eigensolver couldn't find a solution. Pose is not updated

第1个错误是由于程序订阅/tf话题数据时超时,加个延迟就好了。在源码rf2o_laser_odometry/src/CLaserOdometry2DNode.cpp中第126行的上面添加下面这句:

tf_listener.waitForTransform(base_frame_id,"laser_link",ros::Time(),ros::Duration(5.0));

第2个错误是你的激光雷达上传来的数据包含Inf或NaNs非法格式数据,我亲测发现EAI-X4雷达没有这个问题,而Rplidar-A1雷达会有这个问题,以防万一还是修复一下吧。将源码rf2o_laser_odometry/src/CLaserOdometry2D.cpp中第292和316行的条件语句都改成下面这个:

if (std::isfinite(dcenter) && dcenter > 0.f)

3.3编译

#编译命令
cd catkin_ws/
catkin_make

3.4参数配置

rf2o_laser_odometry/launch/rf2o_laser_odometry.launch中的雷达话题、里程计话题、各个frame_id等参数设置对,设置好的参数如下:

<launch><node pkg="rf2o_laser_odometry" type="rf2o_laser_odometry_node" name="rf2o_laser_odometry" output="screen"><param name="laser_scan_topic" value="/scan"/>        # topic where the lidar scans are being published<param name="odom_topic" value="/odom" />              # topic where tu publish the odometry estimations<param name="publish_tf" value="true" />                   # wheter or not to publish the tf::transform (base->odom)<param name="base_frame_id" value="base_link"/>            # frame_id (tf) of the mobile robot base. A tf transform from the laser_frame to the base_frame is mandatory<param name="odom_frame_id" value="odom" />                # frame_id (tf) to publish the odometry estimations    <param name="init_pose_from_topic" value="" /> # (Odom topic) Leave empty to start at point (0,0)<param name="freq" value="6.0"/>                            # Execution frequency.<param name="verbose" value="true" />                       # verbose</node></launch>

3.5启动激光里程计

#启动
roslaunch rf2o_laser_odometry rf2o_laser_odometry.launch

4.安装gmapping建图

到这里,你已经具有激光雷达数据和用激光雷达模拟出来的里程计数据,接下来只需要安装gmapping这个最简单的SLAM建图算法就可以构建出地图了。

4.1下载并编译gmapping

#依然是将gmapping下载到ROS工作空间
cd catkin_ws/src/
git clone https://github.com/ros-perception/slam_gmapping.git
cd slam_gmapping
git clone https://github.com/ros-perception/openslam_gmapping.git#编译
cd catkin_ws/
catkin_make

4.2参数配置

将slam_gmapping/gmapping/launch/slam_gmapping_pr2.launch中的雷达话题等参数设置对,设置好的参数如下:

<launch><param name="use_sim_time" value="true"/><node pkg="gmapping" type="slam_gmapping" name="slam_gmapping" output="screen"><remap from="scan" to="/scan"/><param name="map_update_interval" value="5.0"/><param name="maxUrange" value="16.0"/><param name="sigma" value="0.05"/><param name="kernelSize" value="1"/><param name="lstep" value="0.05"/><param name="astep" value="0.05"/><param name="iterations" value="5"/><param name="lsigma" value="0.075"/><param name="ogain" value="3.0"/><param name="lskip" value="0"/><param name="srr" value="0.1"/><param name="srt" value="0.2"/><param name="str" value="0.1"/><param name="stt" value="0.2"/><param name="linearUpdate" value="1.0"/><param name="angularUpdate" value="0.5"/><param name="temporalUpdate" value="3.0"/><param name="resampleThreshold" value="0.5"/><param name="particles" value="30"/><param name="xmin" value="-50.0"/><param name="ymin" value="-50.0"/><param name="xmax" value="50.0"/><param name="ymax" value="50.0"/><param name="delta" value="0.05"/><param name="llsamplerange" value="0.01"/><param name="llsamplestep" value="0.01"/><param name="lasamplerange" value="0.005"/><param name="lasamplestep" value="0.005"/></node>
</launch>

4.3启动建图

#启动
roslaunch gmapping slam_gmapping_pr2.launch

4.4查看地图

#打开rviz
rviz

在rviz订阅Map话题就能看到地图了,看到下面这张图就大功告成了。

这时候可以用手持方式将激光雷达在水平上进行缓慢移动,或者用你小车提供的控制方式控制小车移动,这样上面的地图会有更新,恭喜你享受SLAM建图的乐趣吧。

后记

如果大家对博文的相关类容感兴趣,或有什么技术疑问,欢迎加QQ技术交流群(117698356

参考文献

[1] 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.

 购书链接:https://item.jd.com/13041503.html

下载更多资料:www.xiihoo.com

QQ技术讨论群:117698356

B站视频教程:https://space.bilibili.com/66815220

Github源码:https://github.com/xiihoo/Books_Robot_SLAM_Navigation

Gitee源码(国内访问速度快):https://gitee.com/xiihoo-robot/Books_Robot_SLAM_Navigation

前言

编程基础篇

第1章 ROS入门必备知识

1.1 ROS简介 2

1.1.1 ROS的性能特色 2

1.1.2 ROS的发行版本 3

1.1.3 ROS的学习方法 3

1.2 ROS开发环境的搭建 3

1.2.1 ROS的安装 4

1.2.2 ROS文件的组织方式 4

1.2.3 ROS网络通信配置 5

1.2.4 集成开发工具 5

1.3 ROS系统架构 5

1.3.1 从计算图视角理解ROS架构 6

1.3.2 从文件系统视角理解ROS架构 7

1.3.3 从开源社区视角理解ROS架构 8

1.4 ROS调试工具 8

1.4.1 命令行工具 9

1.4.2 可视化工具 9

1.5 ROS节点通信 10

1.5.1 话题通信方式 12

1.5.2 服务通信方式 15

1.5.3 动作通信方式 19

1.6 ROS的其他重要概念 25

1.7 ROS 2.0展望 28

1.8 本章小结 28

第2章 C++编程范式

2.1 C++工程的组织结构 29

2.1.1 C++工程的一般组织结构 29

2.1.2 C++工程在机器人中的组织结构 29

2.2 C++代码的编译方法 30

2.2.1 使用g++编译代码 31

2.2.2 使用make编译代码 32

2.2.3 使用CMake编译代码 32

2.3 C++编程风格指南 33

2.4 本章小结 34

第3章 OpenCV图像处理

3.1 认识图像数据 35

3.1.1 获取图像数据 35

3.1.2 访问图像数据 36

3.2 图像滤波 37

3.2.1 线性滤波 37

3.2.2 非线性滤波 38

3.2.3 形态学滤波 39

3.3 图像变换 40

3.3.1 射影变换 40

3.3.2 霍夫变换 42

3.3.3 边缘检测 42

3.3.4 直方图均衡 43

3.4 图像特征点提取 44

3.4.1 SIFT特征点 44

3.4.2 SURF特征点 50

3.4.3 ORB特征点 52

3.5 本章小结 54

硬件基础篇

第4章 机器人传感器

4.1 惯性测量单元 56

4.1.1 工作原理 56

4.1.2 原始数据采集 60

4.1.3 参数标定 65

4.1.4 数据滤波 73

4.1.5 姿态融合 75

4.2 激光雷达 91

4.2.1 工作原理 92

4.2.2 性能参数 94

4.2.3 数据处理 96

4.3 相机 100

4.3.1 单目相机 101

4.3.2 双目相机 107

4.3.3 RGB-D相机 109

4.4 带编码器的减速电机 111

4.4.1 电机 111

4.4.2 电机驱动电路 112

4.4.3 电机控制主板 113

4.4.4 轮式里程计 117

4.5 本章小结 118

第5章 机器人主机

5.1 X86与ARM主机对比 119

5.2 ARM主机树莓派3B+ 120

5.2.1 安装Ubuntu MATE 18.04 120

5.2.2 安装ROS melodic 122

5.2.3 装机软件与系统设置 122

5.3 ARM主机RK3399 127

5.4 ARM主机Jetson-tx2 128

5.5 分布式架构主机 129

5.5.1 ROS网络通信 130

5.5.2 机器人程序的远程开发 130

5.6 本章小结 131

第6章 机器人底盘

6.1 底盘运动学模型 132

6.1.1 两轮差速模型 132

6.1.2 四轮差速模型 136

6.1.3 阿克曼模型 140

6.1.4 全向模型 144

6.1.5 其他模型 148

6.2 底盘性能指标 148

6.2.1 载重能力 148

6.2.2 动力性能 148

6.2.3 控制精度 150

6.2.4 里程计精度 150

6.3 典型机器人底盘搭建 151

6.3.1 底盘运动学模型选择 152

6.3.2 传感器选择 152

6.3.3 主机选择 153

6.4 本章小结 155

SLAM篇

第7章 SLAM中的数学基础

7.1 SLAM发展简史 158

7.1.1 数据关联、收敛和一致性 160

7.1.2 SLAM的基本理论 161

7.2 SLAM中的概率理论 163

7.2.1 状态估计问题 164

7.2.2 概率运动模型 166

7.2.3 概率观测模型 171

7.2.4 概率图模型 173

7.3 估计理论 182

7.3.1 估计量的性质 182

7.3.2 估计量的构建 183

7.3.3 各估计量对比 190

7.4 基于贝叶斯网络的状态估计 193

7.4.1 贝叶斯估计 194

7.4.2 参数化实现 196

7.4.3 非参数化实现 202

7.5 基于因子图的状态估计 206

7.5.1 非线性最小二乘估计 206

7.5.2 直接求解方法 206

7.5.3 优化方法 208

7.5.4 各优化方法对比 218

7.5.5 常用优化工具 219

7.6 典型SLAM算法 221

7.7 本章小结 221

第8章 激光SLAM系统

8.1 Gmapping算法 223

8.1.1 原理分析 223

8.1.2 源码解读 228

8.1.3 安装与运行 233

8.2 Cartographer算法 240

8.2.1 原理分析 240

8.2.2 源码解读 247

8.2.3 安装与运行 258

8.3 LOAM算法 266

8.3.1 原理分析 266

8.3.2 源码解读 267

8.3.3 安装与运行 270

8.4 本章小结 270

第9章 视觉SLAM系统

9.1 ORB-SLAM2算法 274

9.1.1 原理分析 274

9.1.2 源码解读 310

9.1.3 安装与运行 319

9.1.4 拓展 327

9.2 LSD-SLAM算法 329

9.2.1 原理分析 329

9.2.2 源码解读 334

9.2.3 安装与运行 337

9.3 SVO算法 338

9.3.1 原理分析 338

9.3.2 源码解读 341

9.4 本章小结 341

第10章 其他SLAM系统

10.1 RTABMAP算法 344

10.1.1 原理分析 344

10.1.2 源码解读 351

10.1.3 安装与运行 357

10.2 VINS算法 362

10.2.1 原理分析 364

10.2.2 源码解读 373

10.2.3 安装与运行 376

10.3 机器学习与SLAM 379

10.3.1 机器学习 379

10.3.2 CNN-SLAM算法 411

10.3.3 DeepVO算法 413

10.4 本章小结 414

自主导航篇

第11章 自主导航中的数学基础

11.1 自主导航 418

11.2 环境感知 420

11.2.1 实时定位 420

11.2.2 环境建模 421

11.2.3 语义理解 422

11.3 路径规划 422

11.3.1 常见的路径规划算法 423

11.3.2 带约束的路径规划算法 430

11.3.3 覆盖的路径规划算法 434

11.4 运动控制 435

11.4.1 基于PID的运动控制 437

11.4.2 基于MPC的运动控制 438

11.4.3 基于强化学习的运动控制 441

11.5 强化学习与自主导航 442

11.5.1 强化学习 443

11.5.2 基于强化学习的自主导航 465

11.6 本章小结 467

第12章 典型自主导航系统

12.1 ros-navigation导航系统 470

12.1.1 原理分析 470

12.1.2 源码解读 475

12.1.3 安装与运行 479

12.1.4 路径规划改进 492

12.1.5 环境探索 496

12.2 riskrrt导航系统 498

12.3 autoware导航系统 499

12.4 导航系统面临的一些挑战 500

12.5 本章小结 500

第13章 机器人SLAM导航综合实战

13.1 运行机器人上的传感器 502

13.1.1 运行底盘的ROS驱动 503

13.1.2 运行激光雷达的ROS驱动 503

13.1.3 运行IMU的ROS驱动 504

13.1.4 运行相机的ROS驱动 504

13.1.5 运行底盘的urdf模型 505

13.1.6 传感器一键启动 506

13.2 运行SLAM建图功能 506

13.2.1 运行激光SLAM建图功能 507

13.2.2 运行视觉SLAM建图功能 508

13.2.3 运行激光与视觉联合建图功能 508

13.3 运行自主导航 509

13.4 基于自主导航的应用 510

13.5 本章小结 511

附录A Linux与SLAM性能优化的探讨

附录B 习题


http://chatgpt.dhexx.cn/article/arUhZhJT.shtml

相关文章

nav_msgs/Odometry消息的发布和tf变换

一。ROS使用tf来决定机器人的位置和静态地图中的传感器数据&#xff0c;但是tf中没有机器人的速度信息&#xff0c;所以导航功能包要求机器人 能够通过里程计信息源发布包含速度信息的里程计nav_msgs/Odometry 消息。 本篇将介绍nav_msgs/Odometry消息&#xff0c;并且通过代码…

【视觉SLAM】DM-VIO: Delayed Marginalization Visual-Inertial Odometry

L. v. Stumberg and D. Cremers, “DM-VIO: Delayed Marginalization Visual-Inertial Odometry,” in IEEE Robotics and Automation Letters, vol. 7, no. 2, pp. 1408-1415, April 2022, doi: 10.1109/LRA.2021.3140129. 论文阅读方法&#xff1a;Title&#xff0c;Abstract…

DSO(Direct Sparse Odometry)

DSO&#xff08;Direct Sparse Odometry&#xff09; 文章目录 1. 简述2. 概述3. 框架流程3.1 代码框架与数据表示3.2 VO流程 4. DSO详细介绍4.1 残差的构成与雅可比4.2 滑动窗口的维护与边缘化4.3 零空间&#xff0c;FEJ4.4 其他零散的模块和算法 5. 光度标定6. 评述7. 资料与…

SVO(SVO: fast semi-direct monocular visual odometry)

SVO2系列之深度滤波DepthFiltersvo_noteSVO&#xff08;SVO: fast semi-direct monocular visual odometry&#xff09;SVO 半直接视觉里程计【DepthFilter】深度滤波器【svopro】代码梳理 SVO&#xff08;SVO: fast semi-direct monocular visual odometry&#xff09;翻译 1、…

航迹推演

​ 做机器人底层程序的时候&#xff0c;经常用到航迹推演&#xff08;Odometry&#xff09;&#xff0c;无论是定位导航还是普通的方向控制。航迹推演中除了对机器人位姿进行估计&#xff0c;另一个很重要的关系是移动机器人前进速度、转向角速度与左轮速度、右轮速度之间的转换…

航迹推演(Odometry)

做机器人底层程序的时候&#xff0c;经常用到航迹推演&#xff08;Odometry&#xff09;&#xff0c;无论是定位导航还是普通的方向控制。航迹推演中除了对机器人位姿进行估计&#xff0c;另一个很重要的关系是移动机器人前进速度、转向角速度与左轮速度、右轮速度之间的转换。…

大数据基础编程+实验

本文仅用于分析和记录在校期间学习大数据分析课程的一点心得体会。 1、Ubuntu系统的安装和使用 本文采用Ubuntu16.04系统&#xff0c;安装系统省略&#xff0c;选择镜像后一直点击下一步 1.1 进入系统后&#xff0c;调整输入法&#xff0c;将输入法切换至中英文切换 1.2为…

Python数据库编程pymysql

Python数据库编程pymysql 一、数据库编程介绍 数据库编程就是针对数据库的操作&#xff0c;通过编写程序的方式&#xff0c;让程序做为数据库的客户端进行数据库操作。 对于MySQL的操作我们可以通过SQL语句&#xff0c;但是有很多情况下我们需要写入MySQL的数据非常多&#…

过程化SQL数据库编程

一、过程化SQL的块结构 基本的SQL是高度非过程化的语言。嵌入式SQL将SQL语句嵌入程序设计语言&#xff0c;借助高级语言的控制功能实现过程化。过程化SQL是对SQL的扩展&#xff0c;使其增加了过程化语句功能。 过程化SQL程序的基本结构是块。所有的过程化SQL程序都是由块组成的…

Java的数据库编程:JDBC

目录 一、JDBC是什么&#xff1f; 二、使用步骤 1.首先将JDBC的包引进java中 2.创建新的类来写代码 3.描述你的服务器 4.设置你的数据库地址,数据库用户名,数据库密码 5.连接数据库 6.书写你所要执行的SQL语句 7.把字符串风格的sql转化成一个对象 8.执行语句 9.回收资…

Python数据库编程

操作SQLite3数据库 从Python3.x版本开始&#xff0c;在标准库中已经内置了SQLlite3模块&#xff0c;它可以支持SQLite3数据库的访问和相关的数据库操作。在需要操作SQLite3数据库数据时&#xff0c;只须在程序中导入SQLite3模块即可。Python语言操作SQLite3数据库的基本流程如…

实验7 数据库编程

第1关 定义一个名为PROC_COUNT的无参数存储过程 任务描述 定义一个名为PROC_COUNT的无参数存储过程&#xff0c;查询工程名称中含有“厂”字的工程数量&#xff0c;并调用该存储过程。 相关知识 1、工程项目表J由工程项目代码(JNO)、工程项目名(JNAME)、工程项目所在城市(CITY)…

C++数据库编程简介

C数据库编程简介 C数据库编程 ODBC简介 C数据库编程 ODBC连接SQL Server数据库 C数据库编程 ODBC插入数据 C数据库编程 ODBC查询数据 C数据库编程 ODBC删除数据 C数据库编程 ODBC修改数据 C数据库编程 ODBC连接MySQL增删改查数据 C数据库编程 MySQL Connecttor C简介 …

游戏设计模式——面向数据编程(转)

作者&#xff1a;KillerAery 出处&#xff1a;http://www.cnblogs.com/KillerAery/ 随着软件需求的日益复杂发展&#xff0c;远古时期面的向过程编程思想才渐渐萌生了面向对象编程思想。 当人们发现面向对象在应对高层软件的种种好处时&#xff0c;越来越沉醉于面向对象&…

数据科学必备Python编程基础

前言 对于Python复杂的编程语言中提取了数据分析常用的数据处理以及数据可视化等数据分析师常用的内容&#xff0c;区别与其他的Python编程教程&#xff0c;如果是纯开发的小伙伴&#xff0c;看完本系列的文章仅仅只能掌握数据相关处理的内容&#xff0c;并不能完全掌握开发方…

数据结构中的C语言编程基础

​ 在学习数据结构时&#xff0c;需要我们编写许多的程序&#xff0c;对于一些变量的定义、结构体的声明、指针的使用&#xff0c;需要有一个统一的标准&#xff0c;这样才能方便我们使用、并简化记忆难度。 ​ 本文结合自身的编程经验和高分笔记中对考研数据结构编程的一些建…

面向数据编程 Data-Oriented Programming [1]

RuntimeMapMaker3D-Pro 面向数据的编程原则 0.1 简介 面向数据的编程是一种编程范式&#xff0c;旨在简化以信息为中心的软件系统的设计和实施。而不是围绕着将数据和代码结合在一起的实体&#xff08;如实例化的对象&#xff09;来设计信息系统&#xff08;例如&#xff0c;从…

ODBC API开发教程

ODBC API开发教程 作者&#xff1a;闻怡洋 未得到作者允许请勿转载 http://wyy.vchelp.net/ 目录 第 1 章 介绍... 2 第 2 章 ODBC API访问数据库... 2 2.1 ODBC简要介绍... 2 2.1.1 在没有ODBC以前... 2 2.1.2 ODBC介绍... 3 2.1.3 ODBC结构…

Microsoft Server 2008 空间存储 应用方法详解

2019独角兽企业重金招聘Python工程师标准>>> 刚接触2008的空间存储&#xff0c;资料比较少&#xff0c;在数据库操作中有很多不懂的地方&#xff0c;包括用法&#xff0c;语法等&#xff0c;经过同事的指点明白了一些&#xff0c;感谢大腿同事~这里只记录数据库操作…

ODBC 数据类型和API(VC)

目录 ODBC 数据类型API 函数 ODBC 数据类型 ODBC SQL 数据类型 展开显示 ODBC SQL 数据类型SQL类型标识SQL 92类型标识类型描述SQL_CHARCHAR(n)定长字符串,其长度为nSQL_VARCHARVARCHAR(n)变长字符串,最大长度为nSQL_LONGVARCHARLONG VARCHAR变长字符串,最大长度取决于数据源S…