Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/bohonghuang/rov-host

A cross-platform, high-performance underwater robot controll program written in Rust
https://github.com/bohonghuang/rov-host

Last synced: about 1 month ago
JSON representation

A cross-platform, high-performance underwater robot controll program written in Rust

Awesome Lists containing this project

README

        

#+BEGIN_COMMENT
README.org

Copyright 2021-2022 Bohong Huang

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see .
#+END_COMMENT
#+TITLE: 水下机器人上位机
#+LATEX_HEADER: \hypersetup{colorlinks=true,linkcolor=black}
#+OPTIONS: AUTHOR:nil DATE:nil
#+AUTHOR: Bohong Huang
[[./documents/screenshot.png]]
* 特性
- 使用 [[https://www.rust-lang.org][Rust]] 进行高性能、内存安全的应用程序的开发
- 基于 [[https://gtk.org][GTK4]]/[[https://gitlab.gnome.org/GNOME/libadwaita][libadwaita]] 构建现代的[[https://wikipedia.org/wiki/Graphical_user_interface][图形用户界面]]
- 跨平台
- [[https://wikipedia.org/wiki/Microsoft_Windows][Microsoft Windows]]
- [[https://wikipedia.org/wiki/MacOS][MacOS]]
- [[https://wikipedia.org/wiki/Linux][GNU/Linux]]
- 全屏模式
- 夜间模式
- 通过 [[https://www.libsdl.org][SDL2]] 支持多手柄输入
- 通过 [[https://gstreamer.freedesktop.org][GStreamer]] 对视频流进行多种格式的实时编解码
- 视频协议
- [[https://wikipedia.org/wiki/User_Datagram_Protocol][UDP]]
- [[https://wikipedia.org/wiki/Real-time_Transport_Protocol][RTP]]
- [[https://wikipedia.org/wiki/Real_Time_Streaming_Protocol][RTSP]]
- 视频拉流(解码)
- [[https://wikipedia.org/wiki/H.264][H.264]]
- [[https://wikipedia.org/wiki/H.265][H.265]]
- [[https://wikipedia.org/wiki/VP8][VP8]]
- [[https://wikipedia.org/wiki/VP9][VP9]]
- [[https://wikipedia.org/wiki/AV1][AV1]]
- 视频录制(编码)
- 不编码(跟随拉取视频流的编码)
- [[https://wikipedia.org/wiki/H.264][H.264]]
- [[https://wikipedia.org/wiki/H.265][H.265]]
- [[https://wikipedia.org/wiki/VP8][VP8]]
- [[https://wikipedia.org/wiki/VP9][VP9]]
- [[https://wikipedia.org/wiki/AV1][AV1]]
- 硬件加速
- [[https://wikipedia.org/wiki/CUDA][CUDA]]
- [[https://wikipedia.org/wiki/Nvidia_NVENC][NVENC]]
- [[https://wikipedia.org/wiki/Nvidia_NVDEC][NVDEC]]
- [[https://wikipedia.org/wiki/Direct3D][Direct3D]]
- [[https://wikipedia.org/wiki/Video_Acceleration_API][Video Acceleration API]]
- 使用 [[https://opencv.org][OpenCV]] 进行实时图像后处理(图像增强)
- 支持使用多种图像格式保存经过后处理的图像
- [[https://wikipedia.org/wiki/JPEG][JPEG]]
- [[https://wikipedia.org/wiki/Portable_Network_Graphics][PNG]]
- [[https://wikipedia.org/wiki/TIFF][TIFF]]
- [[https://wikipedia.org/wiki/BMP_file_format][BMP]]
- 多机位并行操作、并行显示与同步录制
- 在线固件更新
- 在线参数调整
* 构建
请确保 [[https://www.rust-lang.org][Rust]] 与 [[https://doc.rust-lang.org/cargo][Cargo]] 已正确安装,并运行:
- [[https://wikipedia.org/wiki/Microsoft_Windows][Microsoft Windows]] \\
#+BEGIN_SRC bat
cargo rustc --release -- -C link-args=-mwindows
#+END_SRC
- [[https://wikipedia.org/wiki/MacOS][MacOS]]、[[https://wikipedia.org/wiki/Linux][GNU/Linux]] \\
#+BEGIN_SRC sh
cargo build --release
#+END_SRC
** 编译依赖
- [[https://gtk.org][GTK4]]
- [[https://gitlab.gnome.org/GNOME/libadwaita][libadwaita]]
- [[https://www.libsdl.org][SDL2]]
- [[https://gstreamer.freedesktop.org][GStreamer]]
- [[https://opencv.org][OpenCV]]
* 通信
上位机与下位机之间使用 [[https://wikipedia.org/wiki/JSON][JSON]] 数据包通过 [[https://wikipedia.org/wiki/Transmission_Control_Protocol][TCP]] 协议进行通信,一个数据包可以包含任意数量的有效命令,基本框架如下:
#+BEGIN_SRC json
{
"command1" : null,
"command2" : "arg",
"command3" : ["arg1", "arg2"],
"command4" : { "key1": "value1", "key2": "value2" }
// ...
}
#+END_SRC
当前有效的发送命令如下:
| 命令 | 描述 |
|------------------------------------+-------------------------|
| ~x~ | 控制机器人左右平移 |
| ~y~ | 控制机器人前进或后退 |
| ~z~ | 控制机器人的上浮或下沉 |
| ~set_debug_mode_enabled~ | 启用/禁用下位机[[调试模式][调试模式]] |
| ~set_propeller_values~ | [[设置推进器输出][设置推进器输出]] |
| ~set_propeller_parameters~ | [[设置参数][设置推进器参数]] |
| ~set_control_loop_parameters~ | [[设置参数][设置控制环参数]] |
| ~set_propeller_pwm_freq_calibration~ | 设置 PWM 频率 |
| ~save_parameters~ | 保存参数 |
| ~load_parameters~ | 请求读取参数 |
| ~firmware_update~ | 进行固件更新 |
当前有效的接收命令如下:
| 命令 | 描述 |
|-----------------------------+----------------|
| ~feedbacks~ | 反馈数据 |
| ~set_propeller_parameters~ | [[设置参数][设置推进器参数]] |
| ~set_control_loop_parameters~ | [[设置参数][设置控制环参数]] |
| ~info~ | 显示任意信息 |
** 发送
*** 控制
#+BEGIN_SRC json
{
"x" : 0.0, // 左右平移
"y" : -0.5, // 前进后退
"z" : 0.8, // 上浮下沉
"rot" : 0.1, // 左右旋转
"catch" : 0.0, // 机械臂
"depth_locked" : false, // 深度锁定
"direction_locked" : true // 方向锁定
}
#+END_SRC
*** 设置推进器输出
#+BEGIN_SRC json
{
"set_propeller_values": {
"front_left" : 127, // 推进器名称与输出
"back_right" : -128
// ...
}
}
#+END_SRC
~set_propeller_values~ 命令可以一次性设置多个推进器输出,范围在 ~-128~ 与 ~127~ 之间。
*** 设置参数
#+BEGIN_SRC json
{
"set_propeller_parameters": { // 推进器参数
"back_right": { // 推进器名称
"deadzone_upper" : 8, // 死区上限
"deadzone_lower" : -12, // 死区下限
"power_positive" : 0.75, // 正向动力百分比
"power_negative" : 0.75, // 反向动力百分比
"reversed" : false,// 是否反转
"enabled" : true // 启用/禁用推进器
}
// ...
},
"set_control_loop_parameters": { // 控制环参数
"depth_lock": { // 控制环名称
"p" : 1.0, // 比例调节
"i" : 2.0, // 积分调节
"d" : 0.5 // 微分调节
}
// ...
},
"set_propeller_pwm_freq_calibration": 0.01
}
#+END_SRC
*** 读取/保存参数
**** 读取参数
上位机向下位机发送:
#+BEGIN_SRC json
{ "load_parameters" : null }
#+END_SRC
下位机接收到该命令后,向上位机发送[[设置参数][设置参数]]数据包。
**** 保存参数
上位机向下位机发送:
#+BEGIN_SRC json
{ "save_parameters" : null }
#+END_SRC
下位机接收到该命令后,将[[https://wikipedia.org/wiki/Random-access_memory][内存]]中的参数写入[[https://wikipedia.org/wiki/Non-volatile_memory][非易失性存储器]]中,以便记忆设置的参数。
*** 调试模式
**** 启用调试模式
上位机向下位机发送:
#+BEGIN_SRC json
{ "set_debug_mode_enabled": true }
#+END_SRC
下位机收到命令后将启用调试模式。
**** 禁用调试模式
上位机向下位机发送:
#+BEGIN_SRC json
{ "set_debug_mode_enabled": false }
#+END_SRC
下位机收到命令后将禁用调试模式。
*** 固件更新
上位机先向下位机发送:
#+BEGIN_SRC json
{
"firmware_update": {
"size" : 12345678, // 数据包大小
"compression" : "none", // 压缩方式:"gzip" 、"none"
"md5" : "3f89ba32a56cb03b5d4e93ed2d033f75" // MD5 校验
}
}
#+END_SRC
然后直接向下位机发送以 ~compression~ 方式压缩的二进制流。下位机接收到此命令后,
立即准备接收长度为 ~size~ 的数据包。下位机接收完成后,以 ~compression~ 方式解压并对解压后的数据进行 [[https://wikipedia.org/wiki/MD5][MD5]] 校验。
如果校验的结果与 ~md5~ 一致,直接替换下位机可执行文件,然后重启完成固件更新。
** 接收
*** 反馈
上位机支持在调节控制环时,通过图表的方式实时可视化显示下位机传感器数据,
下位机以一定时间间隔向上位机发送反馈数据:
#+BEGIN_SRC json
{
"feedbacks": {
"control_loops": {
"depth_lock" : 1.0,
"direction_lock" : -1.0
// ...
}
}
}
#+END_SRC
上位机接收到数据后,显示的图表会根据用户设置进行更新。
*** 信息
上位机支持在操作机器人过程中,实时显示机器人的信息,如航向角、舱内温度等。
下位机可以向上位机发送任何想要显示的信息:
#+BEGIN_SRC json
{
"info": {
"温度" : "25℃",
"航向角" : "37°"
// ...
}
}
#+END_SRC