.. _sec_perception: 感知系统:让无人机”看见”世界 ============================ **学习目标** - 理解无人机感知系统的作用与分类 - 掌握相机和激光雷达的核心参数及选型依据 - 学会在Gazebo中配置和使用感知传感器 - 能够读取并理解传感器输出的ROS话题数据 人类通过眼睛获取外界80%以上的信息。对于智能无人机而言,感知系统就是它的”眼睛”——没有感知,无人机就无法理解周围环境,更谈不上自主飞行。本节将带你认识无人机最重要的两类感知传感器:\ **相机**\ 和\ **激光雷达**\ 。 为什么需要感知系统? -------------------- 回顾上一节的无人机硬件架构图,感知系统位于整个数据流的最前端: 感知系统的核心任务是\ **将物理世界的信息数字化**\ ,为后续的定位、规划、控制提供数据基础。 感知系统能做什么? ~~~~~~~~~~~~~~~~~~ ============ ========== ================== 能力 应用场景 典型传感器 ============ ========== ================== 障碍物检测 避障飞行 深度相机、激光雷达 目标识别 跟踪、巡检 RGB相机 + AI 环境建图 SLAM、导航 激光雷达、双目相机 位姿估计 视觉里程计 单目/双目相机 降落标识识别 精准降落 RGB相机 ============ ========== ================== 感知传感器分类 ~~~~~~~~~~~~~~ 根据感知维度的不同,无人机常用的感知传感器可分为两大类,二维视觉传感器,例如相机等,和三维空间传感器,例如激光雷达。接下来,我们将分别深入学习这两类传感器。 视觉传感器:相机 ---------------- 相机是无人机上最常见的感知传感器,成本低、信息丰富,广泛应用于目标识别、视觉定位等场景。 单目相机 ~~~~~~~~ 单目相机是最基础的视觉传感器,它模拟人类单眼的成像过程。 **成像原理** 单目相机基于\ **针孔成像模型**\ :三维空间中的点通过光学中心投影到二维成像平面上。 成像过程的数学表达: .. math:: \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \frac{1}{Z} \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} 其中: - :math:`(X, Y, Z)` 是三维点在相机坐标系下的坐标 - :math:`(u, v)` 是该点在图像上的像素坐标 - :math:`f_x, f_y` 是焦距(以像素为单位) - :math:`(c_x, c_y)` 是图像中心(主点) **核心参数** 选择单目相机时,需要关注以下参数: +-------------------+----------------+-------------------------------------+ | 参数 | 含义 | 选型建议 | +===================+================+=====================================+ | **分辨率** | 图像的像素数量 | 室内:640×480;室外:1280×720或更高 | +-------------------+----------------+-------------------------------------+ | **帧率(FPS)** | 每秒采集图像数 | 视觉SLAM:30FPS;高速场景:60FPS+ | +-------------------+----------------+-------------------------------------+ | **视场角(FOV)** | 相机可视范围 | 避障:宽FOV(>90°);识别:窄FOV | +-------------------+----------------+-------------------------------------+ | **快门类型** | 曝光方式 | 运动场景选\ **全局快门**\ (Global | | | | Shutter) | +-------------------+----------------+-------------------------------------+ | **接口** | 数据传输方式 | USB3.0、MIPI CSI | +-------------------+----------------+-------------------------------------+ .. **重要概念:全局快门 vs 卷帘快门** - **全局快门(Global Shutter)**\ :所有像素同时曝光,适合高速运动场景 - **卷帘快门(Rolling Shutter)**\ :逐行曝光,运动时会产生”果冻效应” 对于无人机这类高速运动平台,\ **强烈建议选择全局快门相机**\ 。 **单目相机的局限性** 单目相机的最大问题是\ **缺乏深度信息**——它无法直接测量物体到相机的距离。这就像人闭上一只眼睛后,难以准确判断物体远近。 解决方案有两种: 1. 使用\ **双目相机**\ 通过视差计算深度 2. 使用\ **深度相机**\ 主动测量深度 深度相机:Intel RealSense D435i ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Intel RealSense D435i是无人机领域最流行的深度相机之一,集成了RGB相机、红外双目相机、红外发射器和IMU,是一款”全能型”传感器。 **工作原理** D435i采用\ **主动红外立体视觉**\ 技术: 1. **红外发射器**\ 向环境投射红外散斑图案 2. **双红外相机**\ 从不同角度捕获这些图案 3. 通过\ **立体匹配**\ 算法计算每个像素的视差 4. 根据视差计算深度:\ :math:`Z = \frac{f \cdot B}{d}`\ (\ :math:`f`\ 为焦距,\ :math:`B`\ 为基线,\ :math:`d`\ 为视差) 这种主动式方案的优势是:即使在纹理缺乏的场景(如白墙)也能获得深度信息。 **核心参数** ========== ====================== ======================= 参数 D435i规格 说明 ========== ====================== ======================= 深度分辨率 最高1280×720 可配置 深度帧率 最高90 FPS 取决于分辨率 RGB分辨率 最高1920×1080 30 FPS 深度FOV 87° × 58° 水平 × 垂直 测距范围 0.1m ~ 10m 推荐0.3m~3m获得最佳精度 深度精度 <2% @ 2m 在2米处误差小于4cm 基线长度 50mm 双红外相机间距 IMU 6轴(加速度计+陀螺仪) BMI055芯片 接口 USB 3.0 Type-C 供电+数据 尺寸 90mm × 25mm × 25mm 小巧紧凑 重量 约72g 适合无人机搭载 ========== ====================== ======================= **使用场景与选型建议** ========== ======== ========================== 场景 是否适用 原因 ========== ======== ========================== 室内避障 非常适合 测距范围和精度匹配 室内SLAM 适合 RGB-D + IMU可用于VIO 室外强光 受限 阳光干扰红外,深度质量下降 远距离测距 不适合 超过3m精度明显下降 ========== ======== ========================== .. **实践提示** 使用D435i时的常见问题: 1. **红外散斑干扰**\ :在较暗环境下,红外散斑会出现在图像中,影响特征提取。如果用于视觉SLAM,需关闭红外发射器。 2. **深度对齐**\ :RGB和深度图需要对齐后才能生成彩色点云。在ROS中设置\ ``align_depth:=true``\ 。 3. **USB3.0必须**\ :使用USB2.0会导致帧率大幅下降。 **ROS数据接口** D435i在ROS中发布以下主要话题: .. raw:: latex \diilbookstyleinputcell .. code:: bash # RGB图像 /camera/color/image_raw # sensor_msgs/Image # 深度图像 /camera/depth/image_rect_raw # sensor_msgs/Image (原始深度) /camera/aligned_depth_to_color/image_raw # 对齐到RGB的深度 # 点云 /camera/depth/color/points # sensor_msgs/PointCloud2 # 相机内参 /camera/color/camera_info # sensor_msgs/CameraInfo # IMU数据 /camera/imu # sensor_msgs/Imu 查看话题数据示例: .. raw:: latex \diilbookstyleinputcell .. code:: bash # 查看RGB图像话题信息 rostopic info /camera/color/image_raw # 查看IMU数据 rostopic echo /camera/imu **代码示例:订阅相机图像** 下面是一个订阅D435i RGB图像话题的示例代码。 Python实现简洁,适合快速开发和原型验证。 .. raw:: latex \diilbookstyleinputcell .. code:: python #!/usr/bin/env python # -*- coding: utf-8 -*- """ 文件名: camera_subscriber.py 功能: 订阅D435i RGB图像话题并显示图像信息 """ import cv2 import rospy from cv_bridge import CvBridge from sensor_msgs.msg import Image class CameraSubscriber: def __init__(self): rospy.init_node('camera_subscriber_python', anonymous=True) self.bridge = CvBridge() # 订阅RGB图像话题 self.image_sub = rospy.Subscriber( '/camera/color/image_raw', Image, self.image_callback ) rospy.loginfo("Python相机订阅节点已启动,等待图像数据...") def image_callback(self, msg): """图像回调函数""" try: # 将ROS图像消息转换为OpenCV格式 cv_image = self.bridge.imgmsg_to_cv2(msg, "bgr8") # 获取图像信息 height, width, channels = cv_image.shape rospy.loginfo( f"收到图像: {width}x{height}, " f"时间戳: {msg.header.stamp.secs}.{msg.header.stamp.nsecs}" ) # 可选:显示图像(需要图形界面) # cv2.imshow("Camera View", cv_image) # cv2.waitKey(1) except Exception as e: rospy.logerr(f"图像处理错误: {e}") if __name__ == '__main__': try: subscriber = CameraSubscriber() rospy.spin() except rospy.ROSInterruptException: pass **运行方法**\ : .. raw:: latex \diilbookstyleinputcell .. code:: bash # 确保已安装依赖 pip install opencv-python rospkg # 运行节点 python camera_subscriber.py 三维传感器:激光雷达 -------------------- 激光雷达(LiDAR, Light Detection and Ranging)通过发射激光束并测量反射时间来获取精确的三维距离信息。相比相机,激光雷达具有\ **测距精度高、不受光照影响**\ 的优势。 激光雷达工作原理 ~~~~~~~~~~~~~~~~ 激光雷达的基本原理是\ **飞行时间法(Time of Flight, ToF)**\ : 1. 发射激光脉冲 2. 激光遇到障碍物后反射 3. 接收反射激光,测量往返时间 :math:`\Delta t` 4. 计算距离:\ :math:`d = \frac{c \cdot \Delta t}{2}`\ (\ :math:`c`\ 为光速) Livox Mid-360 ~~~~~~~~~~~~~ Livox Mid-360是大疆旗下览沃科技推出的混合固态激光雷达,以其\ **360°水平FOV、小巧体积、高性价比**\ 在机器人和无人机领域广受欢迎。 **核心参数** ======== ================== ==================== 参数 Mid-360规格 说明 ======== ================== ==================== 水平FOV 360° 全向感知 垂直FOV 59°(-7°~+52°) 非对称,下方范围更大 测距范围 0.1m ~ 70m 反射率≥80%时可达70m 测距精度 ±3cm @10m, 反射率80% 角分辨率 0.2° 非重复扫描累积 点云速率 约200,000点/秒 单回波模式 扫描频率 10Hz 每100ms一帧 抗干扰 100klx 可在强光下工作 尺寸 65mm × 65mm × 60mm 网球大小 重量 265g 适合无人机搭载 工作温度 -20°C ~ +55°C 内置自加热 接口 以太网(100Mbps) UDP协议传输 内置IMU 6轴 可用于LIO算法 ======== ================== ==================== **非重复扫描特性** Mid-360采用Livox独特的\ **非重复扫描**\ 技术: - 传统机械激光雷达每帧扫描相同位置 - Mid-360每帧扫描位置略有不同,随时间累积覆盖更多区域 这意味着:\ **积分时间越长,点云越密集**\ 。 :: 积分时间 覆盖率 0.1s ≈ 32线机械雷达 0.2s > 32线机械雷达 0.5s > 64线机械雷达 **使用场景与选型建议** ======== ======== =================== 场景 是否适用 原因 ======== ======== =================== 室内建图 非常适合 360°FOV,近距精度高 室外导航 适合 70m量程,抗强光 高速避障 需注意 10Hz帧率,需预测 精密测绘 受限 精度不如测绘级雷达 ======== ======== =================== .. **重要提示:FOV与有效量程** Mid-360的有效量程\ **随垂直角度变化**\ : - 正上方(+52°):量程最短 - 正下方(-7°):量程最长(可达70m) 安装时需考虑主要感知方向。 **ROS数据接口** Mid-360在ROS中发布以下主要话题: .. raw:: latex \diilbookstyleinputcell .. code:: bash # 点云数据(标准格式) /livox/lidar # sensor_msgs/PointCloud2 # 点云数据(Livox自定义格式,包含更多信息) /livox/lidar_custom # livox_ros_driver2/CustomMsg # IMU数据 /livox/imu # sensor_msgs/Imu 查看点云数据: .. raw:: latex \diilbookstyleinputcell .. code:: bash # 在RViz中可视化点云 rosrun rviz rviz # 添加PointCloud2显示,设置Topic为/livox/lidar **代码示例:订阅激光雷达点云** 下面是一个订阅Mid-360点云话题并统计点数的示例代码。 Python实现使用\ ``sensor_msgs.point_cloud2``\ 模块解析点云数据。 .. raw:: latex \diilbookstyleinputcell .. code:: python #!/usr/bin/env python # -*- coding: utf-8 -*- """ 文件名: lidar_subscriber.py 功能: 订阅Livox Mid-360点云话题并统计点数 """ import rospy import sensor_msgs.point_cloud2 as pc2 from sensor_msgs.msg import PointCloud2 class LidarSubscriber: def __init__(self): rospy.init_node('lidar_subscriber_python', anonymous=True) self.pc_sub = rospy.Subscriber( '/livox/lidar', PointCloud2, self.pointcloud_callback ) rospy.loginfo("Python激光雷达订阅节点已启动,等待点云数据...") def pointcloud_callback(self, msg): try: points = list(pc2.read_points( msg, field_names=("x", "y", "z"), skip_nans=True )) num_points = len(points) if num_points > 0: x_coords = [p[0] for p in points] y_coords = [p[1] for p in points] z_coords = [p[2] for p in points] rospy.loginfo(f"收到点云: {num_points} 个点") else: rospy.logwarn("点云为空") except Exception as e: rospy.logerr(f"点云处理错误: {e}") if __name__ == '__main__': try: subscriber = LidarSubscriber() rospy.spin() except rospy.ROSInterruptException: pass **CMakeLists.txt 配置**\ : .. raw:: latex \diilbookstyleinputcell .. code:: cmake cmake_minimum_required(VERSION 3.0.2) project(lidar_subscriber) find_package(catkin REQUIRED COMPONENTS roscpp sensor_msgs pcl_ros pcl_conversions ) find_package(PCL REQUIRED) catkin_package() include_directories( ${catkin_INCLUDE_DIRS} ${PCL_INCLUDE_DIRS} ) add_executable(lidar_subscriber_cpp src/lidar_subscriber.cpp) target_link_libraries(lidar_subscriber_cpp ${catkin_LIBRARIES} ${PCL_LIBRARIES} ) **编译和运行**\ : .. raw:: latex \diilbookstyleinputcell .. code:: bash cd ~/catkin_ws catkin_make source devel/setup.bash rosrun lidar_subscriber lidar_subscriber_cpp 传感器参数对比与选型指南 ------------------------ 相机 vs 激光雷达 ~~~~~~~~~~~~~~~~ ========== =================== ============== 对比维度 相机 激光雷达 ========== =================== ============== 数据类型 图像(2D) 点云(3D) 深度信息 需计算或主动测量 直接测量 测距精度 厘米级(近距) 厘米级(全程) 测距范围 0.1~10m(深度相机) 0.1~70m+ 受光照影响 大(尤其夜间/强光) 小 信息丰富度 高(颜色、纹理) 低(仅几何) 计算负载 图像处理较重 点云处理较轻 成本 低~中 中~高 重量 轻(几十克) 较轻~中等 ========== =================== ============== 选型决策树 ~~~~~~~~~~ 根据应用场景,如果是基于目标识别/跟踪,可以选择普通RGB相机。如果涉及室内避障,以及SLAM需要深度信息的场景,选择深度相机,例如D435i或者3D激光雷达。如果是室外远距离感知,选择激光雷达,例如Mid-360。 动手实践:在Gazebo中添加传感器 ------------------------------ 现在,让我们在Gazebo仿真环境中为P450无人机添加感知传感器。我们将从简单的单目相机开始,逐步升级到D435i深度相机和Mid-360激光雷达。 理解Gazebo传感器配置 ~~~~~~~~~~~~~~~~~~~~ 在Gazebo中,传感器通过SDF(Simulation Description Format)文件描述。一个典型的传感器配置包括: .. raw:: latex \diilbookstyleinputcell .. code:: xml 更新频率 实践1:添加单目相机 ~~~~~~~~~~~~~~~~~~~ **目标**\ :在P450模型上添加一个前视单目相机 **步骤1**\ :创建相机模型文件 在\ ``~/catkin_ws/src/``\ 下创建一个新的包来存放我们的传感器配置: .. raw:: latex \diilbookstyleinputcell .. code:: bash cd ~/catkin_ws/src mkdir -p prometheus_sensor_tutorial/models/simple_camera cd prometheus_sensor_tutorial/models/simple_camera 创建\ ``model.config``\ 文件: .. raw:: latex \diilbookstyleinputcell .. code:: xml simple_camera 1.0 model.sdf Your Name A simple monocular camera for tutorial 创建\ ``model.sdf``\ 文件: .. raw:: latex \diilbookstyleinputcell .. code:: xml false 0.02 0.05 0.02 0.1 0.1 0.1 1 0.02 0.05 0.02 true 30 1.047 640 480 R8G8B8 0.1 100 gaussian 0.0 0.007 true 30.0 simple_camera image_raw camera_info camera_link **关键参数解读**\ : +--------------------------+-----------------+----------------------------------------------+ | 参数 | 值 | 说明 | +==========================+=================+==============================================+ | ``horizontal_fov`` | 1.047(弧度) | 水平视场角60°,\ :math:`\pi/3 \approx 1.047` | +--------------------------+-----------------+----------------------------------------------+ | ``width/height`` | 640/480 | VGA分辨率 | +--------------------------+-----------------+----------------------------------------------+ | ``format`` | R8G8B8 | 24位RGB格式 | +--------------------------+-----------------+----------------------------------------------+ | ``near/far`` | 0.1/100 | 成像范围0.1m~100m | +--------------------------+-----------------+----------------------------------------------+ | ``update_rate`` | 30 | 30 FPS | +--------------------------+-----------------+----------------------------------------------+ **步骤2**\ :在launch文件中加载相机 修改或创建launch文件,将相机添加到无人机模型上: .. raw:: latex \diilbookstyleinputcell .. code:: xml **步骤3**\ :验证相机数据 .. raw:: latex \diilbookstyleinputcell .. code:: bash # 启动仿真环境 roslaunch prometheus_gazebo sitl_indoor_1uav_P450.launch # 查看相机话题 rostopic list | grep camera # 使用rqt查看图像 rqt_image_view /simple_camera/image_raw 实践2:添加RealSense D435i深度相机 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Prometheus项目已经提供了D435i的Gazebo仿真插件,我们来学习如何使用它。 **步骤1**\ :查看D435i仿真模型 D435i的仿真模型位于: .. raw:: latex \diilbookstyleinputcell .. code:: bash ls ~/Prometheus/Simulator/realsense_gazebo_plugin/ **步骤2**\ :理解D435i的SDF配置 D435i的核心传感器配置(简化版): .. raw:: latex \diilbookstyleinputcell .. code:: xml 30 1.5184 640 480 R8G8B8 0.1 10 depths true 30.0 d435i color/image_raw depth/image_raw depth/points color/camera_info depth/camera_info d435i_link 0.1 10.0 **D435i仿真参数对照表**\ : ========== ========= ======== ============== 参数 真实D435i 仿真配置 说明 ========== ========= ======== ============== 深度FOV 87°×58° 87° (H) 仿真中简化 深度分辨率 1280×720 640×480 降低以提升性能 深度范围 0.1~10m 0.1~10m 一致 RGB分辨率 1920×1080 640×480 降低以提升性能 ========== ========= ======== ============== **步骤3**\ :启动带D435i的无人机 .. raw:: latex \diilbookstyleinputcell .. code:: bash # 使用Prometheus提供的launch文件 roslaunch prometheus_gazebo sitl_indoor_1uav_P450_D435i.launch **步骤4**\ :验证深度相机数据 .. raw:: latex \diilbookstyleinputcell .. code:: bash # 查看所有D435i相关话题 rostopic list | grep d435i # 查看RGB图像 rqt_image_view /d435i/color/image_raw # 查看深度图像 rqt_image_view /d435i/depth/image_raw # 在RViz中查看点云 rviz # 添加PointCloud2,Topic设为 /d435i/depth/points **代码示例:处理深度图像** 下面是一个订阅深度图像并计算平均深度的示例。 实践3:添加Livox Mid-360激光雷达 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ **步骤1**\ :查看Mid-360仿真模型 Prometheus项目中Mid-360的仿真插件位于: .. raw:: latex \diilbookstyleinputcell .. code:: bash ls ~/Prometheus/Simulator/livox_laser_gazebo_plugins/ **步骤2**\ :理解Mid-360的SDF配置 激光雷达的核心配置(简化版): .. raw:: latex \diilbookstyleinputcell .. code:: xml true 10 true 360 1 -3.14159 3.14159 16 1 -0.122 0.908 0.1 70 0.01 gaussian 0 0.03 true /livox/lidar livox_frame **Mid-360仿真参数对照表**\ : ======== =========== ======== ============ 参数 真实Mid-360 仿真配置 说明 ======== =========== ======== ============ 水平FOV 360° 360° 一致 垂直FOV -7°~+52° -7°~+52° 一致 测距范围 0.1~70m 0.1~70m 一致 点云速率 ~200k点/秒 简化 仿真性能优化 帧率 10Hz 10Hz 一致 ======== =========== ======== ============ **步骤3**\ :启动带Mid-360的无人机 .. raw:: latex \diilbookstyleinputcell .. code:: bash # 使用Prometheus提供的launch文件 roslaunch prometheus_gazebo sitl_indoor_1uav_P600_mid360.launch **步骤4**\ :验证激光雷达数据 .. raw:: latex \diilbookstyleinputcell .. code:: bash # 查看点云话题 rostopic list | grep livox # 查看点云消息类型 rostopic info /livox/lidar # 在RViz中查看点云 rviz # 添加PointCloud2,Topic设为 /livox/lidar # 设置Fixed Frame为 livox_frame 或 base_link 实践4:同时使用多个传感器 ~~~~~~~~~~~~~~~~~~~~~~~~~ 在实际应用中,我们通常需要融合多个传感器的数据。下面演示如何同时使用D435i和Mid-360。 **步骤1**\ :启动多传感器配置 .. raw:: latex \diilbookstyleinputcell .. code:: bash # 使用带有多传感器的launch文件 roslaunch prometheus_gazebo sitl_indoor_1uav_P600_multi_sensor.launch **步骤2**\ :在RViz中可视化所有传感器数据 创建一个RViz配置文件,同时显示: - RGB图像 - 深度图像 - 点云(来自D435i) - 点云(来自Mid-360) .. raw:: latex \diilbookstyleinputcell .. code:: bash # 保存RViz配置供后续使用 # File -> Save Config As -> multi_sensor.rviz **步骤3**\ :观察传感器数据特点 ========= ======================== ==================== 传感器 数据特点 适用场景 ========= ======================== ==================== D435i深度 近距离密集点云,有颜色 近距离避障、物体识别 Mid-360 远距离稀疏点云,360°覆盖 环境建图、远距离感知 ========= ======================== ==================== 小结 ---- 本节我们学习了无人机感知系统的核心内容: 1. **感知系统的作用**\ :将物理世界数字化,为定位、规划、控制提供数据 2. **视觉传感器**\ : - 单目相机:成本低,信息丰富,但缺乏深度 - 深度相机(D435i):提供RGB+深度,适合室内近距离应用 3. **激光雷达**\ : - Mid-360:360°FOV,高精度测距,适合建图和导航 4. **参数选型**\ :根据应用场景选择合适的传感器,关注FOV、分辨率、测距范围、帧率等关键参数 5. **Gazebo实践**\ :学会在仿真中配置和使用传感器,验证数据输出 练习题 ------ 基础练习 ~~~~~~~~ 1. **参数计算**\ :一个相机的水平FOV为90°,分辨率为640×480,请计算其水平方向每像素对应的角度分辨率(度/像素)。 2. **话题分析**\ :启动带D435i的仿真环境,使用\ ``rostopic hz``\ 命令测量以下话题的实际发布频率: - ``/d435i/color/image_raw`` - ``/d435i/depth/image_raw`` - ``/d435i/depth/points`` 3. **数据可视化**\ :在RViz中同时显示D435i的RGB图像和点云,截图保存。 进阶练习 ~~~~~~~~ 4. **SDF修改**\ :修改单目相机的SDF文件,将分辨率改为1280×720,FOV改为90°,验证修改是否生效。 5. **传感器对比**\ :在同一场景中,分别使用D435i和Mid-360扫描一面墙壁(距离2m),对比两者的点云密度和测距精度。 思考题 ~~~~~~ 6. 为什么D435i不适合在室外强光环境下使用?如果必须在室外使用深度感知,你会选择什么传感器? 7. Mid-360的垂直FOV是非对称的(-7°~+52°),这种设计有什么考虑?在无人机上应该如何安装才能最大化利用FOV? 8. 如果你要设计一个用于室内自主探索的无人机,你会选择哪些感知传感器?请说明理由。 延伸阅读 -------- - `Intel RealSense D435i 官方规格 `__ - `Livox Mid-360 用户手册 `__ - `Gazebo传感器教程 `__ - `ROS sensor_msgs消息定义 `__