实验二 读取和理解激光雷达数据

2023-05-16

1. 体验内容

(1)为rplidar添加USB权限

注:实验室的rplidar A2买得比较早,硬件版本可能与github程序不匹配,出现运行错误,解决方法为到 Windows 环境登录思岚科技官网下载rplidar A2的固件升级程序,连接激光雷达进行固件升级。

将激光雷达连接到电脑上,检查识别到的USB设备

ls -l /dev|grep ttyUSB

若没有出现如下图所示的“rplidar”字样,说明需要添加USB的默认识别权限,遵循接下来的教程进行操作。

sudo gedit /etc/udev/rules.d/rapliar.rules

输入密码打开文件进行编辑,添加以下内容

KERNEL=="ttyUSB*", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", MODE:="0666", GROUP:="dialout",  SYMLINK+="rplidar"

在终端输入指令,增加当前用户对串口的默认访问权限:

sudo usermod -a -G dialout <你的用户名>

使UDEV配置生效(使串口的默认访问权限生效,需要重启机器)

sudo service udev reload
sudo service udev restart

重新插拔激光雷达,再次输入指令

ls -l /dev|grep ttyUSB

此时显示出了“rplidar”字样,以“rplidar→ttyUSB1”为例,输入以下指令赋予权限。

sudo chmod 666 /dev/ttyUSB1

参考博客: https://blog.csdn.net/KEVINZHAO124517/article/details/102137333

(2)下载rplidar_ros进行编译

创建工作空间,进入其src文件夹

git clone https://github.com/Slamtec/rplidar_ros.git
cd ..
catkin_make

(3)设置自动映射rplidar端口

更改程序代码中的映射端口号,打开rplidar.launchnode.cpp搜索/dev/ttyUSB0,将数字改为你前面知晓的连接端口号。

(4)执行程序

直接运行view_rplidar.launch文件,其中已经包含对激光雷达的启动。

roslaunch rplidar_ros view_rplidar.launch

可以通过调用rplidar提供的服务/start_motor/stop_motor来启动和停止激光雷达,然后通过rviz观看激光雷达数据,注意将Fixed Frame改为laser

(5)激光雷达数据结构

rosmsg info sensor_msgs/LaserScan

返回激光雷达数据结构

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
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

2. 作业内容

(1)ros编程

只提取雷达数据前方180°的数据,生成一个新的topic:scan_half。
实现这件事需要同时使用到话题的订阅和发布,在rplidar_ros/src中创建scan_half.cpp文件

#include <ros/ros.h>
#include <iostream>
#include <std_msgs/Float32.h>
#include <sensor_msgs/LaserScan.h>

using namespace std;

class Laser
{
public:
	Laser(ros::NodeHandle& n);
	
private:
	ros::NodeHandle n_;
	ros::Subscriber laser_sub_;
	ros::Publisher laser_pub_;
	
	void get_laser_callback(const sensor_msgs::LaserScan &laser);
};

Laser::Laser(ros::NodeHandle& n)
{
	n_ = n;
	laser_pub_ = n_.advertise<std_msgs::Float32>("scan_half",1000);
	laser_sub_ = n_.subscribe("/scan", 10, &Laser::get_laser_callback, this);
}


void Laser::get_laser_callback(const sensor_msgs::LaserScan &laser)
{
	int index = int(laser.ranges.size()/2)-1;
	std_msgs::Float32 msg;
	msg.data = laser.ranges[index];
	laser_pub_.publish(msg);
	cout << "ROS激光雷达180°数据(正前方)" << laser.ranges[index] << endl;
    cout <<"------------------------------------------------------" << endl;
}

int main(int argc, char **argv)
{
	ros::init(argc,argv,"laser_half_scan");
	ros::NodeHandle n;
	Laser laser1(n);
	ros::spin();
	return 0;
}

CMakeList.txt里添加

add_executable(scan_half src/scan_half.cpp ${RPLIDAR_SDK_SRC})
target_link_libraries(scan_half ${catkin_LIBRARIES})

