# webrtc
**Repository Path**: liuyf2020/webrtc
## Basic Information
- **Project Name**: webrtc
- **Description**: 开源: 低延时、点对点、可远程控制、可捕获画面和声音的遥控车
- **Primary Language**: C++
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 3
- **Created**: 2026-01-08
- **Last Updated**: 2026-02-12
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 面向低延时,点对点、远程音视频与信号控制的远距离遥控车系统
  

### ⌛欢迎star✨任何问题发issue👨🏫欢迎一起贡献代码🎊[源码地址](https://github.com/fy403/webrtc)
[TOC]
## 项目初衷
**本项目是一个个人学习性质的开源项目,旨在系统学习和实践音视频开发相关知识,并结合实际编程语言提高动手能力。在整个系统设计与实现过程中,注重代码的可扩展性,每个功能模块都尽量以独立函数库的形式呈现,便于后续复用与拓展。同时,在代码实现上追求简洁清晰,剔除冗余逻辑,专注于保留最核心、最本质的实现内容,帮助理解底层原理。**
## 项目介绍
**项目主要面向RC遥控车改造,希望在遥控车基础上开发低延时、点对点、可远程控制、可捕获画面和声音的遥控车。采用的技术方案是通过RTP将采集的音视频或者是监控数据传输到控制端;将控制信号也通过RTP传输到被控遥控车,遥控车通过解析协议,转换为命令控制遥控车。技术方案尽可能减少服务器的参与,流量直接点对点传输。**
## 演示效果
------
## 项目Q&A
### Q1:如果我用的电机驱动方案不存在本项目中,如何驱动电机工作?
A1: 可以自己实现电机驱动方案,比如使用PWM控制电机,或者使用GPIO控制电机。如果不会编写代码,可以使用CodeBuddy或者Cursor,或者VSCODE的Lingma插件,开启Agent模式。输入以下提示词,替换掉``为实际电机驱动方法。
```txt
假如你是本项目的C++开发工程师,帮我添加一个新的motor_driver:(),你可以查看已有的驱动编写模板代码:@include/uart_motor_driver.h @include/motor_driver.h 。
驱动编写完成后,将其加入到@src/MotorController的构造函数中。你可以阅读整体代码,实现该功能编写。
```
例如:使用pwm控制电调:
```markdown
假如你是本项目的C++开发工程师,需要新增一个电机驱动模块。该模块通过**GPIO引脚22**输出**PWM信号**控制**电调**,其**工作频率**为**50Hz(周期20ms)**。
电调初始化流程如下:
1. 发送**中立位脉冲(1500μs)**,使舵机归中。
2. 保持该信号**2秒**,完成电调校准(校准成功后会发出**滴滴提示音**)。
3. 校准完成后,控制量程为 **900μs 至 +2100μs**(以1500μs为零点)。
你可参考以下现有驱动的代码结构进行实现:
- 接口定义:`@include/motor_driver.h`
- 示例实现:`@include/uart_motor_driver.h`
驱动开发完成后,请将其集成到 **`@src/MotorController` 的构造函数**中,并确保与现有系统兼容。建议先理解整体代码架构,再进行模块化开发。
```
### Q2::需要全部购买配件吗?
A2:不需要,每个部分都是非常强可扩展的。开发板只要能够上网,且能够编译运行ffmpeg以及C++代码就行,无论什么系统。如果只需要图传部分,可用单独运行av_track。如果只需要数字控制部分可只运行data_track。电机驱动器支持两种高可扩展方案(将文档后面说明),支持RC遥控车无损话改造。
### Q3:图传延时怎么样?
A3: 目前最新的图传延时能够在内网环境下达到110ms,且没有使用编码芯片支持。纯使用CPU的软编码,如果开发板硬件比较好,理论可以降低到100ms以下。
-----
## 快速运行
### 1.依赖安装(ubuntu为例)
#### 1.1服务器部分:信令服务器搭建(调试时可用我搭建的, 默认包含在配置中)
信令服务器主要是协助WebRTC双方交换SDP(音视频参数信息)以及ICE(双方网络地址信息)。所以要想支持4G远程,需要购买一个便宜的建站服务器就行,成本70/年(2H2G)。服务器需要有公网ip,服务器不需要很大的带宽(不负责传输流媒体数据)。
##### 下载项目
```shel
git clone https://github.com/fy403/webrtc
```
##### 依赖安装
方法1:nodejs
```shell
cd webrtc/signaling_server/nodejs
# 安装nodejs, npm
sudo apt install nodejs npm
# 安装依赖
npm install
```
方法2:python3
```shell
cd webrtc/signaling_server/python3
# 安装python3, pip3
sudo apt install python3 python3-pip
pip3 install -r requirements.txt
```
##### 启动信令服务器
```shel
chmod +x ./install && ./install
```
> 默认端口是8000, 记得服务器允许防火墙TCP:8000端口流量通过。
> 如果fy403.cn:8000还能用,那么就不用搭建信令服务器了。直接用我的就行,但是记住一定要配置唯一的`CLIENT_ID="cam_id_YvgpEqD4" # 客户端ID`。【如果冲突,请自行修改】
#### 1.2 服务器部分:STUN/TURN服务器准备(调试时可用我搭建的, 默认包含在配置中))
STUN/TRUN服务器是用来获取WebRTC双方的网络地址信息:本地接口直接地址(Host Candidate)、STUN服务器反射地址(Server Reflexive Candidate)以及TURN中继地址(Relayed Candidate)。通常内网地址优先级低于公网直连地址。如果内网不能互通则走中级TURN服务器,流媒体流量从TURN转发。
公开的STUN服务器非常多,比如:(stun_host=‘stun.l.google.com’, stun_port=19302)。
TURN服务器可以自己搭建[搭建私有TURN服务器](turn_server/README.md),当然也可以使用cloudflare免费提供的服务器(但是延迟会比较大,且不稳定)。具体可以参考这篇Blog[【WebRTC全流程】livekit配置免费的cloudflare turn服务 - PiDan! | 虚拟世界的懒猫的博客](https://pidan.dev/20250722/webrtc-livekit-deploy-config-turn-server/)
申请后,只需要通过他提供的一个cmd命令curl获取TURN server host和username,password就行。
#### 1.3 控制板部分:依赖安装
1.安装ffmpeg
```shell
sudo apt-get update
sudo apt-get install -y libavdevice-dev libavformat-dev libavcodec-dev libavutil-dev libswscale-dev
sudo apt-get install -y ffmpeg
```
2.安装其他依赖
```shell
sudo apt install -y g++ make dos2unix
sudo apt install -y libsdl2-dev
sudo apt install -y libssl-dev
wget https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3.tar.gz
tar -xzvf cmake-3.28.3.tar.gz
cd cmake-3.28.3
./configure
make -j 3
sudo make install
ln -sf /usr/local/bin/cmake /usr/bin/cmake
sudo apt-get install -y nlohmann-json3-dev
git clone https://github.com/paullouisageneau/libdatachannel.git
cd libdatachannel
git submodule update --init --recursive
mkdir build && cd build
cmake ..
make -j2
sudo make install
```
> 开发板通常是arm架构,可以换成清华的post源
### 2.设备查找
#### 2.1 摄像头参数获取
```shell
root@orangepizero2:~# sudo v4l2-ctl --list-device
cedrus (platform:cedrus):
/dev/video0
/dev/media0
SIT USB2.0 Camera RGB: SIT USB2 (usb-5200000.usb-1.2):
/dev/video1 # 第一个摄像头
/dev/video2
/dev/media1
```
获取摄像头参数:视频格式,分辨率,帧率
```shell
root@orangepizero2:~# sudo v4l2-ctl -d /dev/video1 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture
[0]: 'MJPG' (Motion-JPEG, compressed) # 视频格式
Size: Discrete 640x480 # 支持的分辨率
Interval: Discrete 0.033s (30.000 fps) # 各种帧率支持
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Interval: Discrete 0.033s (30.000 fps)
Interval: Discrete 0.040s (25.000 fps)
Interval: Discrete 0.050s (20.000 fps)
Interval: Discrete 0.067s (15.000 fps)
Interval: Discrete 0.100s (10.000 fps)
Interval: Discrete 0.200s (5.000 fps)
Size: Discrete 1920x1080
......
```
#### 2.2 麦克风参数获取
```shel
root@orangepizero2:~# arecord -L
null
Discard all samples (playback) or generate zero samples (capture)
hw:CARD=ahubhdmi,DEV=0
ahubhdmi, ahub_plat-i2s-hifi i2s-hifi-0
Direct hardware device without any conversions
plughw:CARD=ahubhdmi,DEV=0
ahubhdmi, ahub_plat-i2s-hifi i2s-hifi-0
Hardware device with all software conversions
default:CARD=ahubhdmi
ahubhdmi, ahub_plat-i2s-hifi i2s-hifi-0
Default Audio Device
sysdefault:CARD=ahubhdmi
ahubhdmi, ahub_plat-i2s-hifi i2s-hifi-0
Default Audio Device
dsnoop:CARD=ahubhdmi,DEV=0
ahubhdmi, ahub_plat-i2s-hifi i2s-hifi-0
Direct sample snooping device
hw:CARD=Audio,DEV=0 # 第一个USB麦克风
AB13X USB Audio, USB Audio
Direct hardware device without any conversions
plughw:CARD=Audio,DEV=0
AB13X USB Audio, USB Audio
Hardware device with all software conversions
default:CARD=Audio
AB13X USB Audio, USB Audio
Default Audio Device
sysdefault:CARD=Audio
AB13X USB Audio, USB Audio
Default Audio Device
front:CARD=Audio,DEV=0
AB13X USB Audio, USB Audio
Front output / input
dsnoop:CARD=Audio,DEV=0
AB13X USB Audio, USB Audio
Direct sample snooping device
```
识别到后,就需要获取采样参数:采样率,音频格式,通道数。
```shell
root@orangepizero2:~# arecord --device=hw:CARD=Audio,DEV=0 --dump-hw-params
ACCESS: MMAP_INTERLEAVED RW_INTERLEAVED
FORMAT: S16_LE # 音频格式
SUBFORMAT: STD
SAMPLE_BITS: 16
FRAME_BITS: 16
CHANNELS: 1 # 通道数
RATE: 48000 # 采样率
PERIOD_TIME: [1000 1000000]
PERIOD_SIZE: [48 48000]
PERIOD_BYTES: [96 96000]
PERIODS: [2 1024]
BUFFER_TIME: [2000 2000000]
BUFFER_SIZE: [96 96000]
BUFFER_BYTES: [192 192000]
TICK_TIME: ALL
--------------------
arecord: set_params:1352: Sample format non available
Available formats:
- S16_LE
```
#### 2.3 扬声器参数获取
```shell
root@orangepizero2:~# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: audiocodec [audiocodec], device 0: CDC PCM Codec-0 [CDC PCM Codec-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: ahubhdmi [ahubhdmi], device 0: ahub_plat-i2s-hifi i2s-hifi-0 [ahub_plat-i2s-hifi i2s-hifi-0]
Subdevices: 1/1
Subdevice #0: subdevice #0
card 3: Device [USB2.0 Device], device 0: USB Audio [USB Audio] # USB麦克风
Subdevices: 1/1
Subdevice #0: subdevice #0
```
获取获取音频参数:采样率,音频格式,通道数
```shell
root@orangepizero2:~# cat /proc/asound/card3/stream0
Generic USB2.0 Device at usb-5200400.usb-1, full speed : USB Audio
Playback:
Status: Stop
Interface 2
Altset 1
Format: S16_LE
Channels: 2
Endpoint: 0x02 (2 OUT) (ADAPTIVE)
Rates: 48000
Bits: 16
Channel map: FL FR
```
#### 2.4 电机驱动器接口获取
```shel
root@orangepizero2:~# ls /dev/ttyUSB*
/dev/ttyUSB0
```
#### 2.5 4G网络模块接口获取
使用RNDIS的4G模块,通常第一个以enx开头的就是4G模块的网卡。然后查看路由信息,ping测试一下上网情况。如果没有4G模块,直接配置开发板与电脑连接同一个WIFI也可以控制!
```shel
root@orangepizero2:~# ip a
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
5: enx2089846a96ab: mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 1000
link/ether 20:89:84:6a:96:ab brd ff:ff:ff:ff:ff:ff
inet 192.168.10.2/24 brd 192.168.10.255 scope global dynamic noprefixroute
valid_lft 86396sec preferred_lft 86396sec
inet6 xxxxxxxxxxxx/64 scope link noprefixroute
valid_lft forever preferred_lft forever
root@orangepizero2:~# ip route
default via 192.168.10.1 dev enx2089846a96ab proto dhcp metric 100 # 4g网卡优先上网
```
获取对应的USB调试串口,通常来说是一个以ttyACM开头的第一个就是。
```shell
root@orangepizero2:~# ls /dev/ttyACM*
/dev/ttyACM0 /dev/ttyACM1 /dev/ttyACM2
```
### 3.安装启动
#### 3.1 编译程序
```shell
git clone https://github.com/fy403/webrtc
# 编译音视频采集程序
cd av_track
chmod +x ./build.sh
chmod +x ./install.sh
./build.sh
# 编译控制信号传输程序
cd data_track
chmod +x ./build.sh
chmod +x ./install.sh
./build.sh
```
#### 3.2 运行安装脚本
如果使用不同的电机驱动端口,需要修改[constants.h](data_track/include/constants.h)中的前后左右控制端口,以及pwm行程。
```c++
// Motor control constants
const int MOTOR_FRONT_BACK = 2; // Control forward/backward
const int MOTOR_LEFT_RIGHT = 4; // Control left/right turn
const int16_t NEUTRAL_PWM = 0;
const int16_t MAX_FORWARD_PWM = 3500;
const int16_t MAX_REVERSE_PWM = -3500;
```
根据之前的获取的配置,修改av_track/av_track_rtc.sh文件,修改如下:
```shell
#!/bin/bash
TARGET_HOST="fy403.cn" # 信令服务器地址
TARGET_PORT=8000 # 信令服务器端口
IP_TYPE=4 # ipv4 or ipv6
VIDEO_DEVICE="/dev/video1" # 首选摄像头设备
VIDEO_DEVICE_BAK="/dev/video0" # 备选摄像头设备
#AUDIO_DEVICE="hw:CARD=Audio,DEV=0" # 音频设备
#SAMPLE_RATE=48000 # 音频采样率
#CHANNELS=1 # 音频通道数
AUDIO_FORMAT="alsa" # 音频输入格式
CHECK_INTERVAL=2 # Health check interval (seconds)
CLIENT_ID="usbcam" # 客户端ID:不填写使用随机值
STUN_SERVER="stun.l.google.com" # STUN服务器地址
STUN_SERVER_PORT=19302 # STUN服务器端口
TURN_SERVER="tx.fy403.cn"
TURN_SERVER_PORT=3478
USER="fy403"
PASSWD="qwertyuiop"
RESOLUTION="640x480" # 画面分辨率
FPS=60 # 画面帧率
#RESOLUTION="1280x720" # 画面分辨率
#FPS=10 # 画面帧率
#ADUIO_PLAYER_DEVICE="USB2.0 Device, USB Audio" # 音频播放设备
#ADUIO_PLAYER_SAMPLE_RATE=48000 # 音频采样率
#AUDIO_PLAYER_CHANNELS=2 # 音频通道数
#AUDIO_PLAYER_VOLUME=1 # 音频播放音量
```
同理,修改data_track/data_track_rtc.sh文件,修改如下:
```shell
#!/bin/bash
TARGET_HOST="fy403.cn"
TARGET_PORT=8000
IP_TYPE=4
CHECK_INTERVAL=2 # Health check interval (seconds)
CLIENT_ID="dataTrack"
STUN_SERVER="stun.l.google.com"
STUN_SERVER_PORT=19302
TURN_SERVER="tx.fy403.cn"
TURN_SERVER_PORT=3478
USER="fy403"
PASSWD="qwertyuiop"
TTY_PORT=/dev/ttyUSB0 # 电机驱动板usb端口
TTY_BAUDRATE=115200 # 电机驱动板串口波特率
GSM_PORT=/dev/ttyACM0 # 4g模块usb端口
GSM_BAUDRATE=115200 # 4g模块串口波特率
```
修改完毕后直接允许每个模块下的`./install`就行安装了并启动了。
如果需要知道参数细节,或配置更多参数。可在build目录下使用`./web_publisher -h`查看info。
```shell
./webrtc_publisher -h
```
#### 3.3 前端操作
编辑html替换信令服务器地址和STUN/TURN服务器地址
前往:[data_rtc.js](data_track/web/data_rtc.js)
```js
const dataConfig = {
iceServers: [{
urls: 'stun:stun.l.google.com:19302', // change to your STUN server
}],
};
const dataUrl = `ws://fy403.cn:8000/${dataLocalId}`;
```
前往:[video_rtc.js](data_track/web/video_rtc.js)
```js
const url = `ws://fy403.cn:8000/${localId}`;
const config = {
iceServers: [{
"urls": ["stun:stun.cloudflare.com:3478",
// "stun:stun.cloudflare.com:53"
]
},
{
"urls": [
"turn:turn.cloudflare.com:3478?transport=udp",
],
"username": "g0xxxxxxxxxxx",
"credential": "95yyyyyyyyy"
},
],
};
```
浏览器打开[index.html](data_track/web/index.html)等待画面和信号连接正常后:通过`wsad`操作,`空格`急停。按`q`重启开发板的信号服务。如果自定义了client_id,则需要修改此处。修改后点击Send可以重新建立P2P连接。
或者在项目根目录(webrtc)下执行下列脚本快速设置所有存在的client_id。
```shell
#!/bin/bash
# 生成随机字符串
RANDOM_CAM=$(tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c 8)
RANDOM_DATA=$(tr -dc 'a-zA-Z0-9' < /dev/urandom | head -c 8)
echo "将 usbcam 替换为: cam_id_${RANDOM_CAM}"
echo "将 dataTrack 替换为: data_id_${RANDOM_DATA}"
# 定义要搜索的目录
DIRS=("av_track" "data_track")
# 遍历每个目录
for dir in "${DIRS[@]}"; do
if [ -d "$dir" ]; then
echo "正在搜索目录: $dir"
find "$dir" -type f ! -path "*/.git/*" -exec grep -l -e "usbcam" -e "dataTrack" {} \; | while read file; do
# 使用sed一次性替换两个模式
sed -i -e "s/usbcam/cam_id_${RANDOM_CAM}/g" \
-e "s/dataTrack/data_id_${RANDOM_DATA}/g" "$file"
echo "已处理: $file"
done
else
echo "警告: 目录 $dir 不存在"
fi
done
```
## 技术细节
### 1.系统架构图
WebRTC(Web Real-Time Communication)是一种开源技术,支持浏览器、移动端和嵌入式设备之间的实时音视频和数据传输。其核心目标是通过点对点(P2P)连接实现低延迟通信,无需安装插件或中间媒介。可以参考[WebRTC连接原理](https://blog.csdn.net/yanceyxin/article/details/149752514)
在本案例中,将音视频数据通道和控制信号通道分离,分别在不同的RTP连接中传递数据。避免彼此相互干扰。使用WebRTC的主要目的在于:
- 它是一项提供低延迟、高质量实时音频和视频通信的技术。
- 它是一个全面的客户端多媒体框架,具有音频和视频处理能力,旨在跨平台兼容。
- 它是一组标准化的API(是W3C推荐的一部分),允许网页开发者创建多样化的实时音频和视频应用程序。
> [腾讯TRTC: WebRTC是如何工作的以及它的优缺点](https://trtc.io/zh/blog/details/what-is-webrtc))
### 2. 连接建立流程
WebRTC的连接建立分为以下几个阶段:
1. **候选地址**:通过ICE服务器获取网络地址IP,即ICE候选者信息。
2. **信令交换**:通过信令服务器(借助WebSocket)传递SDP(Session Description Protocol)和ICE候选者信息。
3. **媒体协商**:双方交换SDP,确定编解码器、分辨率等参数。
4. **网络穿透**:通过ICE信息尝试P2P(借助UDP)连接,若失败则回退到TURN中继流量。所有流量都经过TURN服务器中转。
### 3. 数据传输过程
当音视频RTP与数据RTP通道建立后,开发板将捕获的音视频数据进行编码。之后,借助4G网络将编码数据推送到桌面端。桌面端将键鼠操作封装为控制帧,同样借助4G网络传输到开发板。最后,开发板通过驱动程序将控制信号转换为控制命令,通过串口发送到电机驱动器。电机驱动器控制马达工作。
### 4.音视频工作过程
### 3.材料清单
| 名称 | 价格 | 备注 |
|:-------------:| :--: | :-----------------------------------------: |
| OrangepiZero2 | 125 | 建议买带GPU加速的开发板并附带【文档】!!! |
| 四路驱动器 | 40 | 要留意是否可以稳定板载5V给开发板子供电 |
| 摄像头 | 40 | 最好买USB免驱的,直插直用 |
| 4G网络模块 | 20 | 最好是买支持RNDIS的模块 |
| RC遥控车 | 160 | 选择自己喜欢的型号【要方便改造】 |
| 7.4V电池 | 10 | 记录选大容量【留意尺寸】 |
| USB扩展线 | 12 | 尽量选模块化的 |
| 若干线材 | 20 | 准备一些杜邦线 |
#### **控制板选择**
尽量选择带GPU的开发板子,并且还需要获取板子安装驱动的文档。这样音视频编解码速度快,也能缓解CPU的压力。
代码里面是不带GPU加速,仍然是软编码(效果还可以)。板子是4H1G,正常工作CPU利用率平均30%,内存占用300MB,音视频码率800kbps,视频延迟110ms左右。
#### **电机控制板**
电机驱动器目前支持两种方案:
**方法1**:可扩展的四路驱动板:如果考虑后续智能化改造,或者是没有RC遥控车,那么可以尝试使用。
驱动板尽量选择带稳压BEC给出开发板供电,但是有些开发板功耗比较大。用这块驱动板可能带不起来。这时候可以买一个5V的电池单独给开发板供电。或者使用大电流的电池,再外接一个降压模块。
这款开发板还支持编码电机,后续如果要升级也比较好。
在配置data_track_rtc.sh时配置:
```shell
MOTOR_DRIVER_TYPE=uart # 电机驱动类型: uart, crsf
```
**方法2**:CRSF转PWM转换器:使用RC遥控车,只需要将转换器替换RC遥控车的接收机就行。(这种是RC遥控车无损改装方案)
[RC遥控车基础电子设备 - 知乎](https://zhuanlan.zhihu.com/p/671434192)
在配置data_track_rtc.sh时配置:
```shell
MOTOR_DRIVER_TYPE=crsf # 电机驱动类型: uart, crsf
```
如果要更改舵机和电调参数可以修改data_track\include\motor_controller_config.h
```cpp
// ========== CRSF Motor Driver 配置参数 ==========
// 舵机配置(用于控制方向/左右转向)
uint16_t crsf_servo_min_pulse = 500; // 舵机最小脉冲宽度(微秒)
uint16_t crsf_servo_max_pulse = 2500; // 舵机最大脉冲宽度(微秒)
uint16_t crsf_servo_neutral_pulse = 1500; // 舵机中位脉冲宽度(微秒)
float crsf_servo_min_angle = 0.0f; // 舵机最小角度(度)
float crsf_servo_max_angle = 180.0f; // 舵机最大角度(度)
uint8_t crsf_servo_channel = 2; // CRSF 舵机通道编号(1-16)
// 电调配置(用于控制前后/前进后退)
uint16_t crsf_esc_min_pulse = 900; // 电调最小脉冲宽度(微秒)
uint16_t crsf_esc_max_pulse = 2100; // 电调最大脉冲宽度(微秒)
uint16_t crsf_esc_neutral_pulse = 1500; // 电调中位脉冲宽度(微秒)
bool crsf_esc_reversible = true; // 电调是否支持倒转
uint8_t crsf_esc_channel = 1; // CRSF 电调通道编号(1-16)
```
#### **网络通讯模块**
方法1:使用基于RNDIS的4G网络模块
选择4G模块尽量选择支持RNDIS的,这样插上USB和供电就能直接识别为一个网络接口【免去配置】。供电7.4V,用5V供电会导致信号速率低。
方法2:使用USB网络模块
只要保障开发板能够上网就行。
方法3:直接使用WIFI模块
只要保障开发板能够上网就行。
#### **摄像头模块**
方法1:USB摄像头
摄像头可以用第一种单目的【优点:柔软,小型化,已安装,缺点:过热,容易烧毁,排线易断(目前基本没看见带保修的,慎重选择!!!)】,第二种是带保修一年,一样的价格,虽然大一些;但用料好,值得入手。
方法2:MIPI CSI 摄像头
建议选择这种,一般来说。这种接口的开发板自带硬件编解码。注意一定要确定开发板带有CSI接口,并且购买的摄像头是否兼容这个开发板。
#### **声音模块**
麦克风根据开发板来选择接口,优先选择带降噪的。扬声器可以选USB接口。只要能够定位到具体参数。博主选择的都是USB接口的,扩展性好。
## 后续计划
- [x] 控制端语音推送
- [x] 被控端扬声器播放
- [ ] 编码器电机支持
- [ ] GPU加速
- [ ] X265编码
- [ ] 支持ROS系统
- [ ] 三维重建
- [ ] AI模型接入
- [ ] 自主导航
## QQ群交流
