闫刚 px4_uavcan_dsdl的原理

资源

文件名: px4_uavcan_dsdl.md
标题 : 闫刚 px4_uavcan_dsdl的原理

简介

DSDL包含了UAVCAN的所有数据结构, 它是python写的自动化生成头文件hpp的工具。学会它,我们基本可以了解到UAVCAN中最核心的通信结构。
UAVCAN如何生成头文件hpp ?带着疑问,我们找到一些突破点

1. cannode构建分析

1.1 找到uavcan的单板

查找nuttx-config下的cannode的板子,找到单板cannode-v1, 由于px4cannode-v1是基于UAVCAN典型的1个例子,
编译整个make px4cannode-v1, 注意,px4cannode-v1这个单板的构建是通过ninja构建,一般的makefile可能编译不过

1.2 分析一下UAVCAN下的CAMKE

$ vi ./libuavcan/CMakeLists.txt

  • DSDLC_INPUTS = test/dsdl_test/root_ns_a" “test/dsdl_test/root_ns_b” "${CMAKE_CURRENT_SOURCE_DIR}/…/dsdl/uavcan
  • DSDLC_OUTPUT = “include/dsdlc_generated”
  • 从这里,我们基本就可以知道,这个DSDL基本的工作就是把输入文件转换成头文件,我也知道了输入文件的路劲,保存到了 D S D L C I N P U T S 这 个 环 境 变 量 中 , 输 出 文 件 保 存 到 了 {DSDLC_INPUTS} 这个环境变量中, 输出文件保存到了 DSDLCINPUTS{DSDLC_OUTPUT }文件
  • 如何解析这些文件,从下面图片,我基本可以知道python解析了${CMAKE_CURRENT_SOURCE_DIR}/dsdl_compiler/libuavcan_dsdlc 这个脚本文件
  • 从上面我们了解到,工具是libuavcan_dsdlc, 输入文件是在dsdl下的所有.uavcan文件,输出文件是在include/dsdlc_generated下,我们下面查看这2个文件夹

1.3.1 查看dsdl下的文件

1.3.2. 查看输出路径下的include/dsdlc_generated

2.我们添加自己的UAVCAN数据如何添加vitual_button文件夹

文件下面有1个文件命名为1500.VitualButton.uavcan

2.1 创建文件

$ touch ./libuavcan/dsdl/uavcan/equipmen./libuavcan/dsdl/uavcan/equipmen/vitual_button
 
$ cat ./libuavcan/dsdl/uavcan/equipmen/vitual_button/1500.VitualButton.uavcan
 
uint8 value  # range 0 to 255

2.2 预期结果

我们如何编译成功,会在include/dsdlc_generatd中生成1个文件夹是include/dsdlc_generated,文件名字应该是VitualButton.hpp文件

2.3 执行编译命令

/usr/bin/python /home/yangang/work/px4/Firmware/src/modules/uavcan/libuavcan/libuavcan/dsdl_compiler/libuavcan_dsdlc 
/home/yangang/work/px4/Firmware/src/modules/uavcan/libuavcan/libuavcan/../dsdl/uavcan -Oinclude/dsdlc_generated

2.4 查看输出文件

3. 错误的文件的例子

3.1 1500.camerafd.uavcan文件内容

uint8 id

3.2 添加文件,编译出错

FAILED: cd /home/yangang/work/px4_proj/Firmware/src/modules/uavcan/libuavcan/libuavcan && /usr/bin/python /home/yangang/work/px4_proj/Firmware/src/modules/uavcan/libuavcan/libuavcan/dsdl_compiler/libuavcan_dsdlc test/dsdl_test/root_ns_a test/dsdl_test/root_ns_b /home/yangang/work/px4_proj/Firmware/src/modules/uavcan/libuavcan/libuavcan/../dsdl/uavcan -Oinclude/dsdlc_generated && /opt/cmake-3.3.2/bin/cmake -E touch /home/yangang/work/px4_proj/Firmware/build/px4cannode-v1_default/libuavcan_dsdlc_run.stamp
Internal error
Traceback (most recent call last):
  File "/home/yangang/work/px4_proj/Firmware/src/modules/uavcan/libuavcan/libuavcan/dsdl_compiler/pyuavcan/uavcan/dsdl/parser.py", line 606, in parse
    return self.parse_source(filename, source_text)
  File "/home/yangang/work/px4_proj/Firmware/src/modules/uavcan/libuavcan/libuavcan/dsdl_compiler/pyuavcan/uavcan/dsdl/parser.py", line 598, in parse_source
    raise ex
DsdlException: /home/yangang/work/px4_proj/Firmware/src/modules/uavcan/libuavcan/dsdl/uavcan/equipment/camera_gimbal/1500.camerafd.uavcan: 
Invalid type name [uavcan.equipment.camera_gimbal.camerafd]

3.3 解决方法

文件名字,除了前面的数字外,首字母需要大写。修改文件名为1500.Camerafd.uavcan

3.4 调试过程

根据编译信息,我们找到出现的异常地方是parser.py", line 606, in parse, 跟踪代码如下,可以看出,字母camerafd的首字母要打大小写

enforce(re.match(r'[A-Z][A-Za-z0-9_]*$', short_name), 'Invalid type name [%s]', name)
 
def enforce(cond, fmt, *args):
    if not cond:
        error(fmt, *args)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值