zoukankan      html  css  js  c++  java
  • rplidar 扫描角度设置

    参考网站::   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 = 0;
    
        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-1);
        scan_msg.scan_time = scan_time;
        scan_msg.time_increment = scan_time / (double)(node_count-1);
        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 = 90; //固定值,算法需要
        const size_t degree_270 = 270; //固定值,算法需要
        const size_t left_degrees = 225; // 裁剪的范围 保留数据225~359. 
        const size_t right_degrees = 135; // 裁剪的范围 保留数据0~135. 
        //先全部置inf,注意:如果初始化是0,则表示范围内无障碍,故不能置0。inf表示无数据 
        for (size_t i = 0; i < node_count; i++){ 
            scan_msg.ranges[i] = std::numeric_limits<float>::infinity(); 
        } 
    
        //将数据分别对应设置进去 
       for (size_t i = 0; i < node_count; i++)
        {
            float read_value = (float) nodes[i].dist_mm_q2/4.0f/1000; 
            if (i < right_degrees)
            { 
               if (read_value == 0.0) 
                   scan_msg.ranges[2*degree_90 - i] = std::numeric_limits<float>::infinity(); 
               else 
                   scan_msg.ranges[2*degree_90 - i] = read_value; 
    
               scan_msg.intensities[2*degree_90 - i] = (float) (nodes[i].quality >> 2); 
    
            } 
            else if (i > left_degrees) 
            { 
               if (read_value == 0.0) 
            scan_msg.ranges[2*degree_270 - i] = std::numeric_limits<float>::infinity(); 
               else 
                    scan_msg.ranges[2*degree_270 - i] = read_value; 
    
               scan_msg.intensities[2*degree_270 - i] = (float) (nodes[i].quality >> 2); 
            } 
            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="90"/>
    
    <param name="left_degrees"    type="int"   value="270"/>

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

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

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

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

    <param name="cut_angle"    type="bool"   value="true"/>
    
    <param name="right_degrees"    type="int"   value="90"/>
    
    <param name="left_degrees"    type="int"   value="270"/>

    重新编译即可。

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

     
  • 相关阅读:
    with ,Row_Number,DateDiff,DateAdd用法学习
    jmeter 读取mysql数据库
    fidder 自动保存请求内容
    redis 常用方法整理
    解决:EXCEL复制粘贴,精度丢失
    MYSQL 创建常见问题
    MYSQL 存储过程、函数、临时表、游标
    MYSQL 测试常用语句使用技巧
    3-6
    selenium3 下载、配置
  • 原文地址:https://www.cnblogs.com/lovebay/p/10400762.html
Copyright © 2011-2022 走看看