UAVCAN 配置 - Arudcopter

UAVCAN 配置

本文提供指导在Ardupilot上设置UAVCAN协议

Tips:首先UAVCAN协议应该被使能,应该参照CAN Bus Setup
详细的UAVCAN协议:https://uavcan.org/

CAN Bus Setup

本文主要教如何设置CAN bus ,并且哪些选项是必须设置的
使能CAN接口

每个物理端口能用CAN_PX_DRIVER参数关闭或者连接到相应的驱动,这里的X代表端口号,CAN_PX_DRIVER参数的值是驱动的ID。

  • 例子:最普通的设置为:有一个驱动并且所有的接口都连接上去,CAN_P1_DRIVER和 CAN_P2_DRIVER都应该设为1(第一个驱动)
    avatar
  • 改完记得重启
配置CAN接口

当使能CAN接口后,接着开始设置

  • CAN_PX_BITRATE 设置所需的传输速率,默认为1Mbit传输速率。
  • CAN_PX_DEBUG 允许输出调试信息
  • 当接口和驱动相关联,驱动将加载特定的协议
    UAVCAN 配置 - Arudcopter_第1张图片
CAN驱动的配置

配置CAN_PX_PROTOCOL参数,X代表驱动号

  • 设置如下:
    CAN_P1_PROTOCOL 1
    CAN_P2_PROTOCOL 0
  • 使能后代表将用虚拟驱动的协议
  • 重启设备

UAVCAN配置

目前有三个参数要设置

  • CAN_DX_UC_NODE 为 autopilot的节点ID
  • CAN_D1_UC_ESC_BM 使能发送ESC命令的bitmast
  • CAN_D1_UC_SRV_BM 使能发送servo命令的bitmast
    avatar
  • 为了节约带宽 CAN_D1_UC_ESC_BM和CAN_D1_UC_SRV_BM 应该设置为仅仅需要发送的马达或者servo信道信号
  • 例如在信道1、2、4配置CANservos,在信道3上配置ESC马达
    CAN_D1_UC_SRV_BM = 0x0B
    CAN_D1_UC_ESC_BM = 0x04

GNSS接收配置

若是GNSS连接到UAVCAN上,应该使能GPS子组参数,TYPE参数应该设置为9,对应Autopilote 的GNSS接收器

  • 配置如下图
    avatar

APM:

  • http://ardupilot.org/copter/docs/common-uavcan-setup-advanced.html#common-uavcan-setup-advanced
  • http://ardupilot.org/copter/docs/common-canbus-setup-advanced.html#common-canbus-setup-advanced

####CAN_D1_Parameters

  • CAN_D1_PROTOCOL:使能D1协议

CAN_D1_UC_Parameters

  • CAN_D1_UC_NODE:设置UAVCAN节点 (Range 1-250)
  • CAN_D1_UC_SRV_BM:RC输出通道
  • Bitmask
    0: Servo 1, 1: Servo 2, 2: Servo 3, 3: Servo 4, 4: Servo 5, 5: Servo 6, 6: Servo 7, 7: Servo 8, 8: Servo 9, 9: Servo 10, 10: Servo 11, 11: Servo 12, 12: Servo 13, 13: Servo 14, 14: Servo 15
  • CAN_D1_UC_ESC_BM:RC输出通道
  • Bitmask
    0: ESC 1, 1: ESC 2, 2: ESC 3, 3: ESC 4, 4: ESC 5, 5: ESC 6, 6: ESC 7, 7: ESC 8, 8: ESC 9, 9: ESC 10, 10: ESC 11, 11: ESC 12, 12: ESC 13, 13: ESC 14, 14: ESC 15, 15: ESC 16
  • CAN_D1_UC_SRV_RT:Servo输出速率 Range 1-200

####CAN_D2_Parameters
*

#CAN bus and UAVCAN protocol

Ardupilot里面支持CAN总线依赖两个部分

  1. 由HAL drivers支持的硬件CAN总线;
  2. UAVCAN协议,为了处理高水平工作。

#Ardupilot中支持的CAN总线
硬件CAN总线位于AP_HAL ku库中,由以下两个部分组成:

  1. CAN class 硬件和软件的连接
  2. CANManager class 用于封装所有的物理接口,提供可入点

接下来有指导,UAVCAN用于新的硬件,CAN 总线驱动实施roadmap:

CAN class

