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(第一个驱动)
- 改完记得重启
配置CAN接口
当使能CAN接口后,接着开始设置
- CAN_PX_BITRATE 设置所需的传输速率,默认为1Mbit传输速率。
- CAN_PX_DEBUG 允许输出调试信息
- 当接口和驱动相关联,驱动将加载特定的协议
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
- 为了节约带宽 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接收器
- 配置如下图
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总线依赖两个部分
- 由HAL drivers支持的硬件CAN总线;
- UAVCAN协议,为了处理高水平工作。
#Ardupilot中支持的CAN总线
硬件CAN总线位于AP_HAL ku库中,由以下两个部分组成:
- CAN class 硬件和软件的连接
- 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硬件,并作为示例提供。
根据电路板和底层硬件的类型,可能需要采取其他操作来创建CAN驱动程序和UAVCAN接口类。