在ROS中串联TOF测距(笔记)

目录

1.TOF激光测距原理

2.TOFSense介绍

3.前期准备 

3.1 测试

3.2 修改id

4.配置环境

4.1 安装串口驱动

4.2 开启串口操作权限

 4.3 安装Serial Library

5.搭建ROS工作空间

5.1 新建工作空间并初始化

5.2 编译工作空间

5.3 设置并检查环境变量

5.4 获取nlink parser功能包

5.6 常见报错

5.7 测试

6.将Nooploop产品连接到ROS获取数据

6.1 运行launch文件的常见报错

6.2 使用echo命令查看产品数据

6.3 LinkTrack系列运行RVIZ节点


1.TOF激光测距原理

激光雷达根据原理可以分为TOF(飞行时间)三角法测距相位测距三种方式。

TOF为目前大多数的自动驾驶采用的雷达方案,通过发射脉冲激光,计算脉冲激光经过目标并反射回探测器的时间,即飞行时间(Time of Flight)。飞行时间等于脉冲数n和脉冲间隔t的乘积,距离就等于飞行时间和速度的乘积,如下面公式所示,f为脉冲频率。

L=\frac{1}{2}vt=\frac{c}{2f}n

这种方式简单直接,测距的精度不随距离增加而恶化,但是由于光速快,短距下对器件的响应时间要求高。

2.TOFSense介绍

本文使用的是Nooploop公司生产的TOFSense和TOFSense PS。

参数规格备注
型号TOFSenseTOFSense PS
尺寸:mm35.6*13.0*8.135.6*13.0*7.0长*宽*高
通信接口UART接口可同时作为 UART 接口,TTL信号线电平 3.3V。波特率默认为921600。
CAN接口可同时作为 CAN 接口;波特率默认为1Mbps。
I/O*接口可同时作为 I/O 模式接口,信号线电平3.3V。
刷新频率:Hz1030
级联数量UART:8 个经过测试最多支持级联的个数。
CAN:7 个
测距范围:m短距:0.015~2.16短距:0.03~1.00
中距:0.015~3.60中距:0.03~6.50
长距:0.015~5.05长距:0.03~8
测距精度

短距:

精度±1.0cm,

标准差<0.3cm

短距:

精度±1.5cm,

标准差<0.3cm

中距:

精度±1.0cm,

标准差<1.5cm

中距:

精度±3.0cm,

标准差<3.0cm

长距:

精度±1.5cm,

标准差<0.5cm@[0.02,3]m 范围, 标准差<5.0cm@(3,5]m 范围

长距:

精度±3.0cm,

标准差<5.0cm

视场角(FOV):°15~ 27分辨率为 1°,支持设置 X、Y方向偏移。

3.前期准备 

3.1 测试

快速在NAssistant上使用TOFSense

3.2 修改id

TOFSense模块发送的是协议数据,协议数据中附带自身ID,先将模块的ID分别设为0和1,通过接收固定帧头5700开头16个字节为一组的数据,接收到模块的原始数据后可以按照协议解析表将数据解析即可,★Nlink协议解析包:nlink unpack

4.配置环境

4.1 安装串口驱动

目前的Nooploop产品主要采用了两种USB转TTL串口芯片,CP210x和CH343,通常情况下,Linux自带CP210x的串口驱动,但是不带CH343的串口驱动。如果不确定产品使用的是哪一种,一般建议先安装CH343驱动

git clone https://github.com/WCHSoftGroup/ch343ser_linux.git

下载或clone串口驱动包后进入驱动的driver目录,

按照下图三个命令进行安装:

make
sudo make load
sudo make install

 

如果红运行结果和上图一样则说明安装成功,如果运行sudo make load后出现下图红框报错

则需要参考以下帖子重启电脑进入BIOS,修改安全启动选项,禁用安全启动选项,开机后重新sudo运行之前的指令:

https://blog.csdn.net/qq_43135204/article/details/118547385

https://askubuntu.com/questions/762254/why-do-i-get-required-key-not-available-when-install-3rd-party-kernel-modules

驱动安装完成后,将产品通过USB线或者Nooploop官方的NUTT(NUTT-B、NUTT-C)型号的USB转TTL模块连接Linux设备,然后在命令行执行

ls -l /dev/ttyUSB*

如果没有找到对应的端口则执行

ls -l /dev/ttyCH343USB*

如果能找到ttyCH343USBx端口,说明产品使用的是CH343的芯片,在后续的修改launch文件步骤中要注意修改对应的端口号

如果确认上述CH343驱动已经安装成功,且模块已经连接电脑,且执行ls -l /dev/ttyUSB*和ls -l /dev/ttyCH343USB*都找不到端口,但是执行ls -l /dev/ttyACM*可以找到端口如ttyACM0,则根据找到的端口号(以ttyACM0为例)执行

sudo chmod 777 /dev/ttyACM0

