一起自学SLAM算法:13.1 运行机器人上的传感器

2023-05-16

连载文章,长期更新,欢迎关注:


写在前面

第1章-ROS入门必备知识

第2章-C++编程范式

第3章-OpenCV图像处理

第4章-机器人传感器

第5章-机器人主机

第6章-机器人底盘

第7章-SLAM中的数学基础

第8章-激光SLAM系统

第9章-视觉SLAM系统

第10章-其他SLAM系统

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

第12章-典型自主导航系统

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

        13.1 运行机器人上的传感器

        13.2 运行SLAM构建地图

        13.3 运行自主导航

        13.4 基于自主导航的应用


由于xiihoo机器人中已经为电机控制板、激光雷达、IMU和相机安装好了配套的ROS驱动,因此只要在机器人上开启相应传感器的ROS驱动节点就可以使用这些传感器了。关于这几个传感器的工作原理请参考第4章的相关内容,这里就不再赘述了。

13.1.1 运行底盘的ROS驱动

底盘ROS驱动一方面通过订阅控制话题/cmd_vel并将其解析转发给电机控制板,另一方面从电机控制板获取电机编码器数据并将其解析发布到轮式里程计话题/odom以及odom->base_link的tf关系之中。每种机器人底盘都会提供配套的底盘ROS驱动,在“xiihoo机器人”中底盘ROS驱动为xiihoo_bringup,通过下面的命令进行启动。

#启动底盘
roslaunch xiihoo_bringup minimal.launch

一旦底盘ROS驱动启动以后,就可以向底盘ROS驱动节点的话题/cmd_vel中发送线速度和角速度控制量来控制底盘运动了。其中话题/cmd_vel的消息类型为geometry_msgs::Twist,而geometry_msgs::Twist的数据结构如下。

[geometry_msgs/Twist.msg]
#Raw Message Definition
Vector3  linear
Vector3  angular
#Compact Message Definition
geometry_msgs/Vector3 linear
geometry_msgs/Vector3 angular

同时从电机控制板获取到的电机编码器数据将被解析成里程计数据并发布到话题/odom以及odom->base_link的tf关系之中。其中话题/odom的消息类型为nav_msgs::Odometry,而nav_msgs::Odometry的数据结构如下。

[nav_msgs/Odometry.msg]
#Raw Message Definition
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
#Compact Message Definition
std_msgs/Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist

13.1.2 运行激光雷达的ROS驱动

激光雷达ROS驱动节点从激光雷达读取扫描数据并发布到话题/scan,激光雷达ROS驱动由相应厂商提供。在“xiihoo机器人”中,激光雷达数据通过ydlidar驱动发布,通过下面的命令进行启动。

#启动激光雷达
roslaunch ydlidar my_x4.launch 

这需要注意一下激光雷达数据的坐标系,“xiihoo机器人”中的激光雷达采用右手坐标系,雷达正前方为x轴、正左方为y轴、正上方为z轴、以x轴起始逆时针方向为theta轴。激光雷达的扫描数据以极坐标的形式表示,激光雷达正前方是极坐标0度方向、正左方是极坐标90度方向,红色点为扫描到的数据点,如图13-2所示。

图13-2  激光雷达数据格式

一旦激光雷达ROS驱动启动以后,就可以从话题/scan中订阅到激光雷达的扫描数据了。其中话题/scan的消息类型为sensor_msgs::LaserScan,而sensor_msgs::LaserScan的数据结构如下。angle_increment表示激光数据点的极坐标递增角度,ranges数组存放实际的极坐标点距离值。

[sensor_msgs::LaserScan.msg]
#Raw Message Definition
Header header
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities
#Compact Message Definition
std_msgs/Header header
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities

13.1.3 运行IMU的ROS驱动

IMU的ROS驱动节点从IMU模块读取数据并发布到话题/imu,IMU的ROS驱动由相应厂商提供。在“xiihoo机器人”中,IMU数据通过xiihoo_imu驱动发布,通过下面的命令进行启动。

