参考网站::   https://blog.csdn.net/sunyoop/article/details/78302090

https://blog.csdn.net/dzhongjie/article/details/84575482

通常我们选取是laser 正前方的扇型数据,从上图可以看出
例如正面180度扇型数据,那么选取的度数为0~90,270~359的数据
270度面的扇型数据,选取度数为0~135, 225~359的数据
回到代码中
1.下载rplidar node的源码https://github.com/robopeak/rplidar_ros
2.打开node.cpp文件,简单看下逻辑
 

修改publish_scan函数:

void publish_scan(ros::Publisher *pub,
rplidar_response_measurement_node_hq_t *nodes,
size_t node_count, ros::Time start,
double scan_time, bool inverted,
float angle_min, float angle_max,
float max_distance,
std::string frame_id)
{ static int scan_count = ; sensor_msgs::LaserScan scan_msg;
scan_msg.header.stamp = start;
scan_msg.header.frame_id = frame_id; scan_count++; bool reversed = (angle_max > angle_min); if(reversed){
scan_msg.angle_min = M_PI - angle_max;
scan_msg.angle_max = M_PI - angle_min;
}
else{
scan_msg.angle_min = M_PI - angle_min;
scan_msg.angle_max = M_PI - angle_max;
} scan_msg.angle_increment =(scan_msg.angle_max - scan_msg.angle_min) / (double)(node_count-);
scan_msg.scan_time = scan_time;
scan_msg.time_increment = scan_time / (double)(node_count-);
scan_msg.range_min = 0.15;
scan_msg.range_max = 8.0; scan_msg.intensities.resize(node_count);
scan_msg.ranges.resize(node_count);
bool reverse_data = (!inverted && reversed) || (inverted && !reversed); //修改后的代码reverse_data就没有用处了。 /* 将rplidar放到hokuyo的位置,角度信息见上面的图如下
0度/前
270度/左 rplidar的方向 90度/右
180度/后
kobuki接收到 LaserScan scan_msg.ranges数据对应的角度信息
180度/前
270度/左 kobuki的方向 90度/右
0度/后 要把 0~90度对应的node数据映射到 180~90度的scan_msg.ranges中
要把 90~180度对应的node数据映射到 90~0度的scan_msg.ranges中
要把 180~270度对应的node数据映射到 359~270度的scan_msg.ranges中
要把 270~359度对应的node数据映射到 270~180度的scan_msg.ranges中 */
const size_t degree_90 = ; //固定值,算法需要
const size_t degree_270 = ; //固定值,算法需要
const size_t left_degrees = ; // 裁剪的范围 保留数据225~359.
const size_t right_degrees = ; // 裁剪的范围 保留数据0~135.
//先全部置inf,注意:如果初始化是0,则表示范围内无障碍,故不能置0。inf表示无数据
for (size_t i = ; i < node_count; i++){
scan_msg.ranges[i] = std::numeric_limits<float>::infinity();
} //将数据分别对应设置进去
for (size_t i = ; i < node_count; i++)
{
float read_value = (float) nodes[i].dist_mm_q2/4.0f/;
if (i < right_degrees)
{
if (read_value == 0.0)
scan_msg.ranges[*degree_90 - i] = std::numeric_limits<float>::infinity();
else
scan_msg.ranges[*degree_90 - i] = read_value; scan_msg.intensities[*degree_90 - i] = (float) (nodes[i].quality >> ); }
else if (i > left_degrees)
{
if (read_value == 0.0)
scan_msg.ranges[*degree_270 - i] = std::numeric_limits<float>::infinity();
else
scan_msg.ranges[*degree_270 - i] = read_value; scan_msg.intensities[*degree_270 - i] = (float) (nodes[i].quality >> );
}
else
{
//do nothing;
}
}
//发布出去
pub->publish(scan_msg);
}

讲需要裁剪的角度放到launch文件中,当作参数传入,比在代码中修改好很多

例如:在rplidar.launch文件中加入

<param name="cut_angle"    type="bool"   value="true"/>

<param name="right_degrees"    type="int"   value=""/>

<param name="left_degrees"    type="int"   value=""/>

然后在main()函数中添加参数:

bool cut_angle =false;
int right_degrees=;
int left_degrees=;
nh_private.param<bool>("cut_angle", cut_angle, false);
if (cut_angle){
nh_private.param<int>("left_degrees", left_degrees, );
nh_private.param<int>("right_degrees", right_degrees, );
}

讲需要裁剪的角度放到launch文件中,当作参数传入,比在代码中修改好很多

例如:在rplidar.launch文件中加入

<param name="cut_angle"    type="bool"   value="true"/>

<param name="right_degrees"    type="int"   value=""/>

<param name="left_degrees"    type="int"   value=""/>

重新编译即可。

(注::不知道为什么Boost模式下 运行报错,A2 standard Express模式没有问题)

 

