思岚雷达型号C1\S2雷达类型添加角度屏蔽

使用角度屏蔽的目的,由于时间安装时,安装位置周边会有附近其他设备影响。
本次使用的雷达型号C1和S2 , ros2 版本 https://github.com/Slamtec/sllidar_ros2 。其中主要修改两个文件: sllidar_node.cpp 以及对应的launch文件

在这里插入图片描述

sllidar_node.cpp

  • 引入 RAD2DEG
    在这里插入图片描述
#define DEG2RAD(x) ((x)*M_PI/180.)
#define RAD2DEG(x) ((x)*180./M_PI)
  • init_param
    在这里插入图片描述
		this->declare_parameter<bool>("cut_angle", false);
		this->declare_parameter<int>("right_degrees",180);
        this->declare_parameter<int>("left_degrees",180);
        ......
		this->get_parameter_or<bool>("cut_angle", cut_angle, false);
        this->get_parameter_or<int>("right_degrees", right_degrees, 180);
        this->get_parameter_or<int>("left_degrees", left_degrees, 180);
  • publish_scan 函数 主要内容
		if(cut_angle){ // 需要进行角度屏蔽
			for (size_t i = 0; i < node_count; i++){
				scan_msg->ranges[i] = std::numeric_limits<float>::infinity();
			}
			
			if(reverse_data){
				for (size_t i = 0; i < node_count; i++)
				{
					float read_value = (float) nodes[i].dist_mm_q2/4.0f/1000;
					float get_degree = RAD2DEG(scan_msg->angle_min + scan_msg->angle_increment * i) + 180;
					if (get_degree  < right_degrees || get_degree  > left_degrees) {
						// 如果不在屏蔽范围内,继续处理数据
						if (read_value == 0.0){
							// 屏蔽操作:将距离设置为无穷大
							scan_msg->ranges[i] = std::numeric_limits<float>::infinity();
						} else {
							// 屏蔽操作:使用原始距离值
							scan_msg->ranges[i] = read_value;
						}
						scan_msg->intensities[i] = (float) (nodes[i].quality >> 2);
					} else {
						// 屏蔽操作:不使用该数据点
						scan_msg->ranges[i] = std::numeric_limits<float>::infinity();
						scan_msg->intensities[i] = 0; // 或者使用其他值来表示屏蔽的数据点
					}
				}
			} else {
				for (size_t i = 0; i < node_count; i++)
				{
					float read_value = (float) nodes[i].dist_mm_q2/4.0f/1000;
					float get_degree = RAD2DEG(scan_msg->angle_min + scan_msg->angle_increment * i) + 180;
					if (get_degree  < right_degrees || get_degree  > left_degrees){
						// 如果不在屏蔽范围内,继续处理数据
						if (read_value == 0.0)
							// 屏蔽操作:将距离设置为无穷大
							scan_msg->ranges[node_count - 1 - i] = std::numeric_limits<float>::infinity();
						else 
							// 屏蔽操作:使用原始距离值
							scan_msg->ranges[node_count - 1 - i] = read_value;
						scan_msg->intensities[node_count - 1 - i] = (float) (nodes[i].quality >> 2);
					}
				}
			}
		} else { // 不需要进行角度屏蔽
			bool reverse_data = (!inverted && reversed) || (inverted && !reversed);
            if (!reverse_data) {
                for (size_t i = 0; i < node_count; i++) {
                    float read_value = (float) nodes[i].dist_mm_q2/4.0f/1000;
                    if (read_value == 0.0)
                        scan_msg->ranges[i] = std::numeric_limits<float>::infinity();
                    else
                        scan_msg->ranges[i] = read_value;
                    scan_msg->intensities[i] = (float) (nodes[i].quality >> 2);
                }
            } else {
                for (size_t i = 0; i < node_count; i++) {
                    float read_value = (float)nodes[i].dist_mm_q2/4.0f/1000;
                    if (read_value == 0.0)
                        scan_msg->ranges[node_count-1-i] = std::numeric_limits<float>::infinity();
                    else
                        scan_msg->ranges[node_count-1-i] = read_value;
                    scan_msg->intensities[node_count-1-i] = (float) (nodes[i].quality >> 2);
                }
            }
		}
  • private 生命 变量
    在这里插入图片描述
	bool cut_angle = false;
    int right_degrees = 180;
    int left_degrees = 180;

对应型号的launch文件

  • C1 与 S2 添加参数位置相同
def generate_launch_description():
    channel_type =  LaunchConfiguration('channel_type', default='serial')
    serial_port = LaunchConfiguration('serial_port', default='/dev/ttyUSB0')
    serial_baudrate = LaunchConfiguration('serial_baudrate', default='460800')
    frame_id = LaunchConfiguration('frame_id', default='laser')
    inverted = LaunchConfiguration('inverted', default='false')
    angle_compensate = LaunchConfiguration('angle_compensate', default='true')
    # 添加参数
    cut_angle = LaunchConfiguration('cut_angle', default='true')
    right_degrees = LaunchConfiguration('right_degrees', default='135')
    left_degrees = LaunchConfiguration('left_degrees', default='225')
    scan_mode = LaunchConfiguration('scan_mode', default='DenseBoost')
    scan_topic = LaunchConfiguration('scan_topic', default='/scan1')
    ......
	     Node(
	     package='sllidar_ros2',
	     executable='sllidar_node',
	     name='sllidar_node',
	     parameters=[{'channel_type':channel_type,
	                  'serial_port': serial_port,
	                  'serial_baudrate': serial_baudrate,
	                  'frame_id': frame_id,
	                  'inverted': inverted,
	                  'angle_compensate': angle_compensate,
	                  'cut_angle': cut_angle,
	                  'right_degrees': right_degrees,
	                  'left_degrees': left_degrees,
	                  'scan_mode': scan_mode,
	                  'scan_topic': scan_topic}],
	     output='screen'),
	])

文章参考 :https://blog.csdn.net/qq_41854650/article/details/102740533

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值