#启动IMU
roslaunch xiihoo_imu imu.launch

一旦IMU的ROS驱动启动以后,就可以从话题/imu中订阅到IMU的数据了。其中话题/imu的消息类型为sensor_msgs::Imu,而sensor_msgs::Imu的数据结构如下。

[sensor_msgs::Imu.msg]
#Raw Message Definition
Header header
geometry_msgs/Quaternion orientation
float64[9] orientation_covariance
geometry_msgs/Vector3 angular_velocity
float64[9] angular_velocity_covariance
geometry_msgs/Vector3 linear_acceleration
float64[9] linear_acceleration_covariance
#Compact Message Definition
std_msgs/Header header
geometry_msgs/Quaternion orientation
float64[9] orientation_covariance
geometry_msgs/Vector3 angular_velocity
float64[9] angular_velocity_covariance
geometry_msgs/Vector3 linear_acceleration
float64[9] linear_acceleration_covariance

13.1.4 运行相机的ROS驱动

在“xiihoo机器人”中使用的是USB单目相机,采用usb_cam驱动获取图像数据并发布到话题/usb_cam/image_raw,通过下面的命令进行启动。

#启动相机
roslaunch usb_cam usb_cam.launch

一旦相机的ROS驱动启动以后,就可以从话题/usb_cam/image_raw中订阅到图像数据了。其中话题/usb_cam/image_raw的消息类型为sensor_msgs::Image,而sensor_msgs::Image的数据结构如下。

[sensor_msgs::Image.msg]
#Raw Message Definition
Header header
uint32 height
uint32 width
string encoding
uint8 is_bigendian
uint32 step
uint8[] data
#Compact Message Definition
std_msgs/Header header
uint32 height
uint32 width
string encoding
uint8 is_bigendian
uint32 step
uint8[] data

13.1.5 运行底盘的urdf模型

urdf模型描述了机器人底盘的形状、传感器之间的安装关系、各个传感器在tf 树中的关系。其实“xiihoo机器人”底盘的urdf模型主要是提供各个传感器在tf 树中的静态关系,这些静态tf关系将在SLAM和导航算法中被使用。如图13-3为xiihoo机器人底盘中传感器的安装示意图,其中base_footprint为里程计坐标系中心,base_laser_link为激光雷达坐标系中心,imu_link为IMU模块坐标系中心,这些坐标系均为标准右手系。

图13-3  传感器之间的tf关系

以base_footprint为父坐标系,建立base_footprint->base_laser_link的转换关系与base_footprint->imu_link的转换关系,就实现了各个传感器tf关系的构建。构建的具体实现在xiihoo_description/urdf/xiihoo.urdf中完成,其中xiihoo.urdf描述文件的具体内容如下。

<robot name="xiihoo">
  <material name="orange">
    <color rgba="1.0 0.5 0.2 1" />
  </material>
  <material name="gray">
    <color rgba="0.2 0.2 0.2 1" />
  </material>

  <link name="base_footprint"/>

  <!-- base_link -->
  <link name="base_link"/>
  <joint name="base_link_joint" type="fixed">
    <parent link="base_footprint" />
    <child link="base_link" />
    <origin xyz="0 0 0.065" rpy="0 0 0.0" />
  </joint>

  <!-- laser -->
  <link name="base_laser_link"/>
  <joint name="base_laser_link_joint" type="fixed">
    <origin xyz="0.08 0.00 0.065" rpy="0 0 0.0" />
    <parent link="base_footprint" />
    <child link="base_laser_link" />
  </joint>

  <!-- imu -->
  <link name="imu_link"/>
  <joint name="imu_link_joint" type="fixed">
    <origin xyz="-0.035 0.00 0.065" rpy="0 0 0" />
    <parent link="base_footprint" />
    <child link="imu_link" />
  </joint>
</robot>

最后,用下面的命令启动底盘的urdf模型,这些传感器之间的tf关系就被发布到tf树了,通过订阅/tf就能获取所需的转换关系。

#启动urdf模型
roslaunch xiihoo_description xiihoo_description.launch

