当前位置:   article > 正文

ardupilot开发 --- Remote ID 篇

remote id

0. 什么是 Remote ID ?

https://drone-remote-id.com/

1. 一些概念

  • 符合美国航空管理局FAA规定的一些 Remote ID 设备有哪些?
    https://uasdoc.faa.gov/listDocs

  • 欧美的Remote ID规范
    美国:先制定了ASTM F3411-22a规范; 后来为了满足NoA的要求又制定了F3586规范。
    欧洲:ASD-STAN prEN 4709-002 规范。

  • 符合中国的Remote ID的规范呢?
    民用微轻小型无人驾驶航空器运行识别最低性能要求(试行).pdf
    民用无人驾驶航空器系统安全要求.pdf
    在这里插入图片描述
    可知中国制定的Remote ID规范参考了美国和欧洲制定的规范。

  • ardupilot生态中可用的 Remote ID 设备有哪些?

    • 开源方案:OpenDroneID。
    • 闭源设备(方案),具备独立供电独立获取GPS信息,通过mavlink与autopilot连接,如:
      Aerobits idME+
      AEROENTRY remote id (Japan)
      BlueMark DroneBeacon with Battery
      BlueMark DroneBeacon External Power
      BlueMark DroneBeacon FPV
      Braveridge remote id (Japan)
      Dronetag BS
      EAMS Robotics remote id (Japan)
      TEAD remote id (Japan)
      Dronetag Mini
      Dronetag Beacon
  • OpenDroneID开源方案兼容哪些型号的硬件设备?

    • BlueMark DroneBeacon MAVLink Family(EU, US)
    • Cube ID
    • Cube ID_CAN
    • Dronetag DRI
    • Holybro Remote ID Module
    • Wurzbach Electronics
    • mRo RemoteID
    • ESP32开发板(推荐使用

2. OpenDroneID

  • OpenDroneID是实现 Remote ID的开源方案。
  • 4.2 +版本的ardupilot兼容OpenDroneID功能,连接方式:DroneCAN 或 mavlink(串口)。
  • 要适配OpenDroneID功能,ardupilot需自定义编译固件,设定一些相关的参数:
    https://ardupilot.org/dev/docs/opendroneid.html#opendroneid
  • ardupilot团队用ESP32开发了一套可以实现OpenDroneID功能的开源固件名叫 ArduRemoteID
    在这里插入图片描述

3. ArduRemoteID

4. opendroneid-core-c 库

ArduRemoteID能实现OpenDroneID主要是因为使用了这个开源库opendroneid-core-c。
该存储库提供了一个C代码函数库,用于编码和解码(打包/拆包)Open Drone ID消息,其格式在ASTM F3411 Remote ID和ASD-STAN prEN 4709-002 Direct Remote ID规范中定义。请参阅下面的规范部分中的更多详细信息。

opendroneid-core-c代码适用于通过蓝牙或Wi-Fi广播远程ID信息的实现。

在这里插入图片描述

MAVLink 和 DroneCAN 都发布了与RemoteID相关的消息集(message set),请参阅他们各自的文档。
MAVLink OpenDroneID messages
在这里插入图片描述

5. OpenDroneID 原理

飞控会通过串口向 transmitter 模块发送 MAVLink OpenDroneID messages ,或通过can口向 transmitter 模块发送 DroneCAN messages,messages 主要有以下几种类型:

  • Basicld
  • SelflD
  • OperatorlD
  • System
  • Location
  • Authentication
  • Message Pack

transmitter模块向飞控只发送一种类型的 messages:

  • ArmStatus:取值arming ok/not-ok

飞控中,DroneCAN messages 的内容是复制于 MAVLink OpenDroneID messages. 因此想要修改发送的内容,要先从MAVLink OpenDroneID messages消息改起,然后再改opendroneid-core-c中的相关代码,再根据需要改DroneCAN messages。

MAVLink OpenDroneID messages的内容格式定义遵循以下规范、标准:

  • ASTM F3411 Specification for Remote ID and Tracking
  • ASD-STAN prEN 4709-002 Direct Remote Identification

OpenDroneID所有类型的报文格式请参考:
【1】民用微轻小型无人驾驶航空器运行识别最低性能要求(试行).pdf
【2】 ASTM F3411-22a.
【3】ASD-STAN prEN 4709-002.
【5】What are ASTM and ASD-STAN Remote ID standards?
【4】查看源码 opendroneid-core-c
如 Basicld 报文:
在这里插入图片描述

6. ArduRemoteID 调试和开发

ArduRemoteID 兼容的硬件平台

  • the ESP32-S3 dev board
  • the ESP32-C3 dev board
  • a Bluemark DB110 (legacy)
  • a Bluemark DB200
  • a Bluemark DB201
  • a Bluemark DB202mav
  • a Bluemark DB210pro

以使用ESP32-S3 dev board为例

  • 固件下载
    https://github.com/ArduPilot/ArduRemoteID/releases
    推荐使用ardupilot 4.4 + ArduRemoteID 1.3
    若使用ardupilot 4.4 + ArduRemoteID 1.4 时DroneCAN node参数刷不出!!

  • 刷固件的工具
    https://www.espressif.com/en/support/download/other-tools

  • ESP32-S3固件烧录步骤

    • 将esp32-s3的usb口与pc连接
    • 首次烧录需要手动设置 ESP32-S3 进入下载模式。请按住 BOOT 按钮,同时按一下 RESET 按钮。之后,松开 BOOT 按钮。
    • 打开flash软件
      在这里插入图片描述
    • 选择型号
      在这里插入图片描述
    • 选择固件
      在这里插入图片描述
  • 编译适配OpenDroneID功能的 ardupilot 固件

    • 在SunHiTech分支的基础上修改、添加
      SunHiTech分支的创建请参考:SunHiTech分支篇
    • 在defaults.parm中添加并且将参数设置为只读@READONLY,实现重要参数防篡改:
      # RemoteID
      # 将重要参数设为只读,防止用户意外修改
      DID_ENABLE 1 @READONLY
      DID_OPTIONS 1 @READONLY
      DID_MAVPORT -1 @READONLY
      DID_CANDRIVER 1 @READONLY  # 使用can driver1
      AHRS_EKF_TYPE 3 @READONLY
      GPS_TYPE 9  # 使用can1口连接雷迅GPS: RTK 2HP
      GPS1_TYPE 9
      GPS_TYPE2 0
      GPS2_TYPE 0
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      为了开启 RemoteID 功能,这些参数是必须要提前指定的,参考
      @READONLY表示在地面站中只可读不可改。
    • 在 hwdef.dat 和 hwdef-bl.dat 中添加:
      # use a different board ID with OpenDroneID enabled
      APJ_BOARD_ID 17979
      
      # enable OpenDroneID
      define AP_OPENDRONEID_ENABLED 1
      
      • 1
      • 2
      • 3
      • 4
      • 5
      原 board ID 是1010是CUAV X7的board ID,固件开启了OpenDroneID功能后建议将Ardupilot固件和bootloader固件的board ID改为新的值,起到固件防篡改功能,避免用户将未开启OpenDroneID的飞控固件烧录进飞控,导致OpenDroneID功能异常!
    • 重新编译飞控固件和 bootloader 固件
      ./waf distclean
      ./waf configure --board SunHiTech --bootloader
      ./waf bootloader
      ./waf distclean
      ./waf configure --board=SunHiTech copter --enable-custom-controller
      
      • 1
      • 2
      • 3
      • 4
      • 5
      bootloader的烧录请参考:固件定制(OEM) 篇
  • 接线

    • 使用DroneCAN连接方式
      CUAV X7+pro飞控的can2口的CAN_L、CAN_H引脚分别与can总线收发器的canL、canH引脚连接;
      can总线收发器的CTX引脚、CRX引脚分别与esp32-s3的CAN TX引脚(即pin47)、CAN RX引脚(即pin38)连接。
      在这里插入图片描述
      在这里插入图片描述
      注意:连接到飞控的can1口或can2口都可以,因为can1口或can2口都映射到了driver1:
      CAN_P1_DRIVER = 1
      CAN_P2_DRIVER = 1
      并且driver1配置为droneCAN驱动器:
      CAN_Dx_PROTOCOL=1
    • 使用 MAVLink (串口)连接方式
      CUAV X7+pro飞控的telem2口的TX、RX引脚分别与esp32-s3的UART RX引脚(即pin17)、UART TX引脚(即pin18)连接。
      注意:若使用串口2连接,则defaults.parm要这样配置:
      DID_MAVPORT 2 @READONLY
      DID_CANDRIVER 0 @READONLY
      
      • 1
      • 2
  • 地面站 Mission Planner
    最新版本的地面站才具备 Remote Id 功能插件,下载地址
    在这里插入图片描述

  • 为PC搭建虚拟GPS
    参考
    相关软件:
    VirtualGPS 下载
    VirtualSerialPortDriver(虚拟串口工具)
    使用UDP连接将虚拟GPS信号发给 mission planner!使用com貌似不行。
    在这里插入图片描述

  • ArduRemoteID固件参数
    详细请参考 ArduRemoteID-parameters

    • 远程标识相关的参数:
      UAS_TYPE
      UAS_ID_TYPE
      UAS_ID
      ...
      如何在mission planner中配置这些参数?
      (1) 在mission planner中的Drone ID插件中可以设置部分重要的参数:
      在这里插入图片描述
      (2) 使用mission planner的SLCAN工具可以设置ArduRemoteID固件的全部参数:
      在这里插入图片描述
      在这里插入图片描述
    • 蓝牙参数、WiFi参数:
      设置蓝牙 、wifi 的功率、广播频率频率…
      在这里插入图片描述
    • 安全参数
      LOCK_LEVEL = -1,0,1,2,取值含义请参考这里
      PUBLIC_KEY1 ~ PUBLIC_KEY5= usr pub key,生成公私密钥对请参考这里
      用于ArduRemoteID固件参数防篡改,一旦LOCK_LEVEL被设置为1或2,将阻止所有通过mission planner的DroneCAN进行的ArduRemoteID固件参数更新。此时修改ArduRemoteID固件参数的方法只能通过Secure Parameter Update的方式,并且需要知道与PUBLIC_KEY1 ~ PUBLIC_KEY5至少其中之一对应的私钥才可修改,下面会介绍Secure Parameter Update。
      • LOCK_LEVEL= -1
        可通过USB、UART、Web Server 加载ArduRemoteID固件;
        通过Web Server 加载固件时,跳过签名检测,跳过board ID检测;
        可以使用正常手段修改ArduRemoteID固件参数,如mission planner的SLCAN和HUB界面的Remote ID插件。
      • LOCK_LEVEL=0
        可通过USB、UART、Web Server 加载ArduRemoteID固件;
        通过Web Server 加载固件时,需要进行签名检测、board ID检测;
        可以使用正常手段修改ArduRemoteID固件参数,如mission planner的SLCAN和HUB界面的Remote ID插件。
      • LOCK_LEVEL=1
        可通过USB、UART、Web Server 加载ArduRemoteID固件;
        通过Web Server 加载固件时,进行签名检测、board ID检测;
        只能通过Secure Parameter Update方式修改ArduRemoteID固件参数。
      • LOCK_LEVEL=2
        只能通过Web Server 加载ArduRemoteID固件;
        通过Web Server 加载固件时,需要进行签名检测、board ID检测;
        只能通过Secure Parameter Update方式修改ArduRemoteID固件参数。
    • ArduRemoteID参数的枚举可以参考这里,简述如下:
      self.OpenDroneID_settings = mp_settings.MPSettings([
             MPSetting("rate_hz", float, 0.1),
             MPSetting("location_rate_hz", float, 1.0),
             # BASIC_ID
             MPSetting("UAS_ID_type", int, 0, choice=[("None",0), ("SerialNumber",1), ("CAA", 2), ("UTM_ASSIGNED", 3), ("SessionID", 4)]),
             MPSetting("UAS_ID", str, ""),
             MPSetting("UA_type", int, 0, choice=[("None",0), ("Aeroplane",1), ("HeliOrMulti",2),
                                             ("GyroPlane",3), ("HybridLift",4), ("Ornithopter",5),
                                             ("Glider",6), ("Kite",7), ("FreeBalloon",8), ("CaptiveBalloon",9),
                                             ("Airship", 10), ("Parachute",11), ("Rocket",12),
                                             ("TetheredPowered", 13), ("GroundObstacle", 14)]),
             # SELF_ID
             MPSetting("description_type", int, 0, choice=[("Text",0), ("Emergency",1), ("ExtendedStatus", 2)]),
             MPSetting("description", str, ""),
             # SYSTEM
             MPSetting("area_count", int, 1),
             MPSetting("area_radius", int, 0),
             MPSetting("area_ceiling", int, -1000),
             MPSetting("area_floor", int, -1000),
             MPSetting("category_eu", int, 0, choice=[("Undeclared",0), ("Open",1), ("Specific",2), ("Certified",3)]),
             MPSetting("class_eu", int, 0),
             MPSetting("classification_type", int, 0, choice=[("Undeclared",0),("EU",1)]),
             # OPERATOR_ID
             MPSetting("operator_location_type", int, 0, choice=[("Takeoff",0),("LiveGNSS",1),("Fixed",2)]),
             MPSetting("operator_id_type", int, 0),
             MPSetting("operator_id", str, ""),
             ])
         self.OpenDroneID_vehicle_settings = mp_settings.MPSettings([
             MPSetting("UAS_ID", str, ""),
             MPSetting("lock_id", int, 0),
             ])
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
  • Web Server 和 Firmware Signing
    Web Server:网络服务
    Firmware Signing:固件签名
    ArduRemoteID会创建一个wifi热点,wifi名称和密码对应WIFI_SSIDWIFI_PASSWORD参数。
    PC连接上这个热点后可以访问http://192.168.4.1 网页,实现对ArduRemoteID固件的网络更新!
    但是,Web Server 只能加载被签名的固件,即OTA固件,OTA即Over The Air.
    如何实现固件签名?固件OTA?

    ArduRemoteID/scripts/sign_fw.py ArduRemoteID_ESP32S3_DEV_OTA.bin MyName_private_key.dat 1
    
    • 1

    其中:

    • MyName_private_key.dat 是与ArduRemoteID固件参数PUBLIC_KEY1 ~ PUBLIC_KEY5其中之一对应的私钥,可以使用ArduRemoteID/scripts/generate_keys.py生成公私密钥对。
    • 上述命令行最后的 1 是ESP32-S3的board ID,可在ArduRemoteID/RemoteIDModule/board_config.h中查看具体值。
    • LOCK_LEVEL 设置为 -1 会忽略OTA检测,可以通过Web Server加载未签名的固件。
  • 参数安全更新(Secure Parameter Update)
    两种方法:使用 DroneCAN GUI工具 或 ArduRemoteID/scripts/secure_command.py
    推荐使用前者,因为本人试验后者时没成功!

    • 使用 secure_command.py
      scripts/secure_command.py mavcan::14550 --bus-num=1 --private-key my_private_key.dat --target-node=125 UAS_TYPE=3
      
      • 1
      scripts/secure_command.py mavcan:udpout:support.ardupilot.org:AAAAA --signing-passphrase=XXXXXXX --target-node=NNN --private-key=my_private_key.dat UAS_TYPE=3
      
      • 1
      其中:
      my_private_key.dat 是参数PUBLIC_KEY1 ~ PUBLIC_KEY5其中之一对应的私钥,可以使用ArduRemoteID/scripts/generate_keys.py 生成公私密钥对,如:
      ./ArduRemoteID/scripts/generate_keys.py usrName
      
      • 1
    • 使用 DroneCAN GUI工具(推荐使用
      • 下载:DroneCAN GUI for windows
      • 打开飞控的SLCAN功能
        1)CAN_SLCAN_CPORT = 1
        2)重启飞控
        3)CAN_SLCAN_SERNUM = 0 这个参数在飞控重启后会被重置为-1
        4)不要重启飞控
        5)断开飞控与mission planner的连接
      • 打开DroneCAN GUI ,选择正确的Bus Number,点ok
        因为本人的ESP32与飞控的CAN2连接,因此这里Bus Number应该设置为2,如果连接的是CAN1口,这设置为1:
        在这里插入图片描述
      • 设置一个合适的Local node ID,并按下
        在这里插入图片描述
      • 调出RemoteID Panel,选择正确的NID,选择正确私钥,填入指令,点击发送,查看状态:
        在这里插入图片描述
        其中,设置参数的命令格式为: PARAMETERNAME=VALUE
        注意:如果status提示timeout或其他,多按几次发送直到提示ACCEPTED.
      • 查看参数是否修改成功
        使用mission planner 查看,或者使用DroneCAN GUI查看:
        在这里插入图片描述
        在这里插入图片描述
    • Problem shooting
      • 生成密钥对时报错:
        在这里插入图片描述
        原因:pymonocypher版本不正确建议安装pymonocypher3.1.0.0:
        python3 -m pip uninstall pymonocypher
        python3 -m pip install pymonocypher==3.1.0.0
        
        • 1
        • 2
      • 修改参数时报错:
        在这里插入图片描述
        在这里插入图片描述
  • mission planner 中的 remote ID 插件

    • 如果ArduRemoteID固件参数没有被设置过例如UAS_TYPE=NONE,Drone ID 插件通过droneCAN message的方式将参数传递给ArduRemoteID固件参数;ArduRemoteID固件参数一旦被设置,Drone ID 插件的值将不会被写入ArduRemoteID固件参数中而是保持第一次设置的值,但是OpenDroneID OSM还是会交替显示这个新设置的USA_ID!
    • 直接使用SLCAN工具设置ArduRemoteID固件的参数后,不会在Drone ID 插件界面显示!如果Drone ID 插件中的值没有被设置地面站还会报这种类似的警告:
      在这里插入图片描述
      解决办法是在Drone ID 插件界面再设置一下,设置成与固件参数同。
    • 如何触发紧急状态?
      双击此处,或在operations中设置。
      在这里插入图片描述
  • 最低性能要求(试行)】的报文类型与【MAVLink OpenDroneID messages】不相符?
    在这里插入图片描述
    上图中的绿色箭头表示的报文是否是对应关系?要对比 MAVLink OpenDroneID messages 中的报文定义和 xxx最低性能要求(试行).pdf 中的报文格式才懂:
    答案是肯定的!!
    运行描述报文与SelfID报文对应:
    在这里插入图片描述
    系统报文:
    在这里插入图片描述

  • 其他

