我正在构建一个 FPV 机器人,我想通过本地 Wi-Fi 连接使用网络浏览器来控制它。
我正在使用带有 Raspbian Stretch 的 raspberry pi 3B+。我建立了自己的电机控制和功率调节器帽子。
经过大量研究测试,我决定使用 node.JS 作为 http 服务器和 socket.io 来提供与我的机器人的低延迟双向通信。该堆栈实现了大约 7 毫秒的延迟。
我需要将低延迟视频从连接到 RPI 的 USB 摄像头传输到浏览器。我的目标是在 10FPS 下达到至少 640x480 的分辨率,延迟为 50 毫秒或更好。我很高兴牺牲视觉忠诚度来从我的机器人那里获得更快的响应。
如果可能的话,我想在 UDP 中进行流式传输以提高流的可靠性。
如果可能,我想流式传输现代网络浏览器可以本地解码的视频。我想使用 H264 编解码器和 HTML5 视频标签。如果没有其他选择,我可以回退使用 javascript 播放器。
我进行了广泛的研究并尝试了许多工具。
其中,我尝试了 VLC、mjpg 流光、gstreamer 和 raspivid。有几次我进入了网络浏览器可以查看的流,但充其量我在 320x240 时得到了 700 毫秒的延迟。离我的目标很远很远。
目前我正在研究 WebRTC 解决方案。
我想对 NODE.JS 包或其他解决方案提出建议,以提供 UDP H264 视频流,该视频流可由 HTML5 视频标签解码,目标延迟为 50 毫秒。
谢谢
感谢您的回答!我会不断更新这个问题,一旦解决,我会发布解决方案。
推单个框架
我尝试了一种不同的方法,通过 websocket 推送单个 200KB 640x480 jpg …
设置:
我有一个 NODE.JS 应用程序,它必须以低延迟执行一些计算
我决定使用 N-API 和 node-gyp 将本机 C++ 模块包含到 NODE.JS 应用程序中
当前状态:
我到了工具链工作的地步,我可以将 C++ 源代码编译成二进制文件,在 NODE.JS 应用程序中包含二进制模块,NODE.JS 应用程序执行
我可以使用标准 NODE.JS 调用 C++ 方法来自 NODE.JS 的类型和方法可以在执行完成后将标准的 NODE.JS 类型返回给 NODE.JS
问题:
我不知道如何将自定义类型/对象从 C++
返回到 NODE.JS目前我想基本上返回一个具有多种类型的结构,以便将复杂解析的结果返回到 NODE.JS 中单个 NODE.JS 调用
最少的代码输出:
我做了一个最少的实现来演示我想做的事情。如果你评论#define ENABLE_RETURN_CLASS代码只使用标准的 NODE.JS 类型并且一切正常。在输出图像下方,显示工具链和执行按预期工作:

如果离开#define ENABLE_RETURN_CLASS,代码将无法编译。据我所知,它不明白如何从 C++ 对象转换为 NODE.JS 对象。这是错误:

最少代码:
初始化 NODE.JS 应用程序
npm init
npm install node-gyp --save-dev
npm install node-addon-api
Run Code Online (Sandbox Code Playgroud)
将 C++ 二进制文件编译为 NODE.JS 模块
npm run build
Run Code Online (Sandbox Code Playgroud)
启动 NODE.JS 应用程序
node main.js …Run Code Online (Sandbox Code Playgroud) 简介:
我买了一块配备GD32VF103 Risc-V MCU的Longan Nano评估板。
我可以运行视频播放器演示,并使用 VS Code、PlatformIO 和 DFU 工具编译和加载工作代码。下面是电路板和演示运行的视频。

https://www.youtube.com/watch?v=84_PzcNiJb4
我想做的
就是为机器人比赛建造一个机器人作为一种爱好。我使用 Microchip 4809 8 位 MCU 作为电机控制器,但在以 2KHz 运行 PID 控制器时达到了 MCU 的极限,而且我还没有添加电流环路。我想升级电机控制器,我决定选择 Longan Nano,因为它有 LCD 屏幕、优越的 CPU 马力以及学习 Risc-V。
https://www.youtube.com/watch?v=1dQMktoiuLg
问题
我可以在轮询中很好地运行 Longan Nano 的外围设备。我真的很努力地想让中断起作用,但没有成功。我尝试读取轮询中断标志,它们就是这样工作的,所以我认为这要么是 ISR 处理程序链接到 Start.s 中的中断向量表的链接器问题,要么是 ECLIC 的配置问题。
这是一个正确运行的轮询示例。红色 LED 以 2Hz 的频率闪烁,按下启动按钮将切换蓝色 LED。
#include <gd32vf103.h>
void init()
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_1);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_2);
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,GPIO_PIN_8);
gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_13);
gpio_bit_set(GPIOC,GPIO_PIN_13);
gpio_bit_set(GPIOA,GPIO_PIN_1);
gpio_bit_set(GPIOA,GPIO_PIN_2);
rcu_periph_clock_enable(RCU_AF);
eclic_init(ECLIC_NUM_INTERRUPTS);
eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);
eclic_irq_enable(EXTI5_9_IRQn, 1, 1);
exti_deinit(); …Run Code Online (Sandbox Code Playgroud)