13.1.6 传感器一键启动

为了操作方便,可以将要启动的传感器都写入xiihoo_all_sensor.launch这个启动文件,通过这个启动文件就能一键启动机器人的底盘ROS驱动、激光雷达ROS驱动、IMU的ROS驱动、相机的ROS驱动以及底盘的urdf模型,一键启动文件xiihoo_all_sensor.launch的内容如下。

<launch>
  <!-- xiihoo bring up -->
  <include file="$(find xiihoo_bringup)/launch/minimal.launch"/>

  <!-- launch laser -->
  <include file="$(find ydlidar)/launch/my_x4.launch" />

  <!-- launch imu -->
  <include file="$(find xiihoo_imu)/launch/imu.launch" />

  <!-- robot model -->
  <include file="$(find xiihoo_description)/launch/xiihoo_description.launch"/>
</launch>

以后在运行SLAM和导航时,就可以通过一键启动文件xiihoo_all_sensor.launch很方便地启动机器人平台相关的节点了。

#一键启动
roslaunch xiihoo_bringup xiihoo_all_sensor.launch

源码仓库

  • Github下载:github.com/xiihoo/Books_Robot_SLAM_Navigation

  • Gitee下载(国内访问速度快):gitee.com/xiihoo-robot/Books_Robot_SLAM_Navigation

参考文献

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

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

