# 手动生成客户端和代理代码

本主题将介绍如何为客户端和代理手动生成代码(而非 自动生成 编译 PX4 固件时)。

代码使用 python 脚本生成: /Tools/generate_microRTPS_bridge.py.

备注

此方法只能在创建新信息时用于调试目的,或者只想在 PX4 域外使用生成的代码。否则,请使用 正常 中解释的方法 PX4-Fast RTPS(DDS)桥接器该系统使用 PX4-Autopilot 构建系统。

# 禁用自动桥接代码生成

首先禁用桥接代码自动生成功能。设置变量 生成rtps 桥关闭.cmake 文件:

设置(GENERATE_RTPS_BRIDGE 关闭)

# 使用 generate_microRTPS_bridge.py

generate_microRTPS_bridge 工具的命令语法如下所示:

$ CD /path/to/PX4/PX4-Autopilot/msg/tools $ python generate_microRTPS_bridge.py -h 使用方法:generate_microRTPS_bridge.py [-h] [-a] [-c] [-i] [-j IDL_DIR] [-m] [-l]
                                    [-t MSGDIR] [-b UORB_TEMPLATES]
                                    [-q URTPS_TEMPLATES] [-y YAML_FILE]
                                    [-p PACKAGE] [-o AGENTDIR] [-u CLIENTDIR]
                                    [-f [FASTRTPSGEN]]
                                    [-g FASTRTPSGEN_INCLUDE]
                                    [-r [ROS2_DISTRO]] [--删除树]

