UAVCAN DSDL介绍

原文http://uavcan.org/Specification/3._Data_structure_description_language/

DSDL:Data structure description language

实际上,就是自动生成的C++格式的数据结构。用来定义UAVCAN中的各种类型的消息。个人认为就是看着更清晰,理解起来更容易,也是UAVCAN的设计思想。使用C代码也很容易实现

C代码例子https://github.com/zwx230741/libcanard

结构定义

[default data type ID.]<data type name>.uavcan
+ uavcan                        <-- Root namespace
    + equipment                 <-- Nested namespace
        + ...
    + protocol                  <-- Nested namespace
        + 341.NodeStatus.uavcan <-- Definition of data type "uavcan.protocol.NodeStatus" with 
                                    default data type ID 341
        + ...
    + Timestamp.uavcan          <-- Definition of data type "uavcan.Timestamp", default data 
                                    type ID is not assigned

DSDL中定义的都是标准的数据类型,也是默认的数据类型,不需要更改
可用的数据类型ID是有限的

DSDL发布消息
具体源码可以参考UAVCAN源码
DSDL通过Publisher来发布消息,当你需要发送数据到can设备时使用

uavcan::equipment::esc::RawCommand msg;
uavcan::Publisher<uavcan::equipment::esc::RawCommand>           _uavcan_pub_raw_cmd;
(void)_uavcan_pub_raw_cmd.broadcast(msg); //广播消息

DSDL订阅消息
DSDL通过Subscriber来订阅消息,当你需要接收can设备数据到时使用

typedef uavcan::MethodBinder<UavcanEscController*,
        void (UavcanEscController::*)(const uavcan::ReceivedDataStructure<uavcan::equipment::esc::Status>&)>
        StatusCbBinder;
uavcan::Subscriber<uavcan::equipment::esc::Status, StatusCbBinder>  _uavcan_sub_status;

int res = _uavcan_sub_status.start(StatusCbBinder(this, &UavcanEscController::esc_status_sub_cb));
if (res < 0)
{
    warnx("ESC status sub failed %i", res);
    return res;
}

void UavcanEscController::esc_status_sub_cb(const uavcan::ReceivedDataStructure<uavcan::equipment::esc::Status> &msg)
{
    ;
}

数据结构举例

#
# Abstract node status information.
#
# Any UAVCAN node is required to publish this message periodically.
#

#
# Publication period may vary within these limits.
# It is NOT recommended to change it at run time.
#
uint16 MAX_BROADCASTING_PERIOD_MS = 1000
uint16 MIN_BROADCASTING_PERIOD_MS = 2

#
# If a node fails to publish this message in this amount of time, it should be considered offline.
#
uint16 OFFLINE_TIMEOUT_MS = 3000

#
# Uptime counter should never overflow.
# Other nodes may detect that a remote node has restarted when this value goes backwards.
#
uint32 uptime_sec

#
# Abstract node health.
#
uint2 HEALTH_OK         = 0     # The node is functioning properly.
uint2 HEALTH_WARNING    = 1     # A critical parameter went out of range or the node 
                                  encountered a minor failure.
uint2 HEALTH_ERROR      = 2     # The node encountered a major failure.
uint2 HEALTH_CRITICAL   = 3     # The node suffered a fatal malfunction.
uint2 health

#
# Current mode.
#
# Mode OFFLINE can be actually reported by the node to explicitly inform other network
# participants that the sending node is about to shutdown. In this case other nodes will not
# have to wait OFFLINE_TIMEOUT_MS before they detect that the node is no longer available.
#
# Reserved values can be used in future revisions of the specification.
#
uint3 MODE_OPERATIONAL      = 0         # Node is performing its main functions.
uint3 MODE_INITIALIZATION   = 1         # Node is initializing; this mode is entered 
                                          immediately after startup.
uint3 MODE_MAINTENANCE      = 2         # Node is under maintenance.
uint3 MODE_SOFTWARE_UPDATE  = 3         # Node is in the process of updating its software.
uint3 MODE_OFFLINE          = 7         # Node is no longer available.
uint3 mode

#
# Not used currently, keep zero when publishing, ignore when receiving.
#
uint3 sub_mode

#
# Optional, vendor-specific node status code, e.g. a fault code or a status bitmask.
#
uint16 vendor_specific_status_code

结构体中的属性值:
默认值:不可以修改,也不参与网络交互
变量:可以通过应用程序修改,参与网络收发

uint8[<=64] payload

UAVCAN支持不定长数组,使用起来很方便。但是要注意,DSDL订阅消息的时候,默认第一个字节表示数组的长度

服务响应标记:
该标记由三个减号组成

---

C方式发送消息
等价于DSDL发布消息

/*
封包数据,根据数据类型
void canardEncodeScalar(void *destination,
                        uint32_t bit_offset,
                        uint8_t bit_length, //bit长度
                        const void *value)
*/
canardEncodeScalar(buffer,  0, 28, &uptime_sec);

