第 8 章 机器人平台设计之传感器(自学二刷笔记)

重要参考:

课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ

讲义链接:Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

 

8.6.1 传感器_激光雷达简介

激光雷达是现今机器人尤其是无人车领域及最重要、最关键也是最常见的传感器之一,是机器人感知外界的一种重要手段。

概念

激光雷达(LiDAR),英文全称为:Light Detection And Ranging,即光探测与测量。

原理

激光雷达可以发射激光束,光束照射到物体上,再反射回激光雷达,可以通过三角法测距或TOF测距计算出激光雷达与物体的距离。甚至也可以通过测量反射回来的信号中的某些特性而确定物体特征,比如:物体的材质。

注意:如果物体表面光滑(比如镜子),光束照射后产生镜面反射,可能无法捕获返回的激光而出现识别失误的情况。

优点

激光雷达在测距方面精准(激光雷达的测量精度可达厘米级)、高效,是机器人测距的不二之选。

  • 具有极高的分辨率:激光雷达工作于光学波段,频率比微波高2~3个数量级以上,因此,与微波雷达相比,激光雷达具有极高的距离分辨率、角分辨率和速度分辨率;

  • 抗干扰能力强:激光波长短,可发射发散角非常小(μrad量级)的激光束,多路径效应小(不会形成定向发射与微波或者毫米波产生多路径效应),可探测低空/超低空目标;

  • 获取的信息量丰富:可直接获取目标的距离、角度、反射强度、速度等信息,生成目标多维度图像;

  • 可全天时工作:激光主动探测,不依赖于外界光照条件或目标本身的辐射特性。它只需发射自己的激光束,通过探测发射激光束的回波信号来获取目标信息。

缺点

激光雷达虽然优点多多,但也存在一些局限性:

  • 成本:居高不下
  • 环境:易受天气影响(大雾、雨天、烟尘)
  • 属性识别能力弱:激光雷达的点云数据是物体的几何外形呈现,无法如同人类视觉一样,分辨物体的物理特征,比如:颜色、纹理...
分类

根据线束数量的多少,激光雷达可分为单线束激光雷达与多线束(4线、8线、16线、32线、64线)激光雷达。单线激光雷达扫描一次只产生一条扫描线, 其所获得的数据为2D数据,因此无法区别有关目标物体的3D信息。多线束激光雷达就是将多个横向扫描结果纵向叠加,从而获得3D数据,当然,线束越多,纵向的垂直视野角度越大。

 

8.6.2 传感器_雷达使用

思岚A1激光雷达(下图)是一款性价比较高的单线激光雷达。

使用流程如下:

  1. 硬件准备;
  2. 软件安装;
  3. 启动并测试。
1.硬件准备
1.雷达连接上位机

当前直接连接树莓派即可,如果连接的是虚拟机,注意VirtualBox或VMware的相关设置。

2.确认当前的 USB 转串口终端并修改权限

USB查看命令:

ll /dev/ttyUSB*

授权(将当前用户添加进dialout组,与arduino类似):

sudo usermod -a -G dialout your_user_name

不要忘记重启,重启之后才可以生效。

2.软件安装

进入工作空间的src目录,下载相关雷达驱动包,下载命令如下:

git clone https://github.com/slamtec/rplidar_ros

返回工作空间,调用 catkin_make 编译,并 source ./devel/setup.bash ,为端口设置别名(将端口 ttyUSBX 映射到 rplidar):

cd src/rplidar_ros/scripts/
./create_udev_rules.sh
3.启动并测试
1.rplidar.launch文件准备

首先确认端口,编辑 rplidar.launch 文件

<launch>
  <node name="rplidarNode"          pkg="rplidar_ros"  type="rplidarNode" output="screen">
  <param name="serial_port"         type="string" value="/dev/rplidar"/>
  <param name="serial_baudrate"     type="int"    value="115200"/><!--A1/A2 -->
  <!--param name="serial_baudrate"     type="int"    value="256000"--><!--A3 -->
  <param name="frame_id"            type="string" value="laser"/>
  <param name="inverted"            type="bool"   value="false"/>
  <param name="angle_compensate"    type="bool"   value="true"/>
  </node>
</launch>

frame_id 也可以修改,当使用URDF显示机器人模型时,需要与 URDF 中雷达 id 一致

2.终端中执行 launch 文件

终端工作空间下输入命令:

roslaunch rplidar_ros rplidar.launch

如果异常,雷达开始旋转

3.rviz中订阅雷达相关消息

启动 rviz,添加 LaserScan 插件:

注意: Fixed Frame 设置需要参考 rplidar.launch 中设置的 frame_id,Topic 一般设置为 /scan,Size 可以自由调整。

 

8.6.3 传感器_相机简介