新的class应该基于AP_HAL::CAN class,该类负责管理硬件、RX和TX队列以及时间管理。必要的方法如下:

  • 构造函数(Constructor)
  • int init(const uint32_t bitrate, const OperatingMode mode)
    使用特定的bitrate和操作模式初始化硬件CAN控制器。 驱动程序应尝试尽可能接近地匹配指定的bitrate。操作模式可以是允许发送帧的正常模式,也可以是仅用于接收帧的静音模式。此函数仅在begin()内部使用。
  • bool begin(uint32_t bitrate)
    此函数应该用指定的bitrate初始化CAN接口
  • void end()
    完成CAN接口的实例化
  • void reset()
    用之前的设置去重新初始化接口
  • bool is_initialized()
    若是CAN接口初始化成功则返回ture
  • int32_t available()
    此函数返回RX队列的长度。
  • int32_t tx_pending()
    此函数返回要传输的消息数
  • bool canAcceptNewTxFrame(const uavcan::CanFrame& frame)
    如果可以将用于发送的新消息放入TX队列,则此函数返回true。
  • bool isRxBufferEmpty()
    检查Rx队列是否为空的函数
  • uint64_t getErrorCount()
    硬件故障总数和其他类型的错误(例如队列溢出)。如果接口未连接到总线,则可能会持续增加。
  • uint32_t getVoluntaryTxAbortCount()
    驱动程序执行库在第一次错误时中止传输的要求的次数。
  • unsigned getRxQueueLength()
    返回Rx队列中待处理的帧数。
  • bool hadActivity()
    从上一次调用此函数开始是否iface至少有一次成功的IO,这个设计为用IFACE LEDs.
  • int16_t send(const uavcan::CanFrame& frame, uavcan::MonotonicTime tx_deadline, uavcan::CanIOFlags flags)
    将新帧放入发送队列。还提供最大传输截止日期,若是超过最大截止日期,则将帧从队列中移除。这个flags可以是none或Loopback或AbortOnError的组合。
  • int16_t receive(uavcan::CanFrame& out_frame, uavcan::MonotonicTime& out_ts_monotonic, uavcan::UtcTime& out_ts_utc, uavcan::CanIOFlags& out_flags)
    该函数使用RX队列中的第一条消息填充传递的引用中的所有数据。

CANManager class

新class应该基于AP_HAL::CANManager class
必要的函数如下:

  • 构造函数(Constructor)
  • int init(const uint32_t bitrate, const PX4CAN::OperatingMode mode, uint8_t can_number)
    使用指定的bitrate和操作模式初始化指定的CAN接口。此方法仅仅在begin()函数内使用。
  • bool begin(uint32_t bitrate, uint8_t can_number)
    此函数应尝试使用指定的比特率初始化指定的CAN接口。
  • uavcan::CanSelectMasks makeSelectMasks(const uavcan::CanFrame* (&pending_tx)[uavcan::MaxCanIfaces])
    此函数返回选择掩码,指示哪些接口可用于读/写。
  • PX4CAN* getIface(uint8_t iface_index)
    返回对指定接口的引用
  • uint8_t getNumIfaces()
    返回接口数
  • bool hadActivity();
    自上次调用此方法以来,是否至少有一个iface至少有一个成功的IO。这设计为用iface活动的LEDs
  • bool is_initialized() override;
    若是CAN manager已经成功初始化则返回真。
  • void set_UAVCAN(AP_UAVCAN *uavcan)
    将指针存储到UAVCAN实例
  • AP_UAVCAN *get_UAVCAN(void)
    返回指向与此管理器连接的UAVCAN实例的指针

UAVCAN protocol

AP_UAVCAN class 是UAVCAN协议的基础,它负责通过CAN总线使用UAVCAN协议发送消息,接收消息,将消息转换为其他库可接受的形式,并提供Libuavcan的循环更新。
其支持以下消息:

  • 将1010.ArrayCommand传输到伺服系统
  • 接收1001.MagneticFieldStrength
  • 接受1028.StaticPressure
  • 接收1029.StaticTemperature
  • 将1030.RawCommand传输到ESC
  • 从GNSS收到1060.Fix
  • 从GNSS接收1061.Auxiliary
    在AP_UAVCAN类中处理所有传入消息,并将消息转换为最适合其他库的形式。 使用或传输数据的库不应包含来自UAVCAN模块的UAVCAN头文件,而应以所希望的方式将所有数据发送到AP_UAVCAN类。

初始化描述

以下初始化基于Pixhawk硬件,并作为示例提供。
UAVCAN 配置 - Arudcopter_第2张图片
根据电路板和底层硬件的类型,可能需要采取其他操作来创建CAN驱动程序和UAVCAN接口类。

你可能感兴趣的:(UAV,UAVCAN)