rplidar 扫描角度设置
阅读原文时间:2023年07月15日阅读:1

参考网站::   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::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文件中加入

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

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

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

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

重新编译即可。

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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器