相机是机器人系统中另一比较重要的传感器,与雷达类似的,相机也是机器人感知外界环境的重要手段之一,并且随着机器视觉、无人驾驶等技术的兴起,相机在物体识别、行为识别、SLAM中等都有着广泛的应用。

根据工作原理的差异可以将相机大致划分成三类:单目相机、双目相机与深度相机。

1.单目相机

单目相机是将三维世界二维化,它是将拍摄场景在相机的成像平面上留下一个投影,静止状态下是无法通过单目相机确定深度信息。向如下动图展示的一样,在二维图形中,甚至不能根据图片中物体的大小来判断物体距离。

2.双目相机

识破上面的“骗局”只需要移动单目相机,再换一个角度拍摄一张照片即可,当角度切换后,可以将两张照片组合还原为一个立体的三维世界。

双目相机的原理也是如此,双目相机是由两个单目相机组成的,即便在静止状态下,也可以生成两张图片,两个单目相机之间存在一定的距离也称之为基线,通过这个基线以及两个单目项目分别生成的图片,可以来估算每个象素的空间位置。

3.深度相机

深度相机也称之为RGB-D相机,顾名思义,深度相机也可以用于获取物体深度信息。深度相机一般基于结构光或ToF(Time-of-Flight)原理实现测距。

前者是通过近红外激光器,将具有一定结构特征的光线投射到被拍摄物体上,再由专门的红外摄像头进行采集。光线照射到不同深度的物体上时,会采集到不同的图像相位信息,然后通过运算单元将这种结构的变化换算成深度信息,后者实现则类似于激光雷达,也是根据光线的往返时间来计算深度信息。

8.6.4 传感器_相机使用

使用流程如下:

  1. 硬件准备;
  2. 软件安装;
  3. 启动并测试。
1.硬件准备

当前直接连接树莓派即可,如果连接的是虚拟机,注意VirtualBox或VMware的相关设置。

2.软件准备

安装USB摄像头软件包,命令如下:

sudo apt-get install ros-ROS版本-usb-cam

或者也可以从 github 直接下载源码:

git clone https://github.com/ros-drivers/usb_cam.git
3.测试
1.launch文件准备

在软件包中内置了测试用的launch文件,内容如下:

<launch>
  <node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
    <param name="video_device" value="/dev/video0" />
    <param name="image_width" value="640" />
    <param name="image_height" value="480" />
    <param name="pixel_format" value="yuyv" />
    <param name="camera_frame_id" value="usb_cam" />
    <param name="io_method" value="mmap"/>
  </node>
  <node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
    <remap from="image" to="/usb_cam/image_raw"/>
    <param name="autosize" value="true" />
  </node>
</launch>

节点 usb_cam 用于启动相机,节点 image_view 以图形化窗口的方式显示图像数据,需要查看相机的端口并修改 usb_cam 中的 video_device 参数,并且如果将摄像头连接到了树莓派,且通过 ssh 远程访问树莓派的话,需要注释 image_view 节点,因为在终端中无法显示图形化界面。

2.启动launch文件
roslaunch usb_cam usb_cam-test.launch
3.rviz显示

启动 rviz,添加 Image 插件:

 

8.6.5 传感器_集成

之前已经分别介绍了底盘、雷达、相机等相关节点的安装、配置以及使用,不过之前的实现还存在一些问题:

1.机器人启动时,需要逐一启动底盘控制、相机与激光雷达,操作冗余;

2.如果只是简单的启动这些节点,那么在 rviz 中显示时,会发现出现了TF转换异常,比如参考坐标系设置为odom时,雷达信息显示失败。

本节将介绍如何把传感器(激光雷达与相机)集成以解决上述问题,所谓集成主要是优化底盘、雷达、相机相关节点的启动并通过坐标变换实现机器人底盘与里程计、雷达和相机的关联,实现步骤如下:

  1. 编写用于集成的 launch 文件;
  2. 发布TF坐标变换;
  3. 启动并测试。
1.launch文件

新建功能包:

catkin_create_pkg mycar_start roscpp rospy std_msgs ros_arduino_python usb_cam rplidar_ros

功能包下创建launch文件夹,launch文件夹中新建launch文件,文件名自定义。

内容如下:

<!-- 机器人启动文件:
        1.启动底盘
        2.启动激光雷达
        3.启动摄像头
 -->
<launch>
        <include file="$(find ros_arduino_python)/launch/arduino.launch" />
        <include file="$(find usb_cam)/launch/usb_cam-test.launch" />
        <include file="$(find rplidar_ros)/launch/rplidar.launch" />
</launch>
2.坐标变换

如果启动时加载了机器人模型,且模型中设置的坐标系名称与机器人实体中设置的坐标系一致,那么可以不再添加坐标变换,因为机器人模型可以发布坐标变换信息,如果没有启动机器人模型,就需要自定义坐标变换实现了,继续新建launch文件。

