参考网站::   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模式没有问题)

 

最新文章

  1. OPENCV配置 C1083: 无法打开包括文件:“opencv2/opencv.hpp”
  2. 关于STM32的FLASH操作【转载】
  3. git log 格式化输出
  4. 选项卡 tab切换
  5. Tuple,Array,Map,文件操作
  6. 安装Eclipse插件
  7. Dwarves (有向图判环)
  8. Android 自定义view中的属性,命名空间,以及tools标签
  9. Ubuntu16.04安装VMware Tools问题
  10. HashMap使用
  11. OD: Ring0 &amp; Kernel
  12. 关于echarts、layer.js和jqGrid的知识点
  13. Linux下批量杀掉 包含某个关键字的 程序进程
  14. COGS.1272.[AHOI2009]行星序列(线段树 区间加、乘、求和)
  15. elastaicsearch基础-----&gt;elastaicsearch的使用(一)
  16. H5——video百花齐放(浏览器自带的播放器)
  17. Bootloader之uBoot简介
  18. ubuntu下桌面假死处理方法(非重启)
  19. struts2请求两次即action方法执行两次
  20. Multiple Object Tracking using K-Shortest Paths Optimization简要

热门文章

  1. .net 实用功能
  2. Python的网络编程[3] -&gt; BOOTP 协议[1] -&gt; BOOTP 的 Python 实现
  3. docker环境准备及理论
  4. 个人博客 V0.0.3 版本 ...
  5. mybatis学习笔记(六)使用generator生成mybatis基础配置代码和目录结构
  6. iOS开发15:自定义UITableViewCell
  7. CSS的7种常用的垂直居中的方法
  8. bmp,jpg,png,tif,wmf,emf与eps图片格式转换
  9. linux 远程同步数据工具rsync (1)
  10. depth linear