然后重启电脑,再执行ls -l /dev/ttyCH343USB*,一般可以找到对应CH343端口。

如果使用的是非官方的USB转TTL模块连接ROS如部分CH340模块,需要注意部分CH340在Ubuntu下921600波特率通信不稳定,不能正常使用,此时需要把UWB模块的波特率通过NAssistant改为115200,以及在后续步骤中更改launch文件中的波特率为115200来使用。

4.2 开启串口操作权限

通常,当以非 root 用户身份使用您选择的终端仿真器访问串行控制台时,出现“权限被拒绝”错误。这是因为串口的设备文件没有权限允许当前登录的用户“读取”或“写入”串行设备。通过以下命令查看权限:

ls -l /dev/ttyUSB*

虽然chmod可以用来向所需的用户或所有人授予访问权限,但不是一种安全的方式。更简单的方法是将用户添加到拨出组。

 首先,使用“id”命令验证用户是否属于拨出组。

id -Gn orin #orin是用户名

 接下来,将用户添加到“拨出”补充组。

sudo usermod -a -G dialout orin

 重新注销登录,再次执行“id”命令。 

id -Gn orin 
 4.3 安装Serial Library

 使用git clone指令下载串口库

git clone https://github.com/nooploop-dev/serial.git

将serial文件夹放到任意目录下,进入serial目录,编译串口库,运行测试,安装串口库(注意需要按照下面的步骤安装串口库,而不是下载下来就行)

在serial文件夹终端执行:

make
make test
sudo make install

5.搭建ROS工作空间

5.1 新建工作空间并初始化

新建一个ROS工作空间及工作空间下的src目录(nooploop_ws即为工作空间名,后续很多的命令都需要先进入nooploop_ws这个工作空间目录再执行)。使用以下命令新建工作空间并进行初始化。

mkdir -p ~/nooploop_ws/src
cd ~/nooploop_ws/src
catkin_init_workspace
5.2 编译工作空间
cd ..
catkin_make
catkin_make install
5.3 设置并检查环境变量
source ./devel/setup.sh
echo $ROS_PACKAGE_PATH
5.4 获取nlink parser功能包

这个步骤非常重要!从以往的案例来看,很多都是直接在官方ROS驱动页面下载zip压缩包,这个是错误的下载方式,会缺少子模块并在后续编译的时候报错。

正确的获取功能包的方式为:使用git clone --recursive命令获取。

进入工作空间下的src目录,执行git clone --recursive命令。

cd src/
git clone --recursive https://github.com/nooploop-dev/nlink_parser.git

git clone成功后进行下一步,如果git clone失败,可以先删除已经clone下来的nlink_parser残缺目录,然后更换网络,例如使用手机热点等再次尝试。

cd ..
catkin_make

编译成功则显示

5.6 常见报错

如果编译失败,根据报错信息来进行排查:

  • 如果提示缺少文件,如:

一般就是直接下载zip压缩包而没有使用git clone --recursived命令导致的,参考5.4 获取nlink parser功能包解决。

  • 提示找不到串口库:

则是没有安装串口库,参考4.配置环境下载编译和安装串口库。

5.7 测试

产品连接NAssistant软件正常识别和输出数据后,才能连接ROS,否则后续步骤会出现问题。

编译成功后,在当前工作空间~/nooploop_ws下的命令行窗口运行:

roscore

在当前工作空间下新开一个命令行然后source!

source ./devel/setup.bash

要注意后续所有新开的命令行都需要先source,除非按照下面的步骤在.bashrc中source一下(注意命令中的工作空间名称需要和自己创建的工作空间名一致,工作空间路径也需要一致)。打开一个命令行,执行:

echo "source ~/nooploop_ws/devel/setup.bash" >> ~/.bashrc

在工作空间下新开命令行后并source后,运行nlink_parser功能包的单元测试:

catkin_make run_tests

6.将Nooploop产品连接到ROS获取数据

