参考网站:: 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
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文件中加入
然后在main()函数中添加参数:
bool cut_angle =false;
int right_degrees=;
int left_degrees=;
nh_private.param
if (cut_angle){
nh_private.param
nh_private.param
}
讲需要裁剪的角度放到launch文件中,当作参数传入,比在代码中修改好很多
例如:在rplidar.launch文件中加入
重新编译即可。
(注::不知道为什么Boost模式下 运行报错,A2 standard Express模式没有问题)
手机扫一扫
移动阅读更方便
你可能感兴趣的文章