阿克曼ROS小车学习之旅----学习记录

文章目录

    • 1.小车硬件介绍与遥控教程视频
    • 2.ROS底层与源码系列视频教程
      • 2.8.深度学习教程视频及资料
    • 3.ROS开发手册
    • 4.电机控制基础视频教程
    • 5.ROS源码
    • 6.STM32运动底盘源码
    • 7.原理图
    • 8.软件与驱动
    • 9.芯片数据手册
      • 9.1思岚雷达A2M8
        • 9.1.1输出数据结构
        • 9.1.2接线定义
        • 9.1.3性能指标
      • 9.2深度相机
        • 9.2.1基本概念
    • 10.CAN控制与串口控制例程源码
    • 11.声源定位与语音导航
    • 12.其他

1.小车硬件介绍与遥控教程视频

2.ROS底层与源码系列视频教程

2.8.深度学习教程视频及资料

3.ROS开发手册

4.电机控制基础视频教程

5.ROS源码

6.STM32运动底盘源码

7.原理图

8.软件与驱动

9.芯片数据手册

9.1思岚雷达A2M8

9.1.1输出数据结构

阿克曼ROS小车学习之旅----学习记录_第1张图片
数据接收处理代码

    while (ros::ok()) {
     
        rplidar_response_measurement_node_hq_t nodes[360*8];
        size_t   count = _countof(nodes);

        start_scan_time = ros::Time::now();
        op_result = drv->grabScanDataHq(nodes, count);
        end_scan_time = ros::Time::now();
        scan_duration = (end_scan_time - start_scan_time).toSec();

        if (op_result == RESULT_OK) {
     
            op_result = drv->ascendScanData(nodes, count);
            float angle_min = DEG2RAD(0.0f); // 将角度值转换为弧度值
            float angle_max = DEG2RAD(359.0f);
            if (op_result == RESULT_OK) {
     
                if (angle_compensate) {
     
                    // const int angle_compensate_multiple = 1;
                    const int angle_compensate_nodes_count = 360*angle_compensate_multiple;
                    int angle_compensate_offset = 0;
                    rplidar_response_measurement_node_hq_t angle_compensate_nodes[angle_compensate_nodes_count];
                    memset(angle_compensate_nodes, 0, angle_compensate_nodes_count*sizeof(rplidar_response_measurement_node_hq_t));

                    int i = 0, j = 0;
                    for( ; i < count; i++ ) {
     
                        if (nodes[i].dist_mm_q2 != 0) {
     
                            float angle = getAngle(nodes[i]);
                            int angle_value = (int)(angle * angle_compensate_multiple);
                            if ((angle_value - angle_compensate_offset) < 0) angle_compensate_offset = angle_value;
                            for (j = 0; j < angle_compensate_multiple; j++) {
     

                                int angle_compensate_nodes_index = angle_value-angle_compensate_offset+j;
                                if(angle_compensate_nodes_index >= angle_compensate_nodes_count)
                                    angle_compensate_nodes_index = angle_compensate_nodes_count-1;
                                angle_compensate_nodes[angle_compensate_nodes_index] = nodes[i];
                            }
                        }
                    }

                    publish_scan(&scan_pub, angle_compensate_nodes, angle_compensate_nodes_count,
                             start_scan_time, scan_duration, inverted,
                             angle_min, angle_max, max_distance,
                             frame_id);
                } else {
     
                    int start_node = 0, end_node = 0;
                    int i = 0;
                    // find the first valid node and last valid node
                    // 找到第一个有效节点和最后一个有效节点
                    while (nodes[i++].dist_mm_q2 == 0);
                    start_node = i-1;
                    i = count -1;
                    while (nodes[i--].dist_mm_q2 == 0);
                    end_node = i+1;

                    angle_min = DEG2RAD(getAngle(nodes[start_node]));
                    angle_max = DEG2RAD(getAngle(nodes[end_node]));

                    publish_scan(&scan_pub, &nodes[start_node], end_node-start_node +1,
                             start_scan_time, scan_duration, inverted,
                             angle_min, angle_max, max_distance,
                             frame_id);
               }
            } else if (op_result == RESULT_OPERATION_FAIL) {
     
                // All the data is invalid, just publish them
                // 所有的数据都是无效的,只管发布它们
                float angle_min = DEG2RAD(0.0f);
                float angle_max = DEG2RAD(359.0f);
                publish_scan(&scan_pub, nodes, count,
                             start_scan_time, scan_duration, inverted,
                             angle_min, angle_max, max_distance,
                             frame_id);
            }
        }

        ros::spinOnce();
    }

    // done!
    drv->stopMotor();
    drv->stop();
    RPlidarDriver::DisposeDriver(drv);
    return 0;
}

9.1.2接线定义

阿克曼ROS小车学习之旅----学习记录_第2张图片

9.1.3性能指标

阿克曼ROS小车学习之旅----学习记录_第3张图片

阿克曼ROS小车学习之旅----学习记录_第4张图片

9.2深度相机

9.2.1基本概念

阿克曼ROS小车学习之旅----学习记录_第5张图片
阿克曼ROS小车学习之旅----学习记录_第6张图片

10.CAN控制与串口控制例程源码

11.声源定位与语音导航

12.其他

你可能感兴趣的:(ROS学习,自动驾驶)