无人机按点飞行脚本

#!/usr/bin/env python
# 指定使用系统中的 python 解释器来运行该脚本(Linux 下 ROS 必须)

import rospy
# ROS 的 Python 客户端库,用于节点、话题、服务等操作

import mavros
# MAVROS 的 Python 接口库,用于和飞控(PX4/ArduPilot)通信

from geometry_msgs.msg import PoseStamped
# 引入带时间戳的位姿消息,用于发布位置控制指令

from mavros_msgs.msg import State
# 引入飞控状态消息(连接状态、模式、解锁状态等)

from mavros_msgs.srv import CommandBool, SetMode
# 引入解锁服务(CommandBool)和模式切换服务(SetMode)

from geometry_msgs.msg import Point
# 引入三维点类型(这里其实没用到,可以删)

# ---------------- 全局变量 ----------------

current_state = State()
# 保存当前飞控状态的全局变量

# ---------------- 回调函数 ----------------

def state_callback(state):
    global current_state
    # 声明使用全局变量 current_state

    current_state = state
    # 将订阅到的飞控状态保存到全局变量中

# ---------------- MAVROS 命名空间 ----------------

mavros.set_namespace()
# 设置 MAVROS 命名空间(一般为 /mavros)

des_pos = PoseStamped()
# 期望位置(目标点),用于 offboard 位置控制

# ---------------- 订阅 & 发布 ----------------

state_sub = rospy.Subscriber(
    'mavros/state',
    State,
    callback=state_callback
)
# 订阅飞控状态话题 /mavros/state

position_pub = rospy.Publisher(
    'mavros/setpoint_position/local',
    PoseStamped,
    queue_size=10
)
# 发布本地坐标系下的位置期望,用于 OFFBOARD 模式

# ---------------- 服务客户端 ----------------

arming_drone = rospy.ServiceProxy(
    '/mavros/cmd/arming',
    CommandBool
)
# 解锁/上锁飞控的服务客户端

setting_mode = rospy.ServiceProxy(
    'mavros/set_mode',
    SetMode
)
# 设置飞控模式(如 OFFBOARD)的服务客户端

# ---------------- 主控制函数 ----------------

