参考网站::   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. mysql打开文件数太多的解决办法

    http://www.orczhou.com/index.php/2010/10/mysql-open-file-limit/ http://www.cnblogs.com/end/archive/2 ...

  2. 2018年最重要的HTML5开发手册,传播正能量

    今天给大家推荐这个HTML5开发手册,希望能帮助正在学习web前端的人,鄙人也是刚学习前端没多久,借助于一点资讯平台能够结识更多前端大牛,这是我的web前端/HTML5/javscript技术学习群: ...

  3. laravel 安装碰到的问题:全局安装 Laravel Installer,然后用下面的指令创建新项目: laravel new blog报连接超时解决方案

    在执行laravel new project 的时候报错 cURL error 7: Failed to connect to cabinet.laravel.com port 80: Timed o ...

  4. Codeforces Beta Round #4 (Div. 2 Only) C. Registration system【裸hash/map】

    C. Registration system time limit per test 5 seconds memory limit per test 64 megabytes input standa ...

  5. hihocoder Arithmetic Expression【在线查询】

    Arithmetic Expression   时间限制:2000ms 单点时限:200ms 内存限制:256MB 描述 Given N arithmetic expressions, can you ...

  6. UVA 10129 Play on Words (欧拉通路)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398627.html 题意: 输入N(N <= 100000)个单词,是否可以把所有这些单词排成一个序列,使得每个单 ...

  7. (寒假集训)Watering the Fields (最小生成树)

    Watering the Fields 时间限制: 1 Sec  内存限制: 64 MB提交: 26  解决: 10[提交][状态][讨论版] 题目描述 Due to a lack of rain, ...

  8. HDU 5916: Harmonic Value Description

    题目描述 The harmonic value of the permutation $p_1,p_2,\cdots p_n$ is$$\sum_{i=1}^{n-1} gcd(p_i.p_{i+1} ...

  9. Flatten 2D Vector -- LeetCode

    Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [,], [], [,,] ] By cal ...

  10. 2.2多线程(java学习笔记)线程状态及线程操作的相关方法

    一.线程的状态 线程一般具有五种状态,即创建.就绪.运行.阻塞.终止. 它们之间的关系: 二.线程操作相关方法 1.设置和取得线程名称. 如果不设置线程名称,系统会自动分配线程名,一般格式为Threa ...