一起自学SLAM算法:13.1 运行机器人上的传感器 的相关文章

  • 三维刚体变换

    欢迎访问我的博客首页 三维刚体变换 1 坐标系 1 1 空间坐标系 1 2 右手坐标系与像素坐标系 2 旋转与平移 2 1 推导旋转 2 2 推导平移 2 3 推导变换 2 4 刚体变换 2 5 坐标系旋转与向量旋转 3 链式变换 4 Ei
  • 微信小程序SLAM AR零基础入门教程

    鬼灭之刃花街篇 开播在即 今天带大家零基础使用Kivicube制作一个炭治郎的SLAM AR云手办 可以通过微信小程序将AR版的炭治郎放置在家中 提前感受鬼灭的氛围 先上个GIF大家看看动态的展示效果 在这里先科普一下本次教程使用到的AR技
  • ubuntu系统下配置vscode编译cmake

    文章目录 一 配置vs code运行c 代码 三个关键文件介绍 1 tasks json run helloworld cpp 1 1 打开cpp文件 使其成为活动文件 1 2 按编辑器右上角的播放按钮 1 3生成task文件 1 4 此时
  • ROS激光SLAM导航理解

    ROS激光SLAM导航理解 注 最近学习ROS的激光导航知识 需要理清ROS的SLAM 环境感知 costmap 与导航算法 为防止自己忘记 将觉得有价值的内容收集于此 对AGV来说 SLAM是个大大坑 环境感知和局部运动控制也是大坑 学习
  • Ubuntu18.04 安装速腾聚创最新驱动RSLidar_SDK采集XYZIRT格式的激光点云数据 --SLAM不学无术小问题

    Ubuntu18 04 安装速腾聚创最新驱动RSLidar SDK采集XYZIRT格式的激光点云数据 新款驱动支持RS16 RS32 RSBP RS128 RS80 RSM1 B3 RSHELIOS等型号 注意 该教程旨在引导安装 可能现在
  • ORB_SLAM3复现——上篇

    ORB SLAM3 前言 1 ORB SLAM3 2 准备环境 2 1 C 11 Compiler 2 2 Pangolin 2 3 Opencv 2 4 Eigen 3 复现ORB SLAM3 3 1 下载代码 3 2 执行build s
  • 【SLAM】卡尔曼滤波(Kalman Filter)

    卡尔曼滤波 Kalman filter 一种利用线性系统状态方程 通过系统输入输出观测数据 对系统状态进行最优估计的算法 由于观测数据中包括系统中的噪声和干扰的影响 所以最优估计也可看作是滤波过程 卡尔曼滤波器的原理解释如下 首先 我们先要
  • 速腾聚创雷达最新驱动安装(包含ring和timestamp)运行lio-sam

    记录一下搞slam的过程 ring和timestamp 最近想跑lio sam 需要用到ring和timestamp两个参数 lio sam作者用的velodyne雷达是带这两个参数的 但是rs雷达的老版驱动录制的点云包没有这两个参数 在g
  • Sophus使用记录

    sophus库是一个基于Eigen的C 李群李代数库 可以用来方便地进行李群李代数的运算 头文件 主要用到以下两个头文件 include
  • 视觉SLAM实践入门——(20)视觉里程计之直接法

    多层直接法的过程 1 读图 随机取点并计算深度 2 创建图像金字塔 相机内参也需要缩放 并计算对应点的像素坐标 3 应用单层直接法 使用G N L M等方法 或者使用g2o ceres库 进行优化 源码中有一些地方会引起段错误 修改方法见下
  • 对最小二乘法的一点理解 - slam学习笔记

    我对最小二乘法的理解 在给定参数个数和函数模型之后 根据测试数据 找出与所有测试数据的偏差的平方和最小的参数 这里面应该有两个问题 1 为什么选取与真实数据平方和最小的拟合函数 2 如何求参数 为什么选取与真实数据平方和最小的拟合函数 极大
  • 单目视觉里程记代码

    在Github上发现了一个简单的单目vo 有接近500星 链接如下 https github com avisingh599 mono vo 这个单目里程计主要依靠opencv实现 提取fast角点并进行光流跟踪 然后求取本质矩阵并恢复两帧
  • Sophus安装踩坑

    装SLAM十四讲第二版提供的Sophus Eigen版本3 4 0 报错 home ch 下载 Sophus 13fb3288311485dc94e3226b69c9b59cd06ff94e test core test so2 cpp 9
  • 互转(经纬度、地心坐标、东北天坐标)

    Part1三种坐标系介绍 经纬度坐标 假设空间某点P 用经纬度表示的话 你们B代表纬度 L代表经度 H代表大地高 纬度B P点沿着地球法线方向与赤道面的夹角 向北为正称为北纬 0 90 向南为负称为南纬 0 90 实际表示可以用 90 90
  • SLAM--三角测量SVD分解法、最小二乘法及R t矩阵的判断

    目录 一 三角测量 方法一 SVD分解法的推导 方法二 最小二乘法求解 二 ORB SLAM2 三角测量源码 三 利用Eigen源码实现三角测量 方法一 SVD分解法 方法二 最小二乘法求解 速度最快 方法三 利用OpenCV自带函数 四
  • 快看!那个学vSLAM的上吊了! —— (一)综述

    不同于之前发布的文章 我将使用一种全新的方式 iPad Notability Blog的方式打开这个板块的大门 原因有两个 1 Notability更方便手写长公式 也方便手绘坐标系变换等等 2 之前Apple Pencil找不到了新破费买
  • LeGO-LOAM中的数学公式推导

    LeGO LOAM是一种在LOAM之上进行改进的激光雷达建图方法 建图效果比LOAM要好 但是建图较为稀疏 计算量也更小了 本文原地址 wykxwyc的博客 github注释后LeGO LOAM源码 LeGO LOAM NOTED 关于代码
  • Eigen几何模块的使用方法

    include
  • ORB_SLAM2运行官方数据集/自己数据集

    官方数据集运行结果 WeChat 20230210194425 可以正常运行 自己数据集运行结果 自己的数据集 主要是用手机摄像头采集的实验室进行了一下简单的运行 可以成功运行 但是由于查看的相关程序的是死循环不能像运行官方数据集那样完整保
  • KITTI校准文件中参数的格式

    我从以下位置访问了校准文件KITTI 的部分里程计 http www cvlibs net datasets kitti eval odometry php 其中一个校准文件的内容如下 P0 7 188560000000e 02 0 000