def offb_control_sample():
    print("Init Node: Offboard_node")
    # 打印提示信息

    rospy.init_node('Offboard_node', anonymous=True)
    # 初始化 ROS 节点,节点名为 Offboard_node

    prev_state = current_state
    # 保存之前的状态(这里实际上没用到)

    rate = rospy.Rate(20.0)
    # 设置循环频率为 20Hz(OFFBOARD 至少 2Hz,推荐 >10Hz)

    # -------- 初始目标点 --------
    des_pos.pose.position.x = 0
    des_pos.pose.position.y = 0
    des_pos.pose.position.z = 1
    # 设置初始目标位置:起飞到高度 1 米

    # -------- 等待飞控连接 --------
    while(not rospy.is_shutdown() and not current_state.connected):
        print("Waiting for FCU connection")
        # 如果还未连接飞控,持续等待

        rate.sleep()
        # 按 20Hz 睡眠,避免死循环

    print("FCU connected")
    # 成功连接飞控

    # -------- OFFBOARD 前必须先发送一段 setpoint --------
    for i in range(60):
        # 发送 60 次位置指令(约 3 秒)

        if(rospy.is_shutdown()):
            break
            # 如果 ROS 被关闭,跳出循环

        position_pub.publish(des_pos)
        # 发布目标位置

        rate.sleep()

    print("Switching to offboard Mode")
    # 提示:开始切换 OFFBOARD 模式

    setting_mode(base_mode=0, custom_mode="OFFBOARD")
    # 请求切换飞控模式为 OFFBOARD

    last_request = rospy.get_rostime()
    # 记录当前时间

    while((rospy.get_rostime() - last_request) < rospy.Duration(2.0)):
        # 持续 2 秒发布 setpoint,防止 OFFBOARD 失效

        position_pub.publish(des_pos)
        rate.sleep()

    print("Arming the drone on offboard Mode")
    # 提示:在 OFFBOARD 模式下解锁电机

    if current_state.mode == "OFFBOARD":
        # 确认当前模式是 OFFBOARD

        arming_drone(True)
        # 解锁飞控(电机上电)

    # -------- 起飞并悬停 --------
    print("Take off to Point 1")

    last_request = rospy.get_rostime()

    while((rospy.get_rostime() - last_request) < rospy.Duration(8.0)):
        # 持续 8 秒向飞控发送起飞目标点

        position_pub.publish(des_pos)
        rate.sleep()

    # -------- 飞往第二个点 --------
    print("Fly to Point 2")

    des_pos.pose.position.x = 0
    des_pos.pose.position.y = 0.5
    des_pos.pose.position.z = 1
    # 修改目标点坐标

    last_request = rospy.get_rostime()

    while((rospy.get_rostime() - last_request) < rospy.Duration(2.0)):
        position_pub.publish(des_pos)
        rate.sleep()

    # -------- 飞往第三个点 --------
    print("Fly to Point 3")

    des_pos.pose.position.x = 0.5
    des_pos.pose.position.y = 0.5
    des_pos.pose.position.z = 1

    last_request = rospy.get_rostime()

    while((rospy.get_rostime() - last_request) < rospy.Duration(2.0)):
        position_pub.publish(des_pos)
        rate.sleep()

    # -------- 飞往第四个点 --------
    print("Fly to Point 4")

    des_pos.pose.position.x = 0.5
    des_pos.pose.position.y = 0
    des_pos.pose.position.z = 1

    last_request = rospy.get_rostime()

    while((rospy.get_rostime() - last_request) < rospy.Duration(2.0)):
        position_pub.publish(des_pos)
        rate.sleep()

    # -------- 返回起点 --------
    print("Fly back to Point 1")

    des_pos.pose.position.x = 0
    des_pos.pose.position.y = 0
    des_pos.pose.position.z = 1

    last_request = rospy.get_rostime()

    while((rospy.get_rostime() - last_request) < rospy.Duration(3.0)):
        position_pub.publish(des_pos)
        rate.sleep()

    # -------- 任务结束 --------
    print("Vehicle Landing")
    # 注意:这里只是打印,没有真正发送降落指令

    print("Mission End")

# ---------------- 程序入口 ----------------

if __name__ == '__main__':
    try:
        offb_control_sample()
        # 调用主控制函数
    except rospy.ROSInterruptException:
        pass
        # 捕获 ROS 中断异常,防止程序崩溃
 

🔍 关键理解点(帮你快速吃透)

  • OFFBOARD 必须持续发布 setpoint(否则会自动退出)
  • 解锁前必须已经是 OFFBOARD
  • PoseStamped 使用的是 本地坐标系(ENU)
  • 这个程序 没有真正降落,只是结束了任务

发 setpoint(>2Hz)
        ↓
切 OFFBOARD
        ↓
确认 mode == OFFBOARD
        ↓
解锁(Arming)
 

Read more

手把手教你使用 YOLOv11/v8 算法 + PaddleOCR 算法完成车牌检测和车牌识别系统,AI智能体,毛玻璃系统,包括PaddlePaddle安装、数据集预处理、模型训练、AI大模型应用等

手把手教你使用 YOLOv11/v8 算法 + PaddleOCR 算法完成车牌检测和车牌识别系统,AI智能体,毛玻璃系统,包括PaddlePaddle安装、数据集预处理、模型训练、AI大模型应用等

前言 车牌识别系统是智能交通、安防监控等领域的关键技术,结合深度学习方法可提升识别模型准确率。本文基于YOLOv11/v8 目标检测模型与PaddleOCR 文本识别模型结合,实现端到端的车牌定位与字符识别。之前出过一期基于YOLOv11+CNN 车牌识别系统,链接如下: * 手把手教你完成基于YOLOv11+CNN车牌识别系统,Opencv车牌矫正,基于深度学习的车牌识别系统 由于 YOLOv11+CNN 车牌识别系统对倾斜角度较大和模糊的图片识别效果不佳、识别车牌单一、界面功能和样式单一等问题,本期将进行升级,本期整合了 YOLOv8/YOLOv11 + PaddleOCR + PySIde6 搭建一个车牌识别系统,有用户端系统+后台管理系统。技术路线如下: 1. 先利用YOLOv8/YOLOv11 算法定位车牌位置 2. 把检测到车牌输入到PaddleOCR 网络进行字符识别,整个过程一气呵成,只需训练 YOLOv8/YOLOv11 车牌检测模型即可,如果有时间也可以训练自己的 PaddleOCR 车牌字符识别模型。 3. 最后就是模型可视化与应用,