在工作空间使用catkin_make进行编译。
现在可以运行

rosrun rplidar_ros scan_half

查看正在发布的/scan_half话题

rostopic echo /scan_half

如果不显示,检查一下你的激光雷达是否正在工作。

(2)熟悉TF

利用ROS的TF坐标变换系统,给定激光雷达和机器人底盘的坐标关系,求激光雷达数据转换到底盘坐标系后的读数。

ROS的tf系统分为静态和动态,题目所要求的坐标转换使用静态即可,采用右手坐标系,指定向右为y轴正向,垂直纸面向外为x轴正向,在rplidar.launch中添加如下代码实现坐标关系的定义

<node pkg="tf" type="static_transform_publisher" name="base_to_laser" args="0.0  0.1  0.2  0.0  0.0  1.0  0.0 base_link laser 100"/>

可以使用如下指令查看tf消息的相关信息

# 查看TF树
rosrun rqt_tf_tree rqt_tf_tree
# 监控坐标系数据的发布及来源节点
rosrun tf tf_monitor
# 生成坐标树的pdf
rosrun tf view_frames
# 监控指定坐标系间变换关系,类似与rostopic echo
rosrun tf tf_echo base_link pole_top_1_link

使用rostopic info查看话题/tf/tf_static的消息类型是tf2_msgs/TFMessage,接着使用rosmsg info tf2_msgs/TFMessage查看消息的具体数据类型

geometry_msgs/TransformStamped[] transforms
  std_msgs/Header header
    uint32 seq
    time stamp   # 时间戳
    string frame_id    # 坐标系名称
  string child_frame_id     # 子坐标系名称
  geometry_msgs/Transform transform
    geometry_msgs/Vector3 translation   # 偏移量
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion rotation   # 四元数表示旋转量
      float64 x
      float64 y
      float64 z
      float64 w

可以看到该数据类型是geometry_msgs/TransformStamped形成的数组,而后者主要由三个部分组成:headerchild_frame_idtransform

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

