感知系统:让无人机”看见”世界

学习目标

  • 理解无人机感知系统的作用与分类

  • 掌握相机和激光雷达的核心参数及选型依据

  • 学会在Gazebo中配置和使用感知传感器

  • 能够读取并理解传感器输出的ROS话题数据

人类通过眼睛获取外界80%以上的信息。对于智能无人机而言,感知系统就是它的”眼睛”——没有感知,无人机就无法理解周围环境,更谈不上自主飞行。本节将带你认识无人机最重要的两类感知传感器:相机激光雷达

为什么需要感知系统?

回顾上一节的无人机硬件架构图,感知系统位于整个数据流的最前端:

感知系统的核心任务是将物理世界的信息数字化,为后续的定位、规划、控制提供数据基础。

感知系统能做什么?

能力

应用场景

典型传感器

障碍物检测

避障飞行

深度相机、激光雷达

目标识别

跟踪、巡检

RGB相机 + AI

环境建图

SLAM、导航

激光雷达、双目相机

位姿估计

视觉里程计

单目/双目相机

降落标识识别

精准降落

RGB相机

感知传感器分类

根据感知维度的不同,无人机常用的感知传感器可分为两大类,二维视觉传感器,例如相机等,和三维空间传感器,例如激光雷达。接下来,我们将分别深入学习这两类传感器。

视觉传感器:相机

相机是无人机上最常见的感知传感器,成本低、信息丰富,广泛应用于目标识别、视觉定位等场景。

单目相机

单目相机是最基础的视觉传感器,它模拟人类单眼的成像过程。

成像原理

单目相机基于针孔成像模型:三维空间中的点通过光学中心投影到二维成像平面上。

成像过程的数学表达:

(1)\[\begin{split}\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}\end{split}\]