7. wifi协议 简述

https://zhuanlan.zhihu.com/p/660568077

  • AP
    无线接入点
    路由器
  • STA
    站点
    接入路由器的终端
  • SSID
    标识符
    无线网络的名称
  • 信标祯 Beacon
    AP通过广播Beacon祯来告诉想要接入者(STA)无线网络的信息,如SSID
  • WLAN数据帧
    Wi-Fi网络中传输数据时所使用的数据帧格式。
    管理帧、控制帧、数据帧
    管理帧:用来完成AP和终端发现、认证、关联、接入,包含帧头帧尾和帧体,如Beacon属于管理祯。
    控制帧:用于清除信道、获取信道并提供单播帧确认。控制帧只有帧头帧尾,没有帧体。
    数据帧:data帧和null帧。
  • 连接过程
    在这里插入图片描述
  • 报文、帧、数据包等的区别
    民用无人驾驶航空器系统安全要求.pdf
    民用微轻小型无人驾驶航空器运行识别最低性能要求(试行).pdf
    wifi协议收发数据的单位是:帧(包括管理祯,控制祯,数据帧)
    远程标识要求:飞机以wifi协议,以发送信标祯(beacon)的方式来广播远程标识信息。即:将要发送的包含远程标识信息的数据(这些数据成为报文)封装到beacon祯中。
    要发送的报文数据总共分为以下几类:
    在这里插入图片描述
    beacon祯的格式要求:
    在这里插入图片描述

如果觉得这篇文章对你有用,请动动您发财的小手指:关注、点赞、收藏。谢谢您咧!

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/925466
推荐阅读
相关标签
  

闽ICP备14008679号