内容如下:

<!-- 机器人启动文件:
        当不包含机器人模型时,需要发布坐标变换
 -->

<launch>
    <include file="$(find mycar_start)/launch/start.launch" />    
    <node name="camera2basefootprint" pkg="tf2_ros" type="static_transform_publisher" args="0.08 0 0.1 0 0 0 /base_footprint /camera_link"/>
    <node name="rplidar2basefootprint" pkg="tf2_ros" type="static_transform_publisher" args="0 0 0.1 0 0 0 /base_footprint /laser"/>
</launch>
3.测试

最后,就可以启动PC端与树莓派端相关节点并运行查看结果了:

1.树莓派

直接执行上一步的机器人启动launch文件:

roslaunch 自定义包 自定义launch文件
2.PC端

启动键盘控制节点:

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

还需要启动rviz:

rviz
3.结果显示

在rviz中添加laserscan、image等插件,并通过键盘控制机器人运动,查看rviz中的显示结果:

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/654766.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

转型先锋!G7易流的数字化到底有多牛?

在供应链全球一体化进程中&#xff0c;国内外局势的改变&#xff0c;使得物流行业运力供大于求趋势愈加明显&#xff0c;国内供应链参与者面对内外发展需求和激烈的市场竞争&#xff0c;需要打破同质化竞争的局面&#xff0c;提供具有特色的服务&#xff0c;形成专业、高效、灵…

Hexo最新实战:(一)Hexo7.0+GitHub Pages博客搭建

前言 很多平台都能写博客还有创作激励&#xff0c;为什么我又要搭一个&#xff1f;为什么这次要选择用Hexo框架&#xff1f; 对应的原因是流量自由和省钱&#xff0c;第一个&#xff0c;很多平台能写但不是都有收益&#xff0c;而且平台有自身的规则&#xff0c;比如会屏蔽一…

2024第三届AIGC开发者大会圆桌论坛:AI Agent中国落地发展现状及多模态结合具身智能的发展展望

在2024年第三届AIGC开发者大会上&#xff0c;多位业内专家齐聚一堂&#xff0c;共同探讨了AI Agent在中国的落地发展现状以及多模态结合具身智能的发展前景。本次圆桌论坛的嘉宾包括&#xff1a; Fast JP作者于金龙Agent创始人莫西莫必胜作者秦瑞January Agent创始人李晨 多模…

C++编程函数中switch实例用法

switch语法 switch (func_cb.sta) switch后续跟随多个成对的case和break&#xff0c;分别包含if/endif判断语句 每个 case 后跟一个要比较的值和一个冒号&#xff0c;当被测试的变量等于 case 中的常量时&#xff0c;case下一行的语句将被执行 switch 语句可以嵌套。 嵌套时&am…

爬虫逆向实例小记——某数据知识管理网站-DES-ECB模式

aHR0cHM6Ly9rZC5uc2ZjLmNuL2ZpbmFsUHJvamVjdEluaXQ 注意&#xff1a;本文是逆向部分比较少&#xff0c;主要为了流程走通&#xff0c;限于代码搬运工。 第一步:分析页面 此网站经过请求响应&#xff0c;可以看出响应内容为加密内容。 第二步&#xff1a;判断加密类型 在XHR …

【Linux】解决误操作libc.so.6导致的问题,补充:升级glibc注意事项

千万不要轻易动/usr/lib64/libc.so.6。 glibc是Linux系统中最底层的api&#xff0c;Linux几乎所有运行库都依赖glibc。/usr/lib64/libc.so.6属于glibc&#xff0c;在centos7中是个软链接。 一旦误删或误操作libc.so.6&#xff0c;或者glibc新版本不兼容等原因&#xff0c;都可…

c++编程(13)——vector的模拟实现

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 前言vector的模拟实现vector的成员对象插入、删除、扩容访问vector元素构造函数 填坑&#xff1a;为什么拷贝vector类元素的时候不能用浅拷贝末尾源代码&#xff1a; 前言 博主目前的水平还不能很明确的描述…

CV之Nougat:Nougat(一种基于神经网络实现OCR功能的视觉转换器模型)的简介、安装和使用方法、案例应用之详细攻略

CV之Nougat&#xff1a;Nougat(一种基于神经网络实现OCR功能的视觉转换器模型)的简介、安装和使用方法、案例应用之详细攻略 目录 相关论文 《Nougat: Neural Optical Understanding for Academic Documents》的翻译与解读 Nougat的简介 Nougat的安装和使用方法 1、安装 …

短视频拍摄方式有哪些:四川鑫悦里文化传媒有限公司