其中: - \((X, Y, Z)\) 是三维点在相机坐标系下的坐标 - \((u, v)\) 是该点在图像上的像素坐标 - \(f_x, f_y\) 是焦距(以像素为单位) - \((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. 根据视差计算深度:\(Z = \frac{f \cdot B}{d}\)\(f\)为焦距,\(B\)为基线,\(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中发布以下主要话题:

# 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

查看话题数据示例:

# 查看RGB图像话题信息
rostopic info /camera/color/image_raw

# 查看IMU数据
rostopic echo /camera/imu

代码示例:订阅相机图像

下面是一个订阅D435i RGB图像话题的示例代码。

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

运行方法

# 确保已安装依赖
pip install opencv-python rospkg

# 运行节点
python camera_subscriber.py

三维传感器:激光雷达

激光雷达(LiDAR, Light Detection and Ranging)通过发射激光束并测量反射时间来获取精确的三维距离信息。相比相机,激光雷达具有测距精度高、不受光照影响的优势。

激光雷达工作原理

激光雷达的基本原理是飞行时间法(Time of Flight, ToF)

  1. 发射激光脉冲

  2. 激光遇到障碍物后反射

  3. 接收反射激光,测量往返时间 \(\Delta t\)

  4. 计算距离:\(d = \frac{c \cdot \Delta t}{2}\)\(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中发布以下主要话题:

# 点云数据(标准格式)
/livox/lidar                     # sensor_msgs/PointCloud2

# 点云数据(Livox自定义格式,包含更多信息)
/livox/lidar_custom              # livox_ros_driver2/CustomMsg

# IMU数据
/livox/imu                       # sensor_msgs/Imu

查看点云数据:

# 在RViz中可视化点云
rosrun rviz rviz
# 添加PointCloud2显示,设置Topic为/livox/lidar

代码示例:订阅激光雷达点云

下面是一个订阅Mid-360点云话题并统计点数的示例代码。

Python实现使用sensor_msgs.point_cloud2模块解析点云数据。

#!/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 配置

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}
)

编译和运行

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)文件描述。一个典型的传感器配置包括:

<sensor name="传感器名称" type="传感器类型">
  <!-- 传感器参数 -->
  <update_rate>更新频率</update_rate>

  <!-- 传感器特有配置 -->
  <camera>
    <!-- 相机参数 -->
  </camera>

  <!-- ROS插件 -->
  <plugin name="插件名称" filename="插件文件">
    <!-- ROS话题配置 -->
  </plugin>
</sensor>

实践1:添加单目相机

目标:在P450模型上添加一个前视单目相机

步骤1:创建相机模型文件

~/catkin_ws/src/下创建一个新的包来存放我们的传感器配置:

cd ~/catkin_ws/src
mkdir -p prometheus_sensor_tutorial/models/simple_camera
cd prometheus_sensor_tutorial/models/simple_camera

创建model.config文件:

<?xml version="1.0"?>
<model>
  <name>simple_camera</name>
  <version>1.0</version>
  <sdf version="1.6">model.sdf</sdf>
  <author>
    <name>Your Name</name>
  </author>
  <description>A simple monocular camera for tutorial</description>
</model>

创建model.sdf文件:

<?xml version="1.0"?>
<sdf version="1.6">
  <model name="simple_camera">
    <static>false</static>

    <link name="camera_link">
      <!-- 相机外观 -->
      <visual name="visual">
        <geometry>
          <box>
            <size>0.02 0.05 0.02</size>
          </box>
        </geometry>
        <material>
          <ambient>0.1 0.1 0.1 1</ambient>
        </material>
      </visual>

      <!-- 相机碰撞体 -->
      <collision name="collision">
        <geometry>
          <box>
            <size>0.02 0.05 0.02</size>
          </box>
        </geometry>
      </collision>

      <!-- 相机传感器 -->
      <sensor name="camera" type="camera">
        <always_on>true</always_on>
        <update_rate>30</update_rate>

        <camera name="simple_camera">
          <!-- 图像参数 -->
          <horizontal_fov>1.047</horizontal_fov>  <!-- 60度 -->
          <image>
            <width>640</width>
            <height>480</height>
            <format>R8G8B8</format>
          </image>

          <!-- 裁剪平面 -->
          <clip>
            <near>0.1</near>
            <far>100</far>
          </clip>

          <!-- 噪声模型 -->
          <noise>
            <type>gaussian</type>
            <mean>0.0</mean>
            <stddev>0.007</stddev>
          </noise>
        </camera>

        <!-- ROS插件 -->
        <plugin name="camera_controller" filename="libgazebo_ros_camera.so">
          <alwaysOn>true</alwaysOn>
          <updateRate>30.0</updateRate>
          <cameraName>simple_camera</cameraName>
          <imageTopicName>image_raw</imageTopicName>
          <cameraInfoTopicName>camera_info</cameraInfoTopicName>
          <frameName>camera_link</frameName>
        </plugin>
      </sensor>
    </link>
  </model>
</sdf>

关键参数解读

参数

说明

horizontal_fov

1.047(弧度)

水平视场角60°,\(\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文件,将相机添加到无人机模型上:

<!-- 在无人机spawn之后添加相机 -->
<node name="spawn_camera" pkg="gazebo_ros" type="spawn_model"
      args="-sdf -file $(find prometheus_sensor_tutorial)/models/simple_camera/model.sdf
            -model simple_camera
            -x 0.1 -y 0 -z 0.05
            -reference_frame P450::base_link"/>

步骤3:验证相机数据

# 启动仿真环境
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的仿真模型位于:

ls ~/Prometheus/Simulator/realsense_gazebo_plugin/

步骤2:理解D435i的SDF配置

D435i的核心传感器配置(简化版):

<sensor name="depth_camera" type="depth">
  <update_rate>30</update_rate>
  <camera>
    <horizontal_fov>1.5184</horizontal_fov>  <!-- 87° -->
    <image>
      <width>640</width>
      <height>480</height>
      <format>R8G8B8</format>
    </image>
    <clip>
      <near>0.1</near>
      <far>10</far>
    </clip>
    <depth_camera>
      <output>depths</output>
    </depth_camera>
  </camera>

  <plugin name="depth_camera_plugin" filename="libgazebo_ros_openni_kinect.so">
    <alwaysOn>true</alwaysOn>
    <updateRate>30.0</updateRate>
    <cameraName>d435i</cameraName>
    <imageTopicName>color/image_raw</imageTopicName>
    <depthImageTopicName>depth/image_raw</depthImageTopicName>
    <pointCloudTopicName>depth/points</pointCloudTopicName>
    <cameraInfoTopicName>color/camera_info</cameraInfoTopicName>
    <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
    <frameName>d435i_link</frameName>
    <pointCloudCutoff>0.1</pointCloudCutoff>
    <pointCloudCutoffMax>10.0</pointCloudCutoffMax>
  </plugin>
</sensor>

D435i仿真参数对照表

参数

真实D435i

仿真配置

说明

深度FOV

87°×58°

87° (H)

仿真中简化

深度分辨率

1280×720

640×480

降低以提升性能

深度范围

0.1~10m

0.1~10m

一致

RGB分辨率

1920×1080

640×480

降低以提升性能

步骤3:启动带D435i的无人机

# 使用Prometheus提供的launch文件
roslaunch prometheus_gazebo sitl_indoor_1uav_P450_D435i.launch

步骤4:验证深度相机数据

# 查看所有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的仿真插件位于:

ls ~/Prometheus/Simulator/livox_laser_gazebo_plugins/

步骤2:理解Mid-360的SDF配置

激光雷达的核心配置(简化版):

<sensor name="livox_mid360" type="ray">
  <always_on>true</always_on>
  <update_rate>10</update_rate>
  <visualize>true</visualize>

  <ray>
    <scan>
      <horizontal>
        <samples>360</samples>
        <resolution>1</resolution>
        <min_angle>-3.14159</min_angle>
        <max_angle>3.14159</max_angle>
      </horizontal>
      <vertical>
        <samples>16</samples>
        <resolution>1</resolution>
        <min_angle>-0.122</min_angle>  <!-- -7° -->
        <max_angle>0.908</max_angle>   <!-- +52° -->
      </vertical>
    </scan>
    <range>
      <min>0.1</min>
      <max>70</max>
      <resolution>0.01</resolution>
    </range>
    <noise>
      <type>gaussian</type>
      <mean>0</mean>
      <stddev>0.03</stddev>
    </noise>
  </ray>

  <plugin name="livox_mid360_plugin" filename="liblivox_laser_simulation.so">
    <ray_visual>true</ray_visual>
    <topicName>/livox/lidar</topicName>
    <frameName>livox_frame</frameName>
  </plugin>
</sensor>

Mid-360仿真参数对照表

参数

真实Mid-360

仿真配置

说明

水平FOV

360°

360°

一致

垂直FOV

-7°~+52°

-7°~+52°

一致

测距范围

0.1~70m

0.1~70m

一致

点云速率

~200k点/秒

简化

仿真性能优化

帧率

10Hz

10Hz

一致

步骤3:启动带Mid-360的无人机

# 使用Prometheus提供的launch文件
roslaunch prometheus_gazebo sitl_indoor_1uav_P600_mid360.launch

步骤4:验证激光雷达数据

# 查看点云话题
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:启动多传感器配置

# 使用带有多传感器的launch文件
roslaunch prometheus_gazebo sitl_indoor_1uav_P600_multi_sensor.launch

步骤2:在RViz中可视化所有传感器数据

创建一个RViz配置文件,同时显示: - RGB图像 - 深度图像 - 点云(来自D435i) - 点云(来自Mid-360)

# 保存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图像和点云,截图保存。

进阶练习

  1. SDF修改:修改单目相机的SDF文件,将分辨率改为1280×720,FOV改为90°,验证修改是否生效。

  2. 传感器对比:在同一场景中,分别使用D435i和Mid-360扫描一面墙壁(距离2m),对比两者的点云密度和测距精度。

思考题

  1. 为什么D435i不适合在室外强光环境下使用?如果必须在室外使用深度感知,你会选择什么传感器?

  2. Mid-360的垂直FOV是非对称的(-7°~+52°),这种设计有什么考虑?在无人机上应该如何安装才能最大化利用FOV?

  3. 如果你要设计一个用于室内自主探索的无人机,你会选择哪些感知传感器?请说明理由。

延伸阅读