UnityMCP+Claude+VSCode,构建最强AI游戏开发环境

UnityMCP+Claude+VSCode,构建最强AI游戏开发环境

* 前言 * 一、UnityMCP+Claude+VSCode,构建最强AI 游戏开发环境 * 1.1 介绍 * 1.2 使用说明及下载 * 二、VSCode配置 * 2.1 连接UnityMCP * 2.2 在VSCode中添加插件 * 2.3 Claude安装 * 2.4 VSCode MCP配置 * 2.5 使用Claude开发功能 * 三、相关问题 * 总结 前言 * 本篇文章来介绍使用 UnityMCP+Claude+VSCode,打造一个更智能、高效的游戏开发工作流。 * 借助MCP工具,Claude可以直接与Unity编辑器进行双向指令交互,开发者则可以直接使用自然语言进行Unity游戏开发。 * 这一组合充分利用了AI的代码生成、问题诊断与创意辅助能力,极大提升了Unity项目的开发效率与质量。 一、UnityMCP+Claude+

别再贴字幕了!Naiz AI:从语义到像素,全链路重构你的“数字孪生”

别再贴字幕了!Naiz AI:从语义到像素,全链路重构你的“数字孪生”

Naiz AI:打破语言边界,正在重新定义“全球视频内容”的表达主权 当传统翻译还在为对齐字幕发愁时,Naiz AI 已经让你的视频在 100 种语言里不仅“说得溜”,还实现了“口型完美同步”:你的声音,在全球任何角落听起来都像母语。 一、一场让内容创作边界消失的“技术海啸” 2026 年,视频创作领域迎来了一场前所未有的范式转移。如果说过去的视频出海是“戴着枷锁起舞”,那么 Naiz AI 的出现就是彻底打碎了那把名为“语言”的锁。 这不是简单的翻译工具,这是一个现象级的全球表达引擎: * 📈 爆发式增长: 仅仅数月,Naiz AI 处理的视频时长已跨越百万小时,将原本昂贵的专业人工配音周期从“周”缩短到了“分钟”。 * 🌟 顶级创作者的共同选择: 无论是追求极致音质的 YouTube 科技博主,还是需要跨国协作的顶级智库,Naiz AI 的

人工智能:自然语言处理在客户服务领域的应用与实战

人工智能:自然语言处理在客户服务领域的应用与实战

人工智能:自然语言处理在客户服务领域的应用与实战 学习目标 💡 理解自然语言处理(NLP)在客户服务领域的应用场景和重要性 💡 掌握客户服务领域NLP应用的核心技术(如聊天机器人、情感分析、意图识别) 💡 学会使用前沿模型(如BERT、GPT-3、Transformer)进行客户服务文本分析 💡 理解客户服务领域的特殊挑战(如对话上下文、用户意图多样性、实时性要求高) 💡 通过实战项目,开发一个智能客户服务聊天机器人应用 重点内容 * 客户服务领域NLP应用的主要场景 * 核心技术(聊天机器人、情感分析、意图识别) * 前沿模型(BERT、GPT-3、Transformer)在客户服务领域的使用 * 客户服务领域的特殊挑战 * 实战项目:智能客户服务聊天机器人应用开发 一、客户服务领域NLP应用的主要场景 1.1 聊天机器人 1.1.1 聊天机器人的基本概念 聊天机器人是能够模拟人类对话的计算机程序。在客户服务领域,聊天机器人的主要应用场景包括: * 自动应答:回答用户的常见问题 * 任务处理: