ardupilot开发 --- CAN BUS、DroneCAN 、UAVCAN 篇

1. CAN BUS、DroneCAN 、UAVCAN 区别

  • UAVCAN是一种轻量级协议,旨在通过CAN BUS 在航空航天和机器人应用中实现可靠通信。 UAVCAN网络是分散的对等网络,其中每个对等体(节点)具有唯一的数字标识符 - 节点ID,并且仅需要为基本设置设置一个参数。有关协议的详细说明,请访问https://uavcan.org/
  • DroneCAN的前身是UAVCAN。
  • 物理连接为CAN BUS,使用DroneCAN协议(驱动);
  • 如 CAN_P1_DRIVER=1, 即物理接口CAN1使用的是CAN_D1_PROTOCOL设置的驱动程序(数据交互协议)。
  • 大多数自动驾驶仪都有一个或两个CAN接口,用于连接不同的设备。ArduPilot最多可支持3个can接口。除了物理接口之外,还有一个表示特定协议的驱动器层和一个通过这些驱动器在CAN总线上通信的软件层(ArduPilot)。

2. CAN 总线设置

3. DroneCAN(UAVCAN)设置

4. CANDrone 实践记录

  • 物理层:
    大多数运行ArduPilot的自动驾驶仪都有一个或两个CAN接口,用于连接不同的设备。ArduPilot最多可支持3个can接口。接口的设置可以提供冗余或最大吞吐量或两者的混合。这是通过三层方法实现的,除了物理接口之外,还有一个表示特定协议的驱动层和一个通过这些驱动程序在CAN总线上通信的软件层(ArduPilot)
    驱动层:
  • 软件层(ardupilot层)
    每个物理接口可以虚拟地连接到最多三个驱动程序中的一个,这些驱动程序代表要使用的协议。例如,最常见的情况是所有接口都连接到DroneCAN驱动器。这种设置将为具有最多三个CAN接口的设备提供冗余,并为具有一个CAN接口设备提供完整功能。
  • 每个物理端口都可以通过参数can_Px_driver关闭或连接到相应的驱动器,其中x是can端口的编号。该参数的值是将与该端口(接口)关联到驱动器的id。
  • 每个启用的总线/驱动器将使用一块RAM存储器(而非闪存),具体取决于驱动器的类型以及是否启用了CANFD。例如,DroneCAN默认情况下会为其驱动程序分配12KB(如果是CANFD,则为24K),但如果由其硬件定义文件设置,则根据其默认值,不同的板可能会有所不同。CAN_Dx_UC_POOL参数可用于更改池大小。所需的池大小取决于所连接的DroneCAN外围设备所需的总线流量,有时对于GPS或Compass等外围设备可以减少,而ESCs等外围设备需要更多的总线流量从而需要更大的池大小
  • 例如,最常见的设置将有一个驱动程序,所有接口都将连接到它。此配置中的CAN_P1_driver和CAN_P2_driver参数应设置为1(第一个驱动程序)。并且该驱动程序(CAN_D1_PROTOCOL)被设置为1(DroneCAN)。
  • 更改任何CAN_Px_DRIVER或CAN_Dx_PROTOCOL后,必须重新启动自动驾驶仪才能进行更改。
  • 启用接口并重新启动后,可以为每个启用的接口再设置两个参数:
    CAN_Px_BITRATE - sets the desired rate of transfer on this interface
    AN_Px_DEBUG - allows output of debug messages
    当任何接口与任何驱动程序关联时,该驱动程序将加载指定的协议
  • 应该将驱动程序设置为使用某些协议。目前支持DroneCAN设备,编号为1,以及许多CAN ESCs和其他设备。参数CAN_Dx_PROTOCOL,其中x是驱动程序的编号,应填写该驱动程序的协议编号。协议更改后,必须重新启动自动驾驶仪才能进行更改。
  • CAN ESCs:ESCs and Motors — Copter documentation (ardupilot.org)
  • Dronecan
    DroneCAN是一种轻量级协议,旨在通过CAN总线在航空航天和机器人应用中进行可靠通信。DroneCAN网络是一个去中心化的对等网络,其中每个对等(节点)都有一个唯一的数字标识符—node ID,这是基本设置只需要设置的一个参数。
    Detailed description of protocol can be found at https://uavcan.org/
    DroneCAN Adapter Node
  • 节点适配器
    用途:
    将 UART ports, I2C, SPI, and/or GPIOs设备映射成dronecan设备与飞控连接。例如:当飞控串口用完时可以用此节电器拓展串口。
  • 2HPGPS 使用can通信提示Node ID 冲突的解决办法:
    Ardupilot检测到candrone设备就会在database中记录一个node id,由于调试频繁插拔了can设备,导致多次记录相同的node id,因此会提示node id冲突。配置参数CAN_Dx_UC_OPTION即可解决问题:
    在这里插入图片描述
  • 2HP GPS使用串口通信,GPS的罗盘无法识别?Ardupilot中只有GPS驱动没有有该磁罗盘型号的驱动?在线编译时没勾选??

5. SLCAN 工具

mission planner 中的 SLCAN 工具可以让 mission planner 访问连接到飞控的DroneCAN外设(DroneCAN node),以实现参数修改、固件更新等功能。
mission planner 连接DroneCAN外设有两种方法:

  • Using SLCAN directly
  • Using SLCAN over MAVLink

前者请参考
推荐使用后者:
(1)飞控通过USB连接PC后,mission planner 中将会出现两个Ardupilot连接:

  • Ardupilot mavlink
  • Ardupilot SLCAN
    在这里插入图片描述
    其中Ardupilot mavlink是missionplanner与飞控的正常连接;
    Ardupilot SLCAN则用于SLCAN连接。
    在4.5或更高版本,这两个连接都可以用作SLCAN和GCS的正常连接。

(2)任选其一,点击连接
(3)显示连接到的 can port1 或 can port2 的所有DroneCAN node

在这里插入图片描述
(4)查看 CAN bus上的 mavlink 消息
在这里插入图片描述)
在这里插入图片描述)
(5)如何回到正常连接 mission planner ?
切换到其他 tab,两秒后重新连接!!

6. 修改DroneCAN外设固件的参数

6.1 使用 mission planner

在这里插入图片描述

6.2 使用 DroneCAN GUI

参考:DroneCAN GUI
前提:打开SLCAN功能。

  • CAN_SLCAN_CPORT = 1
  • reboot
  • CAN_SLCAN_SERNUM = 0
  • Do not reboot
  • disconnect the mission planner
    使用步骤:
    (1)断开 mission planner
    (2)打开DroneCAN GUI ,选择对应的端口,点ok
    在这里插入图片描述
    (3)

下载:

  • windows
  • Linux: python3 -m pip install dronecan_gui_tool dronecan
### Ardupilot飞控系统的CAN通信协议详解 #### 1. CAN总线支持概述 为了使ArduPilot能够通过CAN总线与其他设备进行高效可靠的通信,必须先启用对CAN的支持。这涉及到硬件配置以及软件层面的初始化工作[^3]。 #### 2. 启用CAN接口 在启动过程中,`AP_HAL_ChibiOS::init()`函数会调用一系列子程序来完成外设初始化,其中包括检测并激活可用的CAN控制器。对于特定板级定义文件中声明过的每一个CAN端口,在此阶段都会被逐一检查其是否存在并且可以正常运作;一旦确认无误,则继续执行后续操作以准备接收来自外部节点的消息流。 #### 3. 配置UAVCAN网络参数 当成功启用了某个或多个物理层连接之后,下一步就是设定逻辑上的属性——即所谓的“Node ID”。该数值在整个分布式系统内唯一标识了一个参与者,并作为消息路由的基础依据之一。此外还有其他一些重要的选项可供调整,比如心跳报文发送间隔时间、错误帧重发次数上限等等,这些都可以根据实际应用场景的需求灵活定制化设置。 #### 4. 实现数据交换机制 基于上述准备工作完成后,就可以着手构建具体的应用层功能了。例如,在处理遥测信息上传方面,可以通过订阅感兴趣的主题(Topic),从而获取到由地面站或者其他传感器所发布的最新测量结果;而对于指令下达而言,则往往采用发布命令的方式向目标对象传达控制意图。值得注意的是,由于采用了面向服务架构(Service-Oriented Architecture),因此无论是哪种形式的操作都离不开严格遵循既定的标准流程来进行交互对话。 ```cpp // 示例代码展示如何注册一个简单的回调函数用于监听指定主题下的新消息到达事件 void setup() { uavcan_node_init(); // 假设我们关心名为"sensor_data"的话题... uavcan_subscriber_t subscriber; uavcan_register_handler(&subscriber, "sensor_data", handle_sensor_update); } static void handle_sensor_update(const uint8_t* data, size_t length) { // 解析接收到的有效载荷部分并将解析后的结构体成员赋值给本地变量 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值