随机推荐

  • Vmware虚拟机Ubuntu的ssh远程登陆--笔记

    SSH远程登录 apt更新网路更新ssh配置了解的部分 SecureCRTPortable登陆 apt更新 版本号 xff1a Ubuntu 16 04 环境 xff1a Vmware 17 2 网路 首先 xff0c 先检查网络是否畅通
  • Docker的常用命令

    一 Docker中几个重要的概念 镜像 和容器 是docker中两个非常重要的 概念 镜像 xff08 Image xff09 xff1a Docker 将应用程序及其所需的依赖 函数库 环境 配置等文件打包在一起 xff0c 称为镜像 容
  • Linux-C语言编写-UDP服务器客户端通信流程简介(代码)

    目录 一 xff0c 服务器 1 创建数据报套接字 2 填充结构体 3 绑定服务器的ip和端口 4 接收来自客户端的消息 recvfrom 5 关闭套接字 6 详细代码 二 xff0c 客户端 1 创建数据报套接字 2 填充结构体 xff0
  • C++三阶贝塞尔曲线

    文章目录 1 贝塞尔曲线2 示意图3 c 43 43 代码实现 1 贝塞尔曲线 贝塞尔曲线阶数等于控制点个数n 1将控制点首尾相连并且取每段连线上一点P xff0c 再将每个线段上的P点连接设第一个控制点为P1 xff0c 第二个为P2 x
  • Ubuntu 图达通激光雷达可视化/获取点云

    文章目录 0 ILA 平台网页预览1 Ubuntu的安装2 安装Ubuntu对应版本ros3 激光雷达接线4 解压SDK文件5 启动ros可视化点云6 录制点云7 播放录制文件8 rosbag文件 gt pcd文件 0 ILA 平台网页预览
  • Python的while循环

    目录 一 计数器 二 while循环使用 三 不同循环的使用环境判断 xff1a 四 while循环使用break和continue 五 while的嵌套使用 一 计数器 计数器 xff0c 是一个叫法 xff0c 代表的是一个功能 用于记
  • 字符串结束符

    在C语言中 xff0c 存储一个字符串通常用一个char 数组 在C语言中 xff0c 为了方便存储 xff0c 要求在最后一个字符的后面存储一个0 xff08 一个字节 xff09 这个0称为 字符串结束符 xff0c 常用 0 表示 在
  • 一起自学SLAM算法:1.1 ROS简介

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:1.2 ROS开发环境搭建

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 戴尔电脑恢复系统后,D盘被加密Bitlocker,要求输入48位密钥,才能打开D盘---解决过程

    一 前言 今天DELL电脑恢复系统后 xff0c D盘被加密 xff08 D盘图标上有一把黄色的锁 xff09 xff0c 鼠标双击准备打开D盘 xff0c 提示了一个密钥ID xff0c 让输入48位码解密 xff0c 被microsof
  • 一起自学SLAM算法:1.4 ROS调试工具

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:1.5 ROS节点通信

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 1 1 ROS简介 1 2 ROS开发环境搭建 1 3 ROS系统架构 1 4 ROS调试工具 1 5 ROS节点通信 1 6 ROS其
  • 一起自学SLAM算法:3.4 图像特征点提取

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 3 1 认识图像数据 3 2 图像滤波 3 3 图像变换 3 4 图像特
  • 一起自学SLAM算法:第4章-机器人传感器

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 4 1 惯性测量单元 4 2 激光雷达 4 3 相
  • 一起自学SLAM算法:5.4 ARM主机Jetson-tx2

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 5 1 X86与ARM主机对比
  • 一起自学SLAM算法:6.1 底盘运动学模型

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 6 1 底
  • 一起自学SLAM算法:7.5 基于因子图的状态估计

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:10.2 VINS算法

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:12.3 autoware导航系统

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S
  • 一起自学SLAM算法:13.1 运行机器人上的传感器

    连载文章 xff0c 长期更新 xff0c 欢迎关注 xff1a 写在前面 第1章 ROS入门必备知识 第2章 C 43 43 编程范式 第3章 OpenCV图像处理 第4章 机器人传感器 第5章 机器人主机 第6章 机器人底盘 第7章 S