可选参数:-h、--help 显示此内容 帮助 信息和 出口
  -a、--代理标志 对于 生成代理,默认情况下是  如果 -c未指定 -c, --client 标志 对于 生成客户端,默认为  如果 -a未指定 -i, --generate-idl Flag 对于 生成 idl 文件 对于 each msg -j IDL_DIR, --idl-dir IDL_DIR IDL 文件 导演
  -m,--mkdir-build 用于创建的标志 构建 导演
  -l, --generate-cmakelists 生成 CMakeLists.txt 的标志 文件 对于 微型 RTPS 代理 -t MSGDIR, --topic-msg-dir MSGDIR 主题信息,默认使用相对路径 msg/
  -b UORB_TEMPLATES, --uorb-templates-dir UORB_TEMPLATES uORB 模板,默认使用 msgdir 的相对路径 模板/uorb_microcdr
  -q URTPS_TEMPLATES, --urtps-templates-dir URTPS_TEMPLATES uRTPS 模板,默认使用 msgdir 的相对路径 模板/urtps
  -y YAML_FILE, --rtps-ids-file YAML_FILE RTPS msg IDs 定义路径,默认使用 msgdir 的相对路径
                        'tools/uorb_rtps_message_ids.yaml'(工具/ uorb_rtps_message_ids.yaml
  -p PACKAGE, --package PACKAGE 信息包命名,默认为 px4 -o AGENTDIR, --agent-outdir AGENTDIR 代理输出目录,默认使用相对路径
                        src/modules/micrortps_bridge/micrortps_agent
  -u CLIENTDIR, --client-outdir CLIENTDIR 客户端输出目录,默认使用相对路径
                        src/modules/micrortps_bridge/micrortps_client
  -f [FASTRTPSGEN], --fastrtpsgen-dir [FASTRTPSGEN]
                        只需要 fastrtpsgen 安装目录 如果
                        fastrtpsgen 不是  路径默认为空 -g FASTRTPSGEN_INCLUDE, --fastrtpsgen-include FASTRTPSGEN_INCLUDE 目录(ies)增加 到 fastrtpsgen 的预处理器 include 路径,默认为空 -r [ROS2_DISTRO], --ros2-distro [ROS2_DISTRO]
                        ROS 2 发行版,只需要 如果 生成代理 对于
                        使用 ROS 2 节点,默认为空 --delete-tree 删除 导演 树输出目录(s)

注意 与 --删除树 选项会删除 CLIENTDIRAGENTDIR 在创建新文件和文件夹之前:

  • 论点 --send/-s--接收/-r 指定可从 PX4 发送/接收的 uORB 主题。只有指定的信息才会生成代码。
  • 输出显示在 CLIENTDIR (-o src/modules/micrortps_bridge/micrortps_client默认情况下)和 AGENTDIR (-u src/modules/micrortps_bridge/micrortps_agent默认情况下)。
  • 如果没有标志 -a-c 则客户端和代理都将生成并安装。
  • -f 如果 快速 DDS 没有安装在默认位置 (-f /path/to/fastdds/installation/bin).

下面的示例展示了如何生成桥接代码,以便仅发布/订阅 传感器_巴罗 单个 uORB 主题。

$ CD /path/to/PX4/PX4-Autopilot $ python Tools/generate_microRTPS_bridge.py -s msg/sensor_baro.msg -r msg/sensor_combined.msg

# 生成代码

客户, 代理, CDR 序列化/反序列化 和相关 RTPS 消息(IDL 文件)的定义。

手动生成的桥接器代码可在此处找到(默认情况下):

  • 客户: src/modules/micrortps_bridge/micrortps_client/
  • 代理: src/modules/micrortps_bridge/micrortps_agent/

# uORB 序列化代码

作为 PX4 正常编译过程的一部分(也可手动生成),所有 uORB 主题都会生成序列化函数。例如,将为 sensor_combined.msg:

void serialize_sensor_combined(const struct sensor_combined_s *input、char *output、uint32_t *length、struct microCDR *microCDRWriter);
void deserialize_sensor_combined(struct sensor_combined_s *output, char *input, struct microCDR *microCDRReader);

# RTPS 报文 IDL 文件

IDL 文件由 uORB 生成 .msg 文件 (uORB选定主题)在桥的生成过程中。这些信息可在 src/modules/micrortps_bridge/micrortps_agent/idl/

快速 DDS 使用 IDL 文件来定义 RTPS/DDS 消息的结构(这里指映射到 uORB 主题的 RTPS/DDS 消息)。它们用于为 代理快速 DDS 需要发布/订阅 uORB 主题的应用程序。

备注

将 IDL 文件编译成 C++。 fastrtpsgen 工具

# 验证代码生成

您可以通过检查输出目录是否与下图所示的列表一致来验证代码生成是否成功(在 Linux 上,在 命令可用于列出文件结构)。

代理目录:

$ tree src/modules/micrortps_bridge/micrortps_agent src/modules/micrortps_bridge/micrortps_agent ├── build ├── CMakeLists.txt ├── idl │ ├── sensor_baro_.idl │ └── sensor_combined_.├── microRTPS_agent.cpp ├── microRTPS_timesync.cpp ├── microRTPS_timesync.h ├── microRTPS_transport.cpp ├── microRTPS_transport.h ├── RtpsTopics.cpp ├── RtpsTopics.h ├── sensor_baro_.cpp ├── sensor_baro_.h ├── sensor_baro_Publisher.cpp ├── sensor_baro_Publisher.h ├── sensor_baro_PubSubTypes.cpp ├── sensor_baro_PubSubTypes.h ├── sensor_combined_.cpp ├── sensor_combined_.h ├── sensor_combined_PubSubTypes.cpp ├── sensor_combined_PubSubTypes.h ├── sensor_combined_Subscriber.cpp └── sensor_combined_Subscriber.h
 2 目录、 20 文件

客户目录:

$ tree src/modules/micrortps_bridge/micrortps_client src/modules/micrortps_bridge/micrortps_client ├─── CMakeLists.txt ├─── microRTPS_client.cpp ├── microRTPS_client_dummy.cpp ├── microRTPS_client_main.cpp ├── microRTPS_transport.cpp └── microRTPS_transport.h
 0 目录、 4 文件

# 构建和使用代码

人工生成的 客户 代码在 正是 一样 自动生成的客户端代码.

具体来说,一旦人工生成 客户 作为正常编译过程的一部分,PX4 固件将编译和内置源代码。例如,编译代码并将其纳入 NuttX/Pixhawk 目标的固件中:

生产 px4_fmu-v4_rtps 上传

备注

您必须首先 禁用桥接代码自动生成功能 以便工具链使用手动生成的源代码(而不是尝试重新生成)。

人工生成的 代理 代码的编译和使用方式与 自动生成代码.唯一不同的是,手动源代码是在 src/modules/micrortps_bridge/micrortps_agent 而不是 构建/BUILDPLATFORM/src/modules/micrortps_bridge/micrortps_agent/.