根据新增加的端口号(一般为ttyUSBx或ttyCH343USBx)以及使用的产品,打开并修改nlink_parser功能包的launch目录下对应产品的*.launch文件内的端口名称,以及如果之前对连接到ROS的这个模块的波特率参数进行过修改,还需要把launch文件中的波特率也改为对模块设置的波特率(这里如果是LinkTrack系列,修改linktrack.launch,如果是LinkTrack AOA,修改linktrack_aoa.launch,TOFSense和TOFSense-F系列,修改tofsense.launch,TOFSense-M系列,修改tofsensem.launch,IOT系列,修改iot.launch

然后在之前已经source的运行单元测试的命令行窗口(或者已经source的工作空间下的新命令行窗口)运行对应产品的launch文件

roslaunch nlink_parser tofsense.launch
6.1 运行launch文件的常见报错

没有source,请参考前面的步骤进行source

没有打开串口操作权限。如果是第一次使用串口设备,需要开启串口操作权限。

运行时提示找不到库文件 。安装了串口库还提示这个报错,则按照readme.md的FAQ第二条执行

  • 运行节点提示 "error while loading shared libraries: libserial.so: Cannot open shared object file: No such file or directory"如果确定已经按照前面链接安装了串口库,编译也正常,仅运行时提示找不到库文件,尝试
  1. 运行
    sudo gedit /etc/ld.so.conf.d/libc.conf
  2. 如果没有 /usr/local/lib ,则进行添加
  3. 保存文件,然后执行
    sudo ldconfig
  4. 重启电脑

如果还是报相同错误,则在nlink_parser功能包的CMakeLists.txt中的find_package添加serial

没报错但运行launch后没有数据

表现为启动launch文件后,提示“Serial port opened successfully, waiting for data.”而没有提示“xxx has been advertised,use 'rostopic echo /xxxxxxxxxxx' to view the data”,如

下面是正确的提示:

排查方法:

  1. 产品必须先连接NAssistant软件(资料下载 – Nooploop空循环),确认可以正常识别模块并获得相应的坐标距离角度等输出数据以后再连接ROS(LinkTrack系列产品需要按照用户手册等教程的步骤搭建好测试系统,连接console或anchor进行一键标定获得正确刷新的标签坐标后再把标签连接ROS,同时需要注意此时所有的控制台和基站都需要处于上电状态)。(如果联系售后工程师排查需提供出现此问题的该模块在NAssistant下正常识别并获取数据的截图或视频)
  2. 将产品连接NAssistant软件确认正常识别模块且输出数据正常后,进入设置页面,确认并记录该模块设置的波特率,检查运行的launch文件中的波特率是否和记录的波特率一致,如果不一致,将launch文件中的波特率改为记录的波特率。如果NAssistant软件是在运行ROS的这台PC上运行的,完成1、2步的检查后需要关闭NAssistant软件
6.2 使用echo命令查看产品数据

提示“xxx has been advertised,use 'rostopic echo /xxxxxxxxxxx' to view the data”后,

在工作空间目录下新开一个命令行并进行source,按照对应产品返回的'rostopic echo /xxxxxxxxxxx'提示执行对应的echo命令,以下以LinkTrack系列产品为例:

source devel/setup.bash
rostopic echo /nlink_linktrack_nodeframe2

即可获得产品输出的数据(图中没有搭建LP模式定位系统,实际应用中需要先搭建系统获取正确的定位坐标)

6.3 LinkTrack系列运行RVIZ节点

目前只有LinkTrack系列在LP模式下可以运行RVIZ节点,且只能查看标签的坐标,不能查看轨迹等信息,如果需要轨迹信息需要客户自行编写相关代码。

注意,RVIZ只是一个消息转换器,需要先运行linktrack.launch获取正确的定位坐标后,再运行RVIZ节点(以下示例没有搭建LP模式的定位系统所以只是演示流程)另外,Ubuntu20的rviz支持是有问题的。

在工作空间目录下新开一个命令行并进行source,运行RVIZ节点

source devel/setup.bash

roslaunch nlink_parser linktrack_rviz.launch

因为只是演示流程,没有正确的坐标数据输出,仅供参考。

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ROS,`waitForTransform()`函数是TF库的一个函数,用于等待两个帧之间的转换可用。它通常用于等待两个帧之间的转换被广播,以便您可以使用`lookupTransform()`函数来查询它们之间的转换。 这个函数的语法如下: ```cpp bool tf_listener.waitForTransform(const std::string& target_frame, const std::string& source_frame, const ros::Time& time, const ros::Duration& timeout, const ros::Duration& polling_sleep_duration); ``` 其,`target_frame`和`source_frame`是要查询的两个帧的名称,`time`是您想要查询的时间戳,`timeout`是等待时间的最大值,`polling_sleep_duration`是每次查询之间的休眠时间。 如果转换在超时之前变得可用,则函数将返回`true`,否则将返回`false`。 以下是一个使用`waitForTransform()`函数的示例代码,用于等待`base_link`和`laser_link`帧之间的转换: ```cpp #include <tf/transform_listener.h> #include <ros/ros.h> int main(int argc, char** argv) { ros::init(argc, argv, "tf_listener"); ros::NodeHandle nh; tf::TransformListener tf_listener; std::string target_frame = "base_link"; std::string source_frame = "laser_link"; ros::Time time = ros::Time(0); ros::Duration timeout = ros::Duration(5.0); bool success = tf_listener.waitForTransform(target_frame, source_frame, time, timeout, ros::Duration(0.01)); if (success) { ROS_INFO("Transform from %s to %s is available", source_frame.c_str(), target_frame.c_str()); } else { ROS_ERROR("Failed to get transform from %s to %s", source_frame.c_str(), target_frame.c_str()); } return 0; } ``` 在这个例子,我们将等待5秒钟来获取`base_link`和`laser_link`帧之间的转换,并在转换可用时输出一条消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值