实验二 读取和理解激光雷达数据 的相关文章

  • Ardupilot IMU恒温控制代码学习

    目录 文章目录 目录 摘要 第一章原理图学习 第二章恒温代码学习 1 目标温度怎么设置 摘要 本节主要学习ardupilot的IMU恒温控制代码 采用的飞控是pixhawk v5 欢迎一起交流学习 第一章原理图学习
  • Windows10安装或重装ubuntu18.04双系统教程(平民教程)

    一 引言 1 电脑配置 操作系统 xff1a Win10专业版机型 xff1a Dell G3 15 3500显卡 xff1a NVIDIA GeForce GTX 1660Ti内存 xff1a 32G硬盘 xff1a 双硬盘 xff08
  • 不同国家的日期写法

    题目描述 对于年 月 日的写法 xff0c 不同的国家有不同的描述形式 请按年 月 日的顺序读入日期 xff0c 然后分别输出中国式写法 xff08 年 月 日 xff09 xff0c 英国式写法 xff08 日 月 年 xff09 和美国
  • 二维数组最大值及位置

    题目描述 有一个3 4的矩阵 xff0c 要求编程求出其中值最大的那个元素 xff0c 以及其所在的行号和列号 xff08 如果最大数有多个 xff0c 则显示第1个出现的数据的信息 xff09 输入要求 从键盘输入12个数字组成一个3 4
  • 比较两个字符串的大小

    题目描述 设计函数 xff0c 比较两个字符串的大小 每个字符串长度不超过50 输入要求 从键盘分别读入两个字符串 xff0c 每个字符串以换行符结束 输出要求 比较两个串的大小 xff0c 输出相应的结果 输入样例 Hello hi 输出
  • 心形曲线(java)

    心形曲线java简易表示法 span class token keyword import span span class token namespace java span class token punctuation span awt
  • c++运行不输出结果怎么办

    C C 43 43 运行不出结果怎么调试 main函数中可在各个地方插入return 0提前结束程序 xff0c 直到有结果出现 xff0c 问题就出在return 0的下方 如果在自定义函数内部 xff0c 则需要使用exit xff08
  • 如何解决VS2019控制台输出中文乱码问题

    情况一 xff1a 下载插件 xff0c 将VS的输出编码更改为UTF 8 情况二 xff1a 如果已经装了UTF 8插件但是控制台输出的中文仍然是乱码 则按以下步骤进行 xff08 1 xff09 打开电脑的控制面板 xff0c 然后打开
  • 如何解决vs2019 scanf报错问题

    1 在程序最前面加 xff1a define CRT SECURE NO DEPRECATE 2 在程序最前面加 xff1a pragma warning disable 4996 3 将scanf改为scanf s 4 无需在程序前面加那
  • 函数曲线的绘制

    初等函数曲线的简易绘制 span class token macro property span class token directive keyword include span span class token string lt s
  • 花里胡哨的IDEA 2021启动界面

    一 前言 作为一个花里胡哨的男人 xff0c 总是在不停的研究各种花里胡哨的东西 xff0c 每次上机第一件事 xff0c 肯定是打开开发神器 xff1a Intellij IDEA 2021 xff0c 每次打开都是一个图片 xff0c
  • java中常见排序算法

    一 冒泡排序 span class token comment 64 author liyong 64 date 2021年12月02日 23 33 span span class token keyword public span spa
  • linux下栈空间大小(ulimit)

    linux下栈空间大小 第一次写博客 xff0c 很多地方写的不好请多见谅 xff0c 希望这篇文章对大家有帮助 首先说下为什么会写linux下栈空间大小这个内容 在评审同事代码的时候发现代码中有两个函数互相调用 xff0c 且无法退出导致
  • 解决npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.

    解决办法 https github com npm cli issues 4980 issuecomment 1145334203 解决步骤 xff08 1 xff09 找到装 node js 路径下的 npm cmd xff08 2 xf
  • 1. 两数之和【return new int[]{i, j}、hashtable.containsKey()、get、put】

    1 两数之和 给定一个整数数组 nums 和一个整数目标值 target xff0c 请你在该数组中找出 和为目标值 target 的那 两个 整数 xff0c 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 xff0c 数
  • yarn的安装和使用(极其详细)

    一 yarn的简介 xff1a Yarn是facebook发布的一款取代npm的包管理工具 二 yarn的特点 xff1a 速度超快 Yarn 缓存了每个下载过的包 xff0c 所以再次使用时无需重复下载 同时利用并行下载以最大化资源 利用
  • Java构造方法(与类名相同的方法)、类方法、类变量、实例方法、实例变量

    目录 一 构造方法1 构造方法的特点 xff1a 2 构造方法分类3 构造方法的重载4 构造方法中的 this 二 类方法 类变量 实例方法 实例变量三 类方法 xff08 静态方法 xff0c 用static修饰的方法 xff09 四 类
  • WIFI接入之Authentication和Association流程梳理

    目录 1 Authentication 2 Association 3 总结 在Wifi与AP进行四次握手前 xff0c 需要进行Authentication xff08 认证 xff09 和Association xff08 关联 xff
  • VSCode 快捷键、快捷指令

    一 快捷键设置 xff08 1 xff09 切换块注释 xff1a 默认是 ctrl 43 alt 43 A xff08 2 xff09 切换行注释 xff1a 默认是 ctrl 43 添加键绑定 xff08 3 xff09 光标移到行尾
  • nodejs启动mqtt服务报错SchemaError: Expected `schema` to be an object or boolean问题解决

    一 问题描述 xff1a xff08 1 xff09 nodejs中使用mqtt服务 xff0c 运行命令node mqttserver js xff0c 发现报错 缺少mosca包 xff08 2 xff09 那就装一个 xff0c np

随机推荐