开源扫地机器人:全栈机器人工程实践沙盒

开源扫地机器人全栈方案:从硬件选型到SLAM算法实践 嵌入式系统与机器人技术的结合正催生大量开源项目,硬件爱好者得以深入掌握从底层控制到上层算法的完整链路。SLAM(即时定位与建图)是移动机器人自主导航的核心原理,它通过融合激光雷达与编码器等传感器数据,实时构建环境地图并定位自身位置。基于ROS(机器人操作系统)的开源生态,开发者可以复用成熟的建图与路径规划算法,将理论快速转化为实践。这种技术价值不仅体现在学习上,更在于可定制的工程落地。在扫地机器人这一典型场景中,从差速底盘电机控制、传感器选型,到Cartographer回环检测与弓字形全覆盖路径规划,开源方 阅读详情

1. 一台会扫地的机器,装着一整套机器人工程课程

你有没有拆过一台扫地机器人?不是为了修它,而是把它当成一本立体教科书——电机驱动板上印着PWM调速的实践注脚,激光雷达数据流里藏着SLAM算法的实时心跳,树莓派SD卡里躺着ROS2节点的完整生命周期,连底盘轮子打滑时的微小震动,都在教你怎么写一个鲁棒的运动学补偿器。这台机器不是消费电子,而是一套可触摸、可调试、可重写的机器人工程全栈沙盒。它把“机器人”从抽象概念拉回物理世界:STM32负责毫秒级响应的底层执行,树莓派跑ROS2做决策中枢,ADXL345加速度计告诉你当前是否在爬坡,超声波模块实时校验激光建图的边界误差,甚至ILI9341屏幕上的A1A1读ID失败日志,都成了嵌入式调试的第一课。它不依赖厂商黑盒固件,所有代码仓库公开、硬件设计开源、BOM清单可查、PCB文件可下载。这不是玩具,是带电源适配器的大学实验室——你不需要申请工位,插电就能开始调试导航栈;你不用等导师批复采购单,GitHub上fork一下就能部署建图节点;你甚至能用树莓派Pico控制舵机改出一个简易机械臂,接在原底盘上做二次开发。关键词“开源扫地机器人”背后,是嵌入式、运动控制、传感器融合、SLAM、路径规划、ROS2中间件、实时通信、低功耗管理、人机交互这八大工程模块的实体化集成。它适合三类人:刚学完C语言想落地的大学生,卡在ROS2话题通信却不知数据包怎么从STM32发到树莓派的工程师,还有想给孩子讲清“机器人怎么知道该往哪走”的家长——因为它的每一行代码,都对应着一个真实物理动作;每一次建图失败,都暴露一个未被考虑的环境变量;每一块PCB铜箔走向,都在无声讲述信号完整性与EMC设计的取舍。

2. 全栈拆解逻辑:为什么必须是“全栈”,而不是“单点突破”

2.1 机器人不是软件或硬件的单点游戏,而是系统级耦合体

很多人初学机器人,容易陷入“技术孤岛”:学ROS2就只跑Gazebo仿真,刷STM32就专注串口收发,玩树莓派就折腾桌面环境。但真实机器人从不按学科分界线工作。比如一次简单的“沿墙清扫”任务,背后是六层协同:

  • 物理层 :直流电机驱动芯片(如TB6612FNG)接收PWM信号,但占空比计算必须考虑电池电压衰减——STM32的ADC实时采样Vbat,动态调整PWM基准;
  • 驱动层 :STM32固件中编码器中断服务程序(ISR)每5ms读取正交脉冲,但若未关闭全局中断导致计数丢失,上层里程计就会累积漂移;
  • 中间件层 :树莓派通过UART向STM32发送运动指令,但波特率设为115200时,若未启用硬件流控(RTS/CTS),高速连续指令会导致STM32接收缓冲区溢出丢帧;
  • 算法层 :ROS2的nav2导航栈发布/cmd_vel,但其线速度指令需经运动学模型(差速轮模型)转为左右轮目标转速,而该模型参数(轮距、轮径)必须与实际底盘机械尺寸严格一致,否则转弯半径偏差直接导致撞墙;
  • 感知层 :RPLIDAR A1扫描数据经ROS2 topic发布,但原始点云需先做角度补偿(因电机转速波动导致扫描频率非恒定),再滤波去噪,否则建图时出现“鬼影”;
  • 人机层 :ILI9341屏幕显示实时状态,但SPI总线速率设为20MHz时,若未在STM32 HAL库中配置DMA双缓冲,屏幕刷新会阻塞主循环,导致超声波测距任务延迟超时。

