无人机按点飞行脚本

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

【 AR眼镜】核心技术详解:硬件架构、核心算法、应用场景与发展趋势

【 AR眼镜】核心技术详解:硬件架构、核心算法、应用场景与发展趋势

文章目录 * 目录 * 引言 * 一、AI眼镜核心硬件架构 * 二、AI眼镜核心技术栈(软件+算法) * 2.1 环境感知技术(核心:计算机视觉) * 2.2 AI计算技术(核心:边缘智能) * 2.3 人机交互技术(核心:自然交互) * 三、AI眼镜软件生态与应用场景 * 3.1 软件生态架构 * 3.2 核心应用场景(行业+消费) * 四、AI眼镜关键技术挑战与解决方案 * 五、AI眼镜未来发展趋势 * 5.1 技术趋势 * 5.2 行业趋势 * 六、总结 目录 引言 若对您有帮助的话,请点赞收藏加关注哦,

1200PLC与爱普生机器人modbus_TCP通讯

1200PLC与爱普生机器人modbus_TCP通讯

1.前言 首先申明一下我的硬件信息 机器人:C4-A601S 控制器:RC700 PLC:西门子S7-1200(CPU:1217C/DC/DC/DC) 2.控制器IP地址查看及修改 在配置控制器相关信息时需要先用网线连接PC与机器人控制器连接,爱普生机器人出厂设定网址为192.168.0.1(我这里是之前修改过了) 若默认没有显示以太网连接,点击右侧的增加,选择“通过以太网连接到控制器”后点击确定 如果控制器网址被修改过了,不知道是多少,可以用一根PC线,一头接在控制器的“开发用PC连接专用USB端口”另一头接在电脑USB口 这时候再在通讯处选择USB连接就可以通上了 现在就可以在“系统配置”处看到控制器的IP地址以及相关信息了,如果有需要也可以直接在这修改IP地址。 3.机器人控制器配置 网线连接好后开始配置通讯相关信息 1.控制设备 控制设备修改为远程I/O 2.现场总线 现场总线类型修改为“Modbus TCP”

AI无人机赋能乡村道路管护构建智慧交通的“最后一公里“新范式,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建公共交通道路场景下路面缺陷病害智能化检测预警系统

AI无人机赋能乡村道路管护构建智慧交通的“最后一公里“新范式,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建公共交通道路场景下路面缺陷病害智能化检测预警系统

在乡村振兴战略的推进过程中,"村村通"工程作为连接城乡的重要纽带,已实现全国98%以上的行政村通硬化路。然而,随着农村公路里程的快速增长,传统人工巡检模式逐渐暴露出效率低、覆盖难、响应慢等痛点。当AI技术遇上低空无人机,一场乡村道路管护的智能化革命正在悄然发生,为破解农村交通治理难题提供了创新方案。 一、传统巡检之困:乡村道路管护的"阿喀琉斯之踵" 农村公路具有"点多、线长、面广"的典型特征,全国农村公路总里程已突破450万公里。传统人工巡检模式下,养护队伍需定期徒步或驾车巡查,日均巡检里程不足20公里,且受地形限制,桥梁涵洞、临水临崖等特殊路段存在巡检盲区。某农业大省调研显示,农村公路病害发现平均滞后周期达47天,裂缝发展成坑槽的比例高达63%,直接导致养护成本增加3-5倍。 更严峻的是,农村地区技术人才短缺,巡检人员平均年龄超过50岁,对裂缝宽度、沉陷深度等关键指标的判断依赖经验,数据记录仍采用纸质台账,难以实现病害发展的动态追踪。这种"被动式"

OpenClaw 飞书机器人搭建流程

OpenClaw 飞书机器人搭建流程

OpenClaw 飞书机器人搭建流程 手把手教你搭建属于自己的飞书 AI 机器人! 一、创建企业自建应用 首先进入飞书开发者后台: 👉 https://open.feishu.cn/app 填写应用名称和描述,直接点击创建即可。 创建完成后,会自动生成 App ID 和 App Secret,这两个凭证后面配置 OpenClaw 时会用到,先记下来。 二、添加机器人能力 在应用详情页左侧菜单找到「机器人」,点击添加。 添加成功后,机器人就可以在飞书中被搜索和使用了。 三、开通消息权限 进入「权限管理」,找到 im: 相关权限,全部勾选。 ⚠️ 注意:以下这个权限建议不要勾选: 获取群组中所有消息(im:message.group_msg) 否则群里所有消息机器人都会收到并响应,会造成不必要的干扰。