​短视频拍摄方式有哪些 在数字化时代&#xff0c;短视频以其短小精悍、传播迅速的特点&#xff0c;成为了人们表达自我、分享生活的重要工具。然而&#xff0c;想要制作出引人入胜的短视频&#xff0c;除了创意和构思&#xff0c;拍摄方式的选择也至关重要。四川鑫悦里文化传…

JavaEE:Servlet创建和使用及生命周期介绍

目录 ▐ Servlet概述 ▐ Servlet的创建和使用 ▐ Servlet中方法介绍 ▐ Servlet的生命周期 ▐ Servlet概述 • Servlet是Server Applet的简称&#xff0c;意思是 用Java编写的服务器端的程序&#xff0c;Servlet被部署在服务器中&#xff0c;而服务器负责管理并调用Servle…

香橙派KunpengPro测评之使用C语言操控40pin引脚

香橙派KunpengPro测评之使用C语言操控40pin引脚 香橙派KunpengPro介绍香橙派实物图香橙派登录界面香橙派KunpengPro的登录界面香橙派KunpengPro的原始桌面香橙派KunpengPro内安装了VScode等软件香橙派KunpengPro的终端 香橙派硬件参数核心性能图形与显示接口丰富性扩展与兼容性…

2024年中国金融行业网络安全研究报告

网络安全一直是国家安全的核心组成部分&#xff0c;特别是在金融行业&#xff0c;金融机构拥有大量的敏感数据&#xff0c;包括个人信息、交易记录、财务报告等&#xff0c;这些数据的安全直接关系到消费者的利益和金融市场的稳定&#xff0c;因此金融行业在网络安全建设领域一…

短道速滑短视频:四川京之华锦信息技术公司

短道速滑短视频&#xff1a;冰雪激情的视觉盛宴 随着冬奥会的热度不断攀升&#xff0c;短道速滑作为其中一项紧张刺激、充满观赏性的运动&#xff0c;受到了越来越多人的关注。而在社交媒体和短视频平台的助力下&#xff0c;短道速滑短视频成为了人们了解、欣赏这项运动的新窗…

MPLS原理与配置

1.MPLS概述 &#xff08;1&#xff09;传统IP路由转发 &#xff08;2&#xff09;MPLS基本概念 ⦁ MPLS起源于IPv4&#xff08;Internet Protocol version 4&#xff09;&#xff0c;其核心技术可扩展到多种网络协议&#xff0c;包括IPv6&#xff08;Internet Protocol ver…

LFSR线性反馈移位寄存器及Verilog实现

一、LFSR LFSR线性反馈移位寄存器&#xff0c;通常由移位寄存器和异或门组成&#xff0c;主要用于产生伪随机序列等。 线性反馈的含义是各个寄存器的输出通过一个反馈函数连接到第一级触发器的输入&#xff1b;LFSR中的寄存器的个数被称为LFSR的级数。 LFSR分为两类&#xff…

【机器学习】K-近邻算法(KNN)全面解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 K-近邻算法&#xff08;KNN&#xff09;全面解析概述1. 基本概念与原理1.1 KNN算…

【Vue学习记录】如何通过Vue-cli创建并启动一个项目}}}}}}

1.安装node.js 略 2.安装npm.js 略 3.安装Vue 略 4.安装Vue.cli 略 步骤1-4 参考&#xff1a; 最详细的vue安装教程 5.在Vue.cli里创建一个新项目 略 6.启动这个新项目 略 步骤5-6 参考&#xff1a; 五分钟教你使用vue-cli3创建项目&#xff08;三种创建方式&#…

卢文岩博士受邀参与中国科学院大学校友论坛 解码DPU核心价值

近日&#xff0c;第五届中国科学院大学校友创新论坛正式举行&#xff0c;本次论坛聚焦科技前沿领域&#xff0c;旨在搭建高端对话平台&#xff0c;促进产学研深度融合。在大算力时代——AI技术前沿沙龙上&#xff0c;中科驭数高级副总裁、CTO卢文岩博士受邀分享《DPU——连接算…

【马蹄集】— 百度之星 2023

BD202301公园 可以先 b f s bfs bfs统计一下 t , f t,f t,f到达每个点的距离&#xff0c;还有 n n n到达其他点的距离即其他点到达 n n n的距离 然后枚举每个点 直接计算得到最小值即可 注意特判有人无法到达 n n n的情况 code: #include<bits/stdc.h> #define endl \n…

MaxKB,基于 LLM 大语言模型的知识库问答系统,开箱即用,支持快速嵌入到第三方业务系统。

MaxKB 是一款基于 LLM 大语言模型的知识库问答系统。MaxKB Max Knowledge Base&#xff0c;旨在成为企业的最强大脑。开箱即用&#xff0c;支持快速嵌入到第三方业务系统。 项目链接 github.com/1Panel-dev/MaxKB 项目介绍 MaxKB 是一款基于 LLM 大语言模型的知识库问答系统…