提示:全栈拆解的核心价值,不是让你成为每个领域的专家,而是建立“故障溯源链”。当机器人建图错乱时,你能快速判断是激光雷达供电纹波过大(硬件)、点云时间戳未同步(中间件)、还是AMCL粒子滤波器协方差设置不合理(算法)——这种跨层诊断能力,只能在真实全栈系统中锤炼。

2.2 开源不是“有代码就行”,而是可验证、可复现、可演进的工程闭环

市面上不少所谓“开源机器人”,实际只开放了APP源码或部分ROS节点。真正的工程级开源必须满足三个硬性条件:

  1. 硬件可复现 :提供完整的KiCad工程文件(.pro/.sch/.pcb),包含器件选型依据(如为何选用STM32F407而非F429——因前者内置USB OTG PHY节省外围电路)、PCB叠层设计(4层板中电源层与地层紧耦合以降低阻抗)、关键信号走线长度匹配(如SPI时钟线与数据线等长±5mil);
  2. 固件可调试 :STM32代码基于HAL库但剥离了CubeMX生成的冗余初始化,所有外设配置用寄存器级注释说明(如 // RCC->CFGR |= RCC_CFGR_PPRE1_DIV2; // APB1总线分频2,确保TIM2时钟=84MHz/2=42MHz,匹配编码器10ms采样周期 );
  3. 系统可演进 :树莓派镜像非预装系统,而是提供Yocto构建脚本,允许用户自定义内核模块(如为ADXL345添加IIO驱动支持)、裁剪不必要的服务(禁用蓝牙、WiFi以降低功耗)、甚至更换ROS2发行版(Humble→Jazzy)。

我实测过某款标称“开源”的扫地机器人,其GitHub仓库只有ROS2 launch文件和几个Python节点,但关键的STM32运动控制固件、激光雷达驱动固件、电源管理IC(TPS63020)配置代码全部缺失。用户无法修改电机PID参数,不能调整激光扫描频率,更无法理解为何电量低于20%时突然停止工作——因为电源管理逻辑被固化在未开源的MCU固件中。真正的开源项目,应该让一个大二学生拿着BOM清单和PCB图,用嘉立创打样、ST-Link烧录、Wireshark抓包,两周内复现出基础运动功能。

2.3 ROS2不是“高级玩具”,而是工业级机器人系统的事实标准

很多初学者对ROS2存在误解:认为它是“Linux桌面端的机器人玩具框架”。但现实是,ROS2已被ISO/IEC 15288标准采纳为机器人系统架构参考模型,波音777X的飞行控制系统测试平台、西门子工业AGV调度系统、NASA火星车地面仿真环境均深度集成ROS2。其核心优势在于:

  • 实时性保障 :通过DDS(Data Distribution Service)中间件,支持多种QoS策略。例如,/tf话题必须设置 Reliability=RELIABLE (确保坐标变换不丢失),而/scan点云可设为 Best Effort (容忍少量丢包以降低延迟);
  • 跨平台确定性 :同一套C++节点代码,既可在树莓派ARM64上编译运行,也能交叉编译至STM32H7(通过ROS2 Micro-ROS),甚至部署到x86_64工业PC——这得益于ROS2的分层架构(rclcpp/rclc/rclpy统一API);
  • 安全可信机制 :ROS2原生支持TLS加密通信、DDS-Security权限控制、节点签名验证。在开源扫地机器人中,这意味着你可以为遥控APP与底盘建立双向证书认证,防止未授权设备接入控制总线。

注意:不要被“ROS2菜鸟教程”误导。真正掌握ROS2,不是学会 ros2 run 命令,而是理解 rmw_implementation 如何桥接不同DDS供应商(Fast DDS vs Cyclone DDS),明白 rclcpp::

开源扫地机器人全栈拆解:从SLAM到运动控制的机器人工程实践 移动机器人系统通常由感知、定位建图、路径规划与运动控制等核心模块构成,各模块通过数据流与坐标变换紧密耦合。SLAM技术利用激光雷达与IMU等多传感器融合,实现实时定位与环境建图;路径规划则结合全局与局部算法,在代价地图上完成避障与导航。这些技术不仅是机器人工程的基础,也广泛应用于自动驾驶与服务机器人领域。开源扫地机器人作为典型载体,将上述模块集成于低成本硬件中,为学习全栈机器人开发提供了完整实践平台。 阅读详情

相关推荐

开源扫地机器人全栈拆解:从ROS2、SLAM到导航的机器人工程实践

自主移动机器人(AMR)的核心技术栈涵盖传感器融合、SLAM建图与路径规划,其原理在于通过多传感器数据融合实现实时定位与地图构建,并基于分层规划完成自主导航。这些技术不仅支撑工业AGV与无人配送,也广泛应用于家庭服务机器人。开源扫地机器人正是AMR的典型载体,它集成了ROS2通信、激光SLAM与全覆盖路径规划,为机器人工程学习提供了低成本、高还原度的实践平台。本文围绕开源扫地机器人,深入拆解其硬件架构与软件节点,详解SLAM与导航实现,并给出ROS2仿真复现路径。

weixin_30769455的博客 270

开源扫地机器人全栈项目:ROS2+STM32机器人工程实践指南

机器人操作系统(ROS)是现代服务机器人开发的核心中间件,而实时嵌入式控制则是保障运动安全与响应确定性的基础。理解ROS2通信机制、QoS策略与节点生命周期管理,结合STM32等MCU实现硬实时电机控制与多传感器融合,构成了机器人从感知到执行的完整技术闭环。这种‘上位机决策+下位机执行’的分层架构,不仅支撑SLAM建图、自主导航与动态避障等高级功能,更广泛应用于AGV、清洁机器人、教育平台等实际场景。本文以一个可复现、可教学、全开源的扫地机器人项目为载体,深入解析ROS2 Humble与STM32F407协

weixin_29186249的博客 339

开源扫地机器人全栈拆解:从机械结构到SLAM算法的机器人工程实战

机器人工程涉及感知、决策、控制与执行等多技术栈的融合,其核心在于通过传感器数据实现环境理解与运动控制。开源扫地机器人作为典型的移动机器人平台,集成了差速驱动运动学、多传感器融合、电机闭环控制、SLAM与全覆盖路径规划等关键技术,是学习嵌入式系统与机器人算法的理想载体。通过全栈拆解,可系统掌握从底盘机械设计、电源管理到激光雷达建图定位的完整工程实现,适用于智能家居、服务机器人及自主导航等场景。本文以开源扫地机器人为例,深入剖析其五层技术架构与可复现方案。

weixin_29182481的博客 271

开源扫地机器人全栈拆解:从STM32到SLAM的机器人工程课

嵌入式开发与机器人技术常被初学者视为两个世界:前者聚焦寄存器与驱动,后者需要系统思维与算法整合。一台开源扫地机器人恰好架起桥梁。从硬件看,它集成STM32主控、ESP32协处理器、激光雷达、IMU与编码器,构成完整的感知-决策-执行闭环;从软件看,FreeRTOS实时调度、PID电机控制、Gmapping或Cartographer SLAM建图、弓字形路径规划,每一层都是工业级方案。通信层采用MQTT连接云端,App端完成地图渲染与交互,OTA保障远程升级,整条链路覆盖了嵌入式、物联网、后端与移动开发。无论

weixin_34238633的博客 428

Rust 编译工具链配置指南:从 link.exe 缺失到完美解决

本文详细解析了Windows下Rust编译时常见的'link.exe not found'错误,提供了MSVC和MinGW-w64两种工具链的完整配置指南。从Visual Studio组件安装到环境变量设置,再到疑难排查技巧,帮助开发者彻底解决Rust编译工具链配置问题,提升开发效率。

earth的博客 309

量子阱技术解析:从基础原理到前沿应用

本文深入解析量子阱技术,从微观“能量游泳池”的基础原理出发,阐释了其通过限制电子实现能级量子化,从而精确调控发光波长的核心机制。文章详细探讨了量子阱在半导体激光器和LED中的革命性应用,如实现低阈值电流与高亮度显示,并展望了其在能带工程及量子级联激光器等前沿领域的发展与挑战。

weixin_29267307的博客 274

Quartus II 13.1 出现 ‘‘can‘t find design entity <Filename>‘‘ 问题的解决方法

Quartus II 13.1 出现 ''can't find design entity '' 问题的解决方法

qq_62076686的博客 1万+

【HDR】曝光融合(Exposure Fusion)

在曝光融合(Exposure Fusion)算法问世之前,多曝光序列合成用于显示的HDR需要两个步骤,第一步是将多张不同曝光的低动态范围图像合成为HDR(例如Debevec提出的加权融合方法),通常HDR为12bit或者16bit;第二步是通过tonemapping对高动态范围HDR进行压缩以支持低动态范围显示设备(例如Durand提出的基于双边滤波的tonemapping算法),一般会压缩至8bit。

专注人工智能,主攻CV 1万+

matinal:SAP ABAP 关于sftp的发送接收源代码

如果您将目标系统的凭据存储在该 RFC 连接中,您可以安排程序并将其作为后台作业运行:凭据将从 SM59 配置中获取,并且在文件传输期间不会提示您输入它们。这尤其适用于安全问题:您有责任为您的编码添加安全功能,并相应地配置您的系统(例如,保护您的系统免受病毒侵害)。注意:在创建自己的程序时,请特别注意示例代码中以“@CUSTOMER”开头的注释,因为您需要实现自己的逻辑。本说明为您提供示例编码以支持您创建自己的程序。在 STRUST 事务中,您维护了一个 PSE 并导入了您要发送的文件的最终收件人的证书。

matinal 當冬夜漸暖 。公众号:matinal 1328

EXCEL VBA从入门到精通 前言

本书通过丰富的实例和案例,帮助读者更好地理解和应用Excel VBA编程,同时也介绍了常用的工具、资源、社区和协作平台等,方便读者进行进一步的学习和开发。我强烈推荐这本书给所有希望学习和掌握Excel VBA编程的读者。多样化的资源和工具介绍:本书介绍了丰富的工具和资源,包括官方文档、在线教程、代码库、论坛、博客等,方便读者进行进一步的学习和开发。详细的讲解和丰富的示例:本书从语法和对象开始讲解,通过丰富的实例和案例,帮助读者更好地理解和应用Excel VBA编程。第一节:什么是VBA 5。

1695

[关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱

本文主要讲解Gephi绘制作者间的关系图谱,该软件可以广泛应用于社交网络、知识图谱分析,推荐读者使用。这是非常基础的一篇文章,重点讲解Gephi使用方法,希望对大家有所帮助。

杨秀璋的专栏 1万+

再不入坑就晚了,深度神经网络概念大整理,最简单的神经网络是什么样子?

再不入坑就晚了,深度神经网络概念大整理,最简单的神经网络是什么样子?

我是香菜 3万+

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: Chrome浏览器网页版SIP客户端:从注册到通话的完整实现指南
下一篇: SPSS问卷数据分析:信度效度检验全流程详解
weixin_33796205
博客等级 码龄11年 5014粉丝 1175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值