Skip to content

发送和接收调试值

在软件开发过程中,输出单个重要数字通常是必要的。这就是 MAVLink 的通用 NAMED_VALUE_FLOATDEBUGDEBUG_VECT 数据包发挥作用的地方。

MAVLink 调试消息会转换为 uORB 主题,也能从 uORB 主题转换而来。为了发送或接收 MAVLink 调试消息,您必须分别发布或订阅相应的主题。下面的表格总结了 MAVLink 调试消息和 uORB 主题之间的映射关系:

MAVLink 消息uORB 主题
NAMED_VALUE_FLOATdebug_key_value
DEBUGdebug_value
DEBUG_VECTdebug_vect

教程:发送字符串/浮点配对

本教程展示了如何使用关联的 uORB 主题 debug_key_value 发送 MAVLink 消息 NAMED_VALUE_FLOAT

本教程的代码可在以下位置找到:

设置调试发布仅需以下代码段。首先添加头文件:

C
#include <uORB/uORB.h>
#include <uORB/topics/debug_key_value.h>
#include <string.h>

然后广播调试值主题(针对不同发布名称进行一次广播就足够了)。将此代码放在主循环之前:

C
/* 广播调试值 */
struct debug_key_value_s dbg;
strncpy(dbg.key, "velx", sizeof(dbg.key));
dbg.value = 0.0f;
orb_advert_t pub_dbg = orb_advertise(ORB_ID(debug_key_value), &dbg);

而发送主循环则更为简单:

C
dbg.value = position[0];
orb_publish(ORB_ID(debug_key_value), pub_dbg, &dbg);

WARNING

多条调试消息的发布之间必须有足够的时间供 Mavlink 处理。这意味着要么代码在发布多条调试消息之间需要等待,要么在每次函数调用迭代中交替发送消息。

在 QGroundControl 的实时绘图中,结果如下所示: QGC 调试值绘图

教程:接收字符串/浮点配对

以下代码片段展示了如何接收上一教程中发送的 velx 调试变量。

首先,订阅主题 debug_key_value

C
#include <poll.h>
#include <uORB/topics/debug_key_value.h>

int debug_sub_fd = orb_subscribe(ORB_ID(debug_key_value));
[...]

debug_key_value 主题上有新消息可用时,不要忘记根据其键属性对其进行筛选,以便丢弃键与 velx 不同的消息:

C
[...]
/* 可以使用这种技术等待多个主题,这里仅使用一个 */
px4_pollfd_struct_t fds[] = {
    { .fd = debug_sub_fd,   .events = POLLIN },
};

while (true) {
    /* 等待 debug_key_value 消息 1000 毫秒(1 秒) */
    int poll_ret = px4_poll(fds, 1, 1000);

    [...]

debug_key_value 主题上有新消息可用时,不要忘记根据其键属性对其进行筛选,以便丢弃键与 velx 不同的消息:

C
    [...]
    if (fds[0].revents & POLLIN) {
        /* 为第一个文件描述符获取到数据 */
        struct debug_key_value_s dbg;

        /* 将数据复制到本地缓冲区 */
        orb_copy(ORB_ID(debug_key_value), debug_sub_fd, &dbg);

        /* 根据键属性筛选消息 */
        if (strcmp(_sub_debug_vect.get().key, "velx") == 0) {
            PX4_INFO("velx:\t%8.4f", dbg.value);
        }
    }
}

总结

此文档聚焦于 PX4 开发中调试值的发送与接收。首先介绍了 MAVLink 调试消息和 uORB 主题的映射关系,接着通过两个教程详细阐述了如何使用 uORB 主题 debug_key_value 发送和接收 MAVLink 消息 NAMED_VALUE_FLOAT,并给出了相应代码示例及注意事项。如果你有进一步的需求,如对文档进行优化、提取关键信息等,请随时告知。