/*
发送消息,加入到发送队列
int canardBroadcast(CanardInstance *ins,
                    uint64_t data_type_signature,
                    uint16_t data_type_id,
                    uint8_t *inout_transfer_id,
                    uint8_t priority,
                    const void *payload,
                    uint16_t payload_len)
*/
canardBroadcast(&canard, UAVCAN_NODE_STATUS_DATA_TYPE_SIGNATURE,
               UAVCAN_NODE_STATUS_DATA_TYPE_ID, &transfer_id, CANARD_TRANSFER_PRIORITY_LOW,
               buffer, UAVCAN_NODE_STATUS_MESSAGE_SIZE);

C方式接收消息
等价于DSDL订阅消息

/*
从接收到的数据包中,解析出数据
int canardDecodeScalar(const CanardRxTransfer *transfer,
                       uint32_t bit_offset,
                       uint8_t bit_length,
                       bool value_is_signed,
                       void *out_value)
*/
canardDecodeScalar(transfer, 0, 28, false, &uptime_sec[i]);
<think>嗯,用户让我解释一下运行这个Python脚本时的帮助信息,具体是`dronecan_dsdlc.py -h`的输出。首先,我需要仔细看一下用户提供的命令输出内容,然后理解每个参数的作用。 首先,这个脚本的名字是dronecan_dsdlc.py,看起来和DroneCAN的DSDL有关。DSDL是DroneCAN使用的领域特定描述语言,用来定义消息和服务。这个脚本可能用于生成代码或者处理DSDL文件。 用户给的帮助信息里有几个部分:用法(usage)、位置参数(positional arguments)和选项(options)。我需要逐一解释每个部分的作用。 位置参数是namespace_dir,可以指定多个目录。这些应该是包含DSDL命名空间的目录,也就是存放相关`.uavcan`或`.dronecan`文件的目录。用户需要至少指定一个这样的目录来处理。 接下来是选项部分: - `-h`或`--help`显示帮助信息,这个很常见。 - `--output`或`-O`指定输出目录,生成的代码或其他文件会放在这里。默认可能是在当前目录或者某个预设路径,但用户可以通过这个选项自定义。 - `--build`后面跟一个路径,可能用于指定构建目录,可能是在编译过程中使用的临时文件存放位置。 - `--run-tests`可能是在生成代码后运行测试,确保生成结果正确。 - `-j`或`--jobs`指定并行任务数,这通常用于加快处理速度,尤其是当处理大量文件时,多线程可以提升效率。 用户可能需要知道这些参数的具体使用场景和示例。比如,当用户有多个DSDL命名空间目录时,如何同时指定它们,或者如何结合输出目录和构建目录使用。 此外,可能需要提醒用户常见的用例,例如生成代码的基本命令格式,比如: `python dronecan_dsdlc.py namespace_dir --output ./generated --build ./build --run-tests -j4` 还要注意是否需要安装依赖,或者运行环境的要求,但用户的问题中没有提到这些,可能不需要深入。不过,如果用户遇到问题,可能需要进一步检查这些方面。 总结来说,这个脚本的作用是根据提供的DSDL命名空间生成相关代码,可能包括序列化/反序列化代码,测试代码等,用户可以通过参数控制输出位置、构建过程、测试执行和并行处理。</think>以下是对`dronecan_dsdlc.py`脚本命令行参数的详细解析: ### 一、基本作用 此脚本用于处理**DroneCAN的DSDL(领域特定描述语言)文件**,主要功能包括: - 生成CAN总线通信协议代码(消息/服务序列化、反序列化等) - 编译DSDL定义 - 运行相关测试 ### 二、参数详解 #### 1. 位置参数 ```bash namespace_dir [namespace_dir ...] ``` * **作用**:指定DSDL命名空间目录路径(可多个) * **示例**: ```bash python dronecan_dsdlc.py ./dsdl/uavcan ./dsdl/custom ``` #### 2. 选项参数 | 参数 | 缩写 | 作用 | |------|------|------| | `--help` | `-h` | 显示帮助信息 | | `--output OUTPUT` | `-O` | 指定生成代码的输出目录<br>(默认:当前目录或脚本预设路径)| | `--build BUILD` | 无 | 设置编译构建目录<br>(存放中间文件如.o/.obj等)| | `--run-tests` | 无 | 生成后自动运行测试用例 | | `--jobs JOBS` | `-j` | 指定并行编译任务数(加速构建过程)| ### 三、典型使用场景 #### 场景1:基础代码生成 ```bash python dronecan_dsdlc.py ./dsdl/uavcan -O ./generated ``` * 解析`./dsdl/uavcan`下的DSDL文件 * 生成代码保存到`./generated`目录 #### 场景2:完整构建流程 ```bash python dronecan_dsdlc.py ./dsdl/uavcan \ -O ./generated \ --build ./build \ --run-tests \ -j8 ``` * 多阶段操作:生成代码 → 编译 → 运行测试 * 使用8个线程并行加速 * 中间文件存放在`./build` ### 四、注意事项 1. **依赖要求**:确保已安装DroneCAN的Python依赖(如`dronecan`、`numpy`等) 2. **路径规范**:建议使用**绝对路径**避免路径解析问题 3. **测试验证**:生成后务必通过`--run-tests`验证代码正确性
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值