rplidar 扫描角度设置的更多相关文章

  1. 1900型USB接口扫描枪设置虚拟串口模式提升扫描速度

    在使用扫描枪的过程中,发现扫描二维码速度比较慢,不到100个字符,花了大概2-3秒的时间才完成显示,这个速度不能忍受啊.通过度娘,说是可以将USB键盘模式接收字符转换成虚拟串口接收,这样可以大大提高速 ...

  2. 详解ABBYY FineReader 12扫描亮度设置

    很多刚接触ABBYY FineReader 12的小伙伴可能出现过这样一个问题:在扫描过程中会显示一条消息以提示更改亮度设置.这是因为你 FineReader扫描设置中亮度未正确设置.下面小编就给小伙 ...

  3. Box2D淌坑日记: 如何正确的设置角度

    对刚体角度设置的唯一函数是 SetTransform 然而,这个函数不会对传入的角度作任何处理,因此,如果你试图设置一个角度,并应用一个revoluteJoint时,可能会出现问题. 我在实践中碰到的 ...

  4. Rplidar学习(二)—— SDK库文件学习

    SDK头文件介绍 1.头文件简介: rplidar.h //一般情况下开发的项目中仅需要引入该头文件即可使用 RPLIDAR SDK 的所有功能. rplidar_driver.h //定义了 SDK ...

  5. 【译】使用OpenVAS 9进行漏洞扫描

    本文译自Vulnerability Scanning with OpenVAS 9 part 1: Installation & Setup系列,本文将融合目前已经发表的四个部分. Part ...

  6. TWaver动画之雷达扫描效果

    UI和功能是好的产品的两个重要因素,很多产品往往只注重功能上的设计,而忽略了UI.在这个“看脸”的时代,就算产品的功能很强大,如果UI跟不上步伐,你的产品都会在客户心中大打折扣.做安全和监控的项目中经 ...

  7. Swift 二维码扫描 简单实现

    3.30看视频  学到了二维码简单的实现 还有一些动画的实现  今天就先记录一下二维码扫描的简单实现  不太好记手写一遍 学习的基础在于模仿嘛 创建一个实现二维码扫描的步骤 1.首先是懒加载创建 会话 ...

  8. Nmap扫描手册

    By:WHILE扫描类-sTTCP connect()扫描,完整的通话连接,容易被检测,会被记录日志.-sSTCP同步扫描,不完整的通话连接,很少有系统会记入日志.-sUUDP扫描-sAACK扫描用来 ...

  9. ABBYY FineReader 12扫描界面介绍

    ABBYY FineReader 12OCR图文识别软件自身拥有着自己的扫描界面,一般在默认情况下,ABBYY FineReader 使用其自身的扫描界面.本文就解析了ABBYY FineReader ...

随机推荐

  1. Python与数据库[2] -> 关系对象映射/ORM[4] -> sqlalchemy 的显式 ORM 访问方式

    sqlalchemy 的显式 ORM 访问方式 对于sqlalchemy,可以利用一种显式的ORM方式进行访问,这种方式无需依赖声明层,而是显式地进行操作.还有一种访问方式为声明层 ORM 访问方式. ...

  2. 线段树【p1115】 最大子段和

    题目描述-->p1115 最大子段和 虽然是一个普及-的题,但我敲了线段树 qwq 数组定义 \(lsum[ ]\)代表 该区间左端点开始的最大连续和. \(rsum[ ]\)代表 该区间右端点 ...

  3. 反汇编引擎diStorm3

    反汇编引擎diStorm3   diStorm3是Kali Linux自带的一款轻量级.容易使用的反汇编引擎.它可以反汇编生成16位.32位和64位指令.它支持的指令集包括FPU.MMX.SSE.SS ...

  4. python全栈开发- day14列表推导式、生成器表达式、模块基础

    一.列表推导式 #1.示例 数据量小 egg_list=[] for i in range(10): egg_list.append('鸡蛋%s' %i) egg_list=['鸡蛋%s' %i fo ...

  5. [CF3B]Lorry

    题目大意: 有$n(n\leq 10^5)$个物品,背包的容量为$m(m\leq 10^9)$.每个物品有重量$w_i(w_i\in\{1,2\})$和价值$v_i(v_i\leq 10^4)$.问最 ...

  6. JAVA常见算法题(二十二)

    package com.xiaowu.demo; //利用递归方法求5!. public class Demo22 { public static void main(String[] args) { ...

  7. [Android Traffic] 使用缓存来避免重复的下载

    转载自: http://blog.csdn.net/kesenhoo/article/details/7395817 Redundant Downloads are Redundant[重复下载是冗余 ...

  8. WEB安全漏洞与防范

    1.XSS 原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的.如,盗取用户Cookie信息.破坏页面结构.重定向到其 ...

  9. mac下npm/node的安装和卸载、升级;node、npm升级后最后删掉node_modules重新安装

    mac还是使用brew install简单一些:最好使用一种安装方式,不要多种方式互用: 更新npm到最新版本npm install -g npm更新npm到指定版本 npm -g install n ...

  10. malloc,free和new,delete之间的区别

    1.malloc free 是c语言里面的,不过在c++中也能使用,这个只是申请的一块内存,一般不能申请对象的内存空间:2.new delete,是c++的,申请的也是一块内存,只是这个可以申请对象. ...