拓冰建站拓冰建站
首页 / 资讯中心 / 正文

飞行救生机器人自主导航搜救技术链路与ROS2实现解析

飞行救生机器人不是把救生圈绑在无人机上那么简单。它要在湖泊、近海或洪水区域完成巡航搜索、识别落水人员、自主靠近、稳定悬停并投放救生圈最后还能自主返航。整个过程涉及目标检测、视觉测距、SLAM建图、路径规划、飞行控制和投放执行等多个子系统任何一个环节断掉都无法形成完整的搜救能力。对开发者来说理解这条技术链路比单独学某一个算法更重要。这篇文章围绕国产AI飞行救生机器人的“自主导航搜救”这一核心能力拆解系统架构、开发环境、核心代码、仿真验证和常见排查方法适合正在学习机器人导航、ROS2、无人机应用开发的读者。在大众印象里救生圈是静态浮具无人机是航拍工具但“会飞的救生圈”把两者的使用场景叠加了救生圈不再等待人工抛投而是由机器人自主送到落水者身边。实现这个目标需要无人机具备环境感知、自身定位、路径规划、目标识别和投放执行五种基础能力。对于开发者最值得研究的不是某个单一算法而是这些能力如何在一个任务链里被组织起来。1. 飞行救生机器人搜救系统先看清完整技术链路1.1 会飞的救生圈本质是一台自治无人飞行器从飞行器形态看会飞的救生圈通常基于多旋翼无人机平台机身中部或下方预留救生圈挂载与投放结构。多旋翼的优势是垂直起降、悬停稳定、低速机动性好适合在河道、湖泊、近岸水域执行定点投放任务。固定翼虽然续航久但无法在水面小范围悬停并精确投放所以搜救场景普遍以多旋翼为主。自治能力是整个系统的关键。普通遥控无人机需要操作员持续干预而飞行救生机器人要求的是“自主导航搜救”机器人收到任务后自行规划巡航路线自行识别水面目标自行靠近落水人员最后在合适高度释放救生圈。操作员只负责任务下达和关键节点确认不负责每个微操。从软件角度看这类系统不是单一程序而是多个计算单元的集合子系统主要任务关键输入关键输出感知层识别障碍物、落水人员、水面边界摄像头、激光雷达、毫米波雷达目标框、障碍物坐标、深度信息定位层求解无人机在地图中的位置和姿态IMU、GPS、雷达/视觉里程计位置、速度、姿态、协方差建图层生成水域周边环境的地图雷达、视觉点云栅格地图、拓扑地图规划层生成可行且安全的飞行路径地图、当前位置、目标点全局路径、局部轨迹控制层把规划结果转换为飞行指令期望位置/速度/航向电机转速控制信号投放层准确释放救生圈目标坐标、高度、任务状态机舵机/电磁铁控制信号这张表可以帮助开发者建立全局观每个模块之间通过消息传递任何模块的延迟或错误都会影响整条任务链。1.2 自主搜救对无人机的硬件和软件提出更高要求自主搜救不是“飞过去、丢下去”这么简单。它在硬件和软件上都有明确要求。硬件层面载重能力必须覆盖救生圈的重量还要预留执行机构、传感器和电池的余量。水域环境通常缺少特征点纯视觉定位容易漂移因此很多方案会组合使用GPS、惯性测量单元、气压计甚至激光雷达。投放机构需要避免误触发不能在空中巡航时意外丢圈也不能在目标很近时释放失败。通信链路至少要有遥测返回便于地面站确认任务状态。软件层面系统要有明确的状态管理。搜救过程不是一条直线可能出现目标丢失、信号弱、风速突变、投放失败等情况。设计良好的状态机可以让机器人从错误状态回到安全状态例如返航到待命点而不是继续执行无效目标。1.3 一条完整搜救链路可以拆成六个环节把任务分解后一条典型搜救链路如下任务下达地面站或调度中心把搜救区域边界和起点发送给机器人。起飞与巡航机器人按命令起飞沿规划航线扫描水面。目标识别感知模块通过摄像头和AI模型发现落水人员生成像素坐标。自主接近结合测距和定位估计目标真实位置生成新的导航目标点并飞近。悬停投放到达有效投放范围后调整航向执行投放并记录投放状态。返航或继续搜索投放成功后可以选择返航也可以继续搜索下一个目标。这个链路既是产品功能主线也是开发主线。学习时可以把每个环节拆出来单独实现最后再合并成完整任务。后面章节的环境准备、代码实现和排查方法都围绕这条主线展开。2. 从零搭建自主导航搜救系统的开发环境2.1 ROS2、仿真器和飞控的常见组合开发这类系统最常用的软件底座是ROS2原因有三个第一ROS2提供了标准的话题、服务和动作通信机制感知、导航、控制各节点可以解耦开发第二机器人导航相关的SLAM建图和Nav2导航栈都有成熟实现第三仿真器可以代替真实飞行器完成大部分算法验证降低试错成本。常见组合是Ubuntu 22.04、ROS2 Humble、Gazebo仿真器再加上开源飞控软件PX4或ArduPilot。如果重点研究导航算法也可以用ROS2 Nav2 Gazebo在仿真环境里先跑轮式机器人再迁移到多旋翼模型。飞行救生机器人的核心算法在“自主导航”和“目标识别”两层和底层电机控制关系不大所以初学者可以先把飞控细节放在后面。2.2 安装ROS2和Gazebo并验证发布订阅本文示例以Ubuntu 22.04和ROS2 Humble为例。安装桌面版ROS2和常用导航仿真组件sudo apt update sudo apt install -y ros-humble-desktop sudo apt install -y ros-humble-gazebo-ros-pkgs ros-humble-nav2-bringup ros-humble-cartographer执行下面命令让当前终端加载ROS2环境source /opt/ros/humble/setup.bash如果不想每个终端都手动source可以写入用户配置文件。注意这些包名在不同ROS2版本里略有差异换用其他发行版前要重新确认包名。安装完成后先做一个最基础的验证打开一个终端运行“海龟”示例再打开另一个终端发布一个指令确认ROS2通信正常。ros2 run turtlesim turtlesim_node另一个终端发送旋转指令ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist {linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.0}}看到小乌龟按预设速度运动说明ROS2发布订阅链路可用。搜救系统中摄像头图像、目标坐标、位置信息都会以类似方式在节点间传递先跑通这个例子可以排除通信配置问题。2.3 项目目录结构建议自主导航搜救系统通常分成多个功能包。下面是一种适合学习的目录结构rescue_robot/ ├── rescue_bringup/ # 启动文件、组合节点 ├── rescue_perception/ # 目标检测、视觉测距 ├── rescue_navigation/ # SLAM、Nav2参数、目标点发布 ├── rescue_mission/ # 任务状态机 ├── rescue_drop/ # 救生圈投放执行 ├── rescue_gazebo/ # 仿真模型、环境启动文件 └── rescue_msgs/ # 自定义消息实际项目不必严格照搬但建议按功能拆分包。拆分的好处是每个包可以单独测试感知错误不会影响导航导航错误不会影响状态机。如果所有代码都放在一个包里定位问题时很难确定崩溃来源。3. 感知层设计让机器人认出落水人员和救生圈投放点3.1 基于YOLO的目标检测节点感知层的首要任务是识别水面落水人员。传统图像处理方法受光照、水波、倒影影响很大当前主流方案是使用深度学习目标检测模型。YOLO是这类任务里常用的一族模型因为它推理速度快、部署简单适合在机载计算单元或地面站运行。在ROS2中一个目标检测节点通常负责四件事订阅摄像头图像、调用检测模型、过滤低置信度结果、发布目标位置信息。import rclpy from rclpy.node import Node from sensor_msgs.msg import Image from geometry_msgs.msg import PointStamped from cv_bridge import CvBridge import cv2 from ultralytics import YOLO class PersonDetector(Node): def __init__(self): super().__init__(person_detector) self.bridge CvBridge() self.model YOLO(yolov8n.pt) self.conf_threshold 0.45 self.person_class 0 self.sub self.create_subscription(Image, /camera/image_raw, self.image_callback, 10) self.pub self.create_publisher(PointStamped, /detected_person, 10) def image_callback(self, msg): frame self.bridge.imgmsg_to_cv2(msg, bgr8) results self.model(frame, verboseFalse) for r in results: for box in r.boxes: cls int(box.cls[0]) conf float(box.conf[0]) if cls self.person_class and conf self.conf_threshold: x1, y1, x2, y2 map(int, box.xyxy[0]) center_x (x1 x2) // 2 center_y (y1 y2) // 2 point PointStamped() point.header.stamp self.get_clock().now().to_msg() point.header.frame_id camera_link point.point.x float(center_x) point.point.y float(center_y) point.point.z float(conf) self.pub.publish(point)这里的代码思路是先从ROS2图像消息转换成OpenCV图像再通过YOLO模型推理最后把目标中心像素坐标和置信度包装成PointStamped发布出去。需要注意几点yolov8n.pt是一个轻量模型权重文件实际部署前要用水域行人数据重新训练否则水面场景漏检会非常严重。发布的是像素坐标不是真实世界坐标导航模块不能直接使用后续还要做坐标转换。检测频率要匹配相机帧率过度使用高帧率模型会增加机载计算负担。3.2 深度估计与相对坐标转换像素坐标只能告诉机器人“目标在画面中哪里”不能告诉机器人“目标在哪个经纬度”。要完成自主接近必须把像素坐标转换成无人机机体坐标系或地图坐标系下的三维坐标。深度值可以来自激光雷达、毫米波雷达、双目视觉或单目深度估计。常见做法是先用深度传感器获得目标中心点在相机坐标系下的深度z_c再结合相机内参反算出三维坐标x_c (center_x - cx) * depth / fx y_c (center_y - cy) * depth / fy z_c depth其中cx、cy、fx、fy是相机内参。拿到相机坐标系下的三维坐标后还需要通过TF变换转到机体坐标系和地图坐标系。ROS2中可以用tf2_ros的变换查询接口完成from tf2_ros.buffer import Buffer from tf2_ros.transform_listener import TransformListener import tf2_geometry_msgs self.tf_buffer Buffer() self.tf_listener TransformListener(self.tf_buffer, self) point_map self.tf_buffer.transform(point_camera, map, timeoutrclpy.duration.Duration(seconds1.0))这里的关键不是手动算矩阵而是让TF树正确维护“相机-机体-地图”的坐标关系。如果TF树不完整转换一定失败。实际报错时经常出现Lookup would require extrema change或frame_id does not exist要优先检查各传感器和车体之间的静态TF发布。3.3 目标丢失时的置信度处理水面目标容易被波浪遮挡也会出现检测器间歇性漏检。如果每次目标丢失就立刻放弃任务反复切换机器人就在原地兜圈。合理做法是维护目标生命期连续多帧检测到目标才认定目标存在连续多帧丢失才认定目标消失。状态可以这样设计目标未见持续搜索不切换任务状态。目标候选单帧检测到目标但置信度不够或帧数不足。目标确认连续N帧检测到目标发布目标坐标并进入接近流程。目标丢失确认过目标后连续M帧未检测到标记为丢失可选重新搜索。这个机制能显著减少误触发。真实搜救中误检测比漏检测更危险机器人可能对着水面反光投放救生圈而真正的落水者还在远处。4. 定位与建图SLAM是自主导航的地基4.1 为什么搜救场景离不开SLAMGPS在开阔水域可能有效但桥梁下方、堤坝附近、森林河道里容易丢星或产生漂移。纯GPS无法提供足够稳定的定位SLAM通过融合雷达、视觉、IMU和GPS维护机器人在地图中的位置。在水域搜救场景SLAM的主要任务是构建岸线、桥梁、船只、障碍物周围的环境地图并实时估计无人机位置。有了地图Nav2才能规划出避开岸边树木、电线、船只的飞行路径。没有地图目标点只是一个抽象坐标无人机无法理解“前方是否有障碍物”。常用工具包括Cartographer、gmapping和基于视觉的ORB-SLAM。室内小范围常用gmapping户外大型场景更常用Cartographer因为它支持多传感器融合和回环检测。飞行救生机器人工作范围较大本文示例以Cartographer为主。4.2 Cartographer和Nav2的典型参数Cartographer的配置分成两个文件.lua文件定义传感器和建图参数.launch.py负责启动。一个简化的Cartographer配置示例include map_builder.lua include trajectory_builder.lua options { map_builder MAP_BUILDER, trajectory_builder TRAJECTORY_BUILDER, map_frame map, tracking_frame base_link, published_frame base_link, odom_frame odom, provide_odom_frame true, publish_frame_projected_to_2d true, use_odometry true, use_nav_sat true, use_landmarks false, num_laser_scans 1, num_multi_echo_laser_scans 0, num_subdivisions_per_laser_scan 1, num_point_clouds 1, lookup_transform_timeout_sec 0.2, submap_publish_period_sec 0.3, pose_publish_period_sec 5e-3, trajectory_publish_period_sec 30e-3, } pose_graph { optimize_every_n_nodes 10, constraint_builder { loop_closure_translation_weight 1.1e4, loop_closure_rotation_weight 1e5, }, }参数不是越多越好。调试时可以重点关注optimize_every_n_nodes这个值越小回环优化越频繁但计算量也越大。水面环境传感器噪声大可以适当调大回环权重但不要一次改太多否则地图可能完全变形。地形图构建完成后Nav2需要接收地图并发布目标点。Nav2的规划器配置通常在YAML文件中planner_server: ros__parameters: expected_planner_frequency: 1.0 planner_plugins: [GridBased] GridBased: plugin: nav2_navfn_planner/NavfnPlanner tolerance: 0.5 controller_server: ros__parameters: controller_plugins: [FollowPath] FollowPath: plugin: nav2_regulated_pure_pursuit_controller/RegulatedPurePursuitController4.3 建图完成后如何保存地图并给导航使用Cartographer建图完成后需要保存地图供Nav2启动时加载。常用命令ros2 run nav2_map_server map_saver_cli -f map执行后生成map.pgm和map.yaml两个文件。map.yaml包含分辨率、原点、占用概率阈值等信息启动导航时必须保证机器人起始位置和地图原点一致否则定位会从错误位置开始。加载地图的启动参数示例ros2 launch nav2_bringup localization_launch.py map:/path/to/map.yaml如果地图无法加载优先检查文件路径、YAML中的image字段路径以及地图文件权限。很多新手在仿真中地图加载失败并不是算法问题而是路径写错了。5. 搜救任务状态机从起飞到返航的每个动作5.1 状态定义与任务流程机器人不会自动知道“什么时候该飞行、什么时候该投放”这些逻辑需要任务状态机统一调度。状态机是飞行救生机器人能够按顺序完成搜救的核心骨架。可以把任务状态定义为状态进入条件动作退出条件IDLE系统启动等待任务指令收到调度指令TAKEOFF任务开始起飞到巡航高度高度到达SEARCH到达搜索区域沿航线巡航、检测目标目标确认APPROACH目标确认发布目标点飞向目标距离阈值内HOVER_DROP达到投放距离悬停、稳定姿态、投放投放完成RETURN投放完成/任务中断返回起飞点到达降落点LAND到达降落点降落并关闭动力系统停止每次状态切换都要有明确条件避免在条件不满足时跳转。尤其要从APPROACH回到SEARCH必须设置超时防止目标确认后又丢失导致死循环。5.2 用Python状态机组织逻辑在ROS2中可以用rclpy直接实现一个简单状态机。下面是一个精简示例用于说明状态切换逻辑不包含完整的飞控接口import rclpy from rclpy.node import Node from geometry_msgs.msg import PoseStamped, PointStamped from std_msgs.msg import String class RescueMission(Node): def __init__(self): super().__init__(rescue_mission) self.state IDLE self.goal_pub self.create_publisher(PoseStamped, /goal_pose, 10) self.drop_pub self.create_publisher(String, /drop_cmd, 10) self.target None self.distance 999.0 self.create_subscription(PointStamped, /detected_person, self.target_cb, 10) self.create_timer(0.5, self.state_machine) def target_cb(self, msg): self.target msg def set_goal(self, x, y, yaw0.0): goal PoseStamped() goal.header.frame_id map goal.pose.position.x x goal.pose.position.y y self.goal_pub.publish(goal) def state_machine(self): if self.state IDLE: self.state TAKEOFF self.get_logger().info(TAKEOFF) elif self.state TAKEOFF: self.state SEARCH self.get_logger().info(SEARCH) elif self.state SEARCH: if self.target is not None: self.state APPROACH self.get_logger().info(APPROACH) elif self.state APPROACH: self.set_goal(self.target.point.x, self.target.point.y) if self.distance 10.0: self.state HOVER_DROP self.drop_pub.publish(String(datadrop)) self.get_logger().info(HOVER_DROP) elif self.state HOVER_DROP: self.state RETURN self.get_logger().info(RETURN)这段代码把目标点直接发布到/goal_pose由Nav2去执行路径规划。状态机本身不关心底层飞行控制只关心“接下来该发布什么命令”。这种解耦方式很适合团队协作导航组负责保证/goal_pose可执行任务组负责决定什么时候发布。实际项目里不能直接使用self.distance这个固定值它应该由订阅的里程计或TF计算得到。这里列出来的目的是展示状态切换骨架不是可直接上机的完整代码。5.3 投放机构的控制和安全互锁救生圈投放不能只在状态机里加一条消息。真实系统中投放执行器必须满足多重条件机器人处于悬停姿态。高度在投放允许范围内。地面站授权投放。投放机构自检正常。满足条件后控制舵机或电磁铁释放救生圈。投放完成后还需要通过限位传感器或电流反馈确认救生圈已经离机而不是只看命令发出。下面的代码片段演示了投放逻辑的基本判断def check_drop_allowed(self, altitude, attitude): return (self.state HOVER_DROP and 2.0 altitude 8.0 and abs(attitude.roll) 0.1 and abs(attitude.pitch) 0.1)如果多个条件同时满足才发送投放指令就可以大幅降低误投放概率。切记不要把“检测到目标”当成“可以投放”的唯一条件高度和姿态不满足时救生圈可能被抛到离落水者很远的地方甚至砸到人。6. 在Gazebo中仿真验证整条搜救链路6.1 搭建简易水域环境和落水人员模型仿真验证不需要一开始就完全复刻真实水域。可以先用一个平坦地面或水面world文件放置几棵树、一台无人机模型和一个模拟落水目标。Gazebo中水面模型、浮力模型会增加建模复杂度初学者可以先使用普通平面代替重点验证“感知-导航-投放”逻辑是否跑通。启动一个Gazebo环境并加载无人机的命令因机型而异常见方式是通过ros2 launch启动一个预先写好的world和无人机模型ros2 launch rescue_gazebo rescue_world.launch.py如果启动过程出现模型加载失败优先检查模型路径和GAZEBO_MODEL_PATH环境变量。Gazebo最常见的问题是路径配置错误导致模型没有加载进世界而不是代码逻辑问题。6.2 运行建图、导航和投放流程仿真中验证整条链路需要按顺序执行三个服务启动建图控制无人机在环境中飞行一圈生成地图。保存地图加载到Nav2定位模块。启动目标检测和任务状态机发布模拟目标并观察无人机是否接近投放。导航模块启动后可以用ros2 topic pub手动发布一个目标点来验证路径规划ros2 topic pub --once /goal_pose geometry_msgs/msg/PoseStamped {header: {frame_id: map}, pose: {position: {x: 5.0, y: 3.0, z: 1.0}, orientation: {z: 0.0, w: 1.0}}}如果无人机可以规划出路径并移动到目标点说明导航链路正常。接着再检查目标检测节点能否在图像中识别预设目标并输出/detected_person话题。只有当导航和目标检测都正常任务状态机才有意义。6.3 验证结果与关注指标仿真不是“机器人动了”就算成功还要记录一组可量化指标指标含义合格参考目标检测准确率识别出落水人员的帧数占有效帧比例尽量高以专项测试为准目标确认延迟从首次检测到进入APPROACH状态的耗时越小越好路径规划成功率发送目标点后成功生成路径的比例越高越好定位漂移量同一位置重复观测的坐标偏差越小越好投放位置误差实际投放点与目标点距离越小越好如果投放位置误差过大可能是目标坐标转换错误也可能是定位漂移或者状态机在未完全达到目标时就触发了投放。先横向切分问题再逐步定位。7. 自主导航搜救常见的定位和导航问题排查7.1 地图漂移和定位跳变现象机器人原地不动但Rviz中位姿不断变化或者飞行一段距离后地图和目标位置出现明显错位。可能原因很多常见的有传感器外参标定不准雷达或相机与机体的TF关系错误。IMU数据噪声大未进行有效的滤波和校准。建图时运动太快帧间匹配失败。水面反射激光或视觉特征点太少回环检测失效。检查方式先在静止状态下观察定位话题的方差确认IMU是否稳定。然后慢速移动看里程计输出是否连续。再到Rviz中观察TF树和点云对齐情况。处理建议严格执行外参标定建图时控制移动速度避免急加速。水域环境可以补充视觉特征或毫米波雷达减少对单一传感器的依赖。7.2 路径规划失败或目标不可达现象发布目标点后Nav2报错无法规划路径或者路径明显绕远、撞障碍物。排查顺序建议检查地图是否完整是否存在大片未知区域。未知区域会被当作不可通过区域处理。检查机器人半径是否设置过大导致窄通道无法通过。检查目标点是否落在障碍物内部。查看机器人当前位置是否和地图匹配。Nav2日志中如果出现No valid path found优先检查代价地图的膨胀半径和地图加载是否正确。飞行器在三维空间中运动导航配置还需要考虑高度维度的搜索不是单纯2D代价地图可以覆盖的。实际项目中要用3D体素地图或分层规划策略。7.3 投放误触发与传感器异常现象救生圈在巡航途中意外释放或到达目标点后没有释放。误触发的原因通常是状态机条件写得不完整例如只要检测到目标就进入投放状态而没有检查高度、姿态和地面站授权。没有释放的原因可能是投放执行器电流不足、舵机卡死或者控制指令参数错误。检查方式先看/drop_cmd话题是否发出再看执行器反馈话题是否收到。如果命令没到问题在状态机如果命令到了执行器不动问题在硬件或动力系统。仿真中则要检查执行器模型是否连接了正确的控制话题。7.4 排查优先级和日志采集面对自主导航系统故障不要一上来就改算法。一个可复用的排查顺序是数据输入是否正确图像话题有没有数据GPS是否有效传感器频率是否正常。TF树是否完整执行ros2 run tf2_tools view_frames生成TF图检查坐标关系。功能包是否启动齐全导航、感知、状态机是否都正常运行。日志关键字搜索error、warning、no path、timeout等关键字。仿真与真机差异仿真中正常但真机异常时检查传感器噪声模型和电机响应差异。建议把所有节点的重要事件写入ros2 bag这样故障发生后可以回放数据复现定位漂移或路径规划异常而不是靠操作人员回忆现场。8. 从仿真走向生产环境的最佳实践8.1 仿真无法覆盖的冗余和安全设计仿真环境通常没有传感器噪声、风速突变、通信延迟和电池衰减所以不能把仿真成功直接等同于真机可用。转入真机前要增加四类保障传感器冗余GPS、IMU、视觉、雷达至少保证两个以上独立定位源。执行冗余投放指令要有自检反馈舵机卡死时能识别并报警。能源冗余低电量时必须优先返航不能为了继续搜救而耗尽电量。通信冗余地面站失联时要自动切换到预设安全点返航或原地悬停。飞行救生机器人属于应急救援设备安全性优先级高于功能完整性。投放失败可以重新投放炸机则意味着任务彻底失败。8.2 通信链路、地面站和人工接管自主导航不等于无人值守。在搜救场景中地面站仍然要显示机器人位置、摄像头画面、剩余电量、任务状态和执行机构状态。操作员在关键时刻有权接管控制权。设计上要注意三点手动接管权限必须高于自动任务但接管时不能造成姿态跳变。地面站应显示当前状态机所处状态而不是只显示“正在执行任务”。控制指令和状态反馈要走独立通道避免地面站拥堵时丢失关键控制。8.3 开发学习路线建议如果你是从零开始学这类系统建议按下面顺序进阶先跑通ROS2基础通信和TF变换理解节点、话题、服务、动作。在Gazebo中给一个轮式机器人添加激光雷达完成SLAM建图和Nav2自主导航。把轮式机器人替换成无人机模型加入高度控制。接入视觉目标检测节点把像素坐标转换成导航目标点。最后加入救生圈投放机构做完整的任务状态机和安全互锁。不要一开始就追求完整复刻一台产品级飞行救生机器人。从“能在仿真里自主起飞、识别目标并投放”到“能在真实水域完成搜救”中间还隔着大量工程化工作但这条学习路径能让你在最短时间内跑通核心链路。完成仿真项目后最好的下一步是寻找一个可靠的多旋翼开发平台先做小范围悬停、航线飞行、定点投放实验再逐步增加自主能力最终把“会飞的救生圈”做成一个稳定、可解释、可维护的机器人系统。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门