Qt应用开发--国产工业开发板全志T113-i的部署教程
Qt在工业上的使用场景包括工业自动化、嵌入式系统、汽车行业、航空航天、医疗设备、制造业和物联网应用。Qt被用来开发工业设备的用户界面、控制系统、嵌入式应用和其他工业应用,因其跨平台性和丰富的功能而备受青睐。
Qt能够为工业领域带来什么好处:
- Qt提供了强大的图形引擎,使开发人员能够创建具有吸引力和高性能的用户界面
- Qt允许开发人员根据具体需求定制用户界面和功能。这对于满足不同行业和项目的独特需求至关重要,使工业应用能够实现个性化的解决方案
- Qt提供了丰富的库和工具,涵盖了各种应用程序开发需求,包括图形、网络通信、多媒体处理、数据存储等。这简化了工业应用程序的开发流程
- Qt可以轻松与各种硬件设备和通信协议集成,这对于工业自动化和控制系统来说非常重要,因为它们需要与各种传感器、执行器和其他工业设备进行通信
创龙科技基于全志双核Cortex-A7@1.2GHz处理器T113-i,精心设计的全国产工业开发板,它提供了Qt的运行环境,可以让我们快速的部署工业领域的用户交互界面,控制系统等。
接下来我们来聊聊如何在创龙科技T113-i工业开发板上部署Qt应用。
开发板Qt运行环境
开发板SDK准备
- 创龙科技的资料中提供了开发板的SDK-T113-i_v1.0.tar.gz,需要解压ubuntu中解压出来:
rice@rice:~$ mkdir t113 //创建t113工作目录,然后将压缩包拷贝到此目录
rice@rice:~$ cd t113
....rice@rice:~/t113$ tar -zxvf SDK-T113-i_v1.0.tar.gz
rice@rice:~/t113$ cd T113-i_v1.0/
rice@rice:~/t113/T113-i_v1.0$ ls
brandy buildroot device install_tools.sh out rtos-dsp tools
build build.sh kernel platform test
- 安装依赖软件,创龙科技提供了安装脚本:install_tools.sh,我们执行该脚本即可完成依赖工具的安装:
rice@rice:~/t113/T113-i_v1.0$ ./install_tools.sh
[sudo] password for rice:
Reading package lists... Done
Building dependency tree
Reading state information... Done
texinfo is already the newest version (6.5.0.dfsg.1-2).
0 upgraded, 0 newly installed, 0 to remove and 121 not upgraded.
Reading package lists... Done
Building dependency tree
Reading state information... Done
pkg-config is already the newest version (0.29.1-0ubuntu2).
0 upgraded, 0 newly installed, 0 to remove and 121 not upgraded.
Reading package lists... Done......
- 解压Buildroot dl–dl.tar.gz,其为 Buildroot dl 目录压缩包,用于存放从官网下载的开源软件包:
rice@rice:~/t113$ tar -xvf dl.tar.gz -C ~/t113/buildroot/buildroot-201902/
构建Qt固件
- 在编译固件前,先清理一下SDK的编译和配置生成文件:
rice@rice:~/t113/T113-i_v1.0$ ./build.sh distclean
- 配置linux内核,处理器型号,显示方式,编译器等信息
rice@rice:~/t113/T113-i_v1.0$ ./build.sh config
Welcome to mkscript setup progress
All available platform:0. linux
Choice [linux]: 0
All available linux_dev:0. bsp1. dragonboard2. longan3. tinyos
Choice [longan]: 2
All available kern_ver:0. linux-5.4
Choice [linux-5.4]: 0
All available ic:0. t1131. t113_i
Choice [t113_i]: 1
All available board:0. evb11. evb1_auto2. evb1_auto_nand3. evb1_auto_nor4. tlt113-evm-emmc5. tlt113-evm-nand6. tlt113-minievm-emmc7. tlt113-minievm-nand
Choice [tlt113-evm-nand]: 5
All available output_configs:0. hdmi1. lvds-lcd2. mipi-lcd3. tft-lcd4. cvbs
Choice [hdmi]: 0
All available flash:0. default1. nor
Choice [default]: 0
All available build_root:0. buildroot-2019021. ubuntu
Choice [buildroot-201902]: 0
All available gnueabi:0. gnueabi1. gnueabihf
Choice [gnueabi]: 0
- 设置编译的环境变量:
rice@rice:~/t113/T113-i_v1.0$ source ./build/envsetup.sh
- 我们采用一键编译 SPL、U-Boot、Linux 内核和 buildroot文件系统。
rice@rice:~/t113/T113-i_v1.0$ ./build.sh
ACTION List: mklichee;========
Execute command: mklichee
INFO: ----------------------------------------
INFO: build lichee ...
INFO: chip: sun8iw20p1
INFO: platform: linux
INFO: kernel: linux-5.4
INFO: board: tlt113-evm-nand
INFO: output: /home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan
INFO: ----------------------------------------
INFO: build buildroot ...
Prepare br toolchain gcc-linaro-5.3.1-2016.05-x86_64_arm-linux-gnueabi.tar.xz...
make: Entering directory '/home/rice/t113/T113-i_v1.0/buildroot/buildroot-201902'...
- 编译Qt库,使其开发板固件支持Qt应用运行环境:
rice@rice:~/t113/T113-i_v1.0$ ./build.sh qt
ACTION List: mkqt;========
Execute command: mkqt
INFO: build Qt ...
INFO: build arm-linux-gnueabi version's Qt
/home/rice/t113/T113-i_v1.0/platform/framework/qt/qt-everywhere-src-5.12.5
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix.....
- 打包系统镜像文件,执行之后,可以看到生成的固件文件,它默认生成两个版本的固件,分别是:nand固件和SD卡固件,我们是采用SD卡启动,所以使用SD卡固件。
rice@rice:~/t113/T113-i_v1.0$ ./build.sh pack
ACTION List: mkpack ;========
Execute command: mkpack
INFO: packing firmware ...
INFO: Use BIN_PATH: /home/rice/t113/T113-i_v1.0/device/config/chips/t113_i/bin
copying tools file
copying configs file
copying product configs file
/home/rice/t113/T113-i_v1.0/out/pack_out/aultls32.fex
/home/rice/t113/T113-i_v1.0/out/pack_out/aultools.fex
/home/rice/t113/T113-i_v1.0/out/pack_out/boot_package.cfg
/home/rice/t113/T113-i_v1.0/out/pack_out/boot_package.fex...... dsp0.fex Len: 0x3fc78
Vdsp0.fex Len: 0x4
BuildImg 0
Dragon execute image.cfg SUCCESS !
----------image is at----------size:613M /home/rice/t113/T113-i_v1.0/out/t113_i_linux_tlt113-evm-nand-sdboot_uart0.imgpack finish
运行环境验证
下载运行实例
- 将编译打包后的固件(t113_i_linux_tlt113-evm-nand-sdboot_uart0.img)放到windows上,通过工具PhoenixCard.exe烧录到SD卡上。将SD卡插到读卡器上,然后插进电脑:

- 创龙科技提供了qt的demo,我们将led_control的实例拷贝到板子上:
rice@rice:~/t113/qt-demos/led_control/bin$ scp led_control root@ip:~/
创龙T113-i上运行实例
- 关闭默认的Qt运行程序,设置qt的环境变量
root@T113-Tronlong:~# killall Launcher
root@T113-Tronlong:~# source /etc/qtenv.sh
add /dev/input/event1 to Qt Application.
find qt5 installed done
- 运行实例验证Qt功能,运行效果如图:
root@T113-Tronlong:~# ./led_control

Qt开发环境
开发环境下载
- Qt开发环境下载,作者是使用Qt 5.12.0,下载链接:https://download.qt.io/archive/qt/5.12/5.12.0/,Ubuntu需要下载:qt-opensource-linux-x64-5.12.0.run

开发环境交叉编译环境配置
- 配置Debuggers
- 点击菜单栏"Tools -> Options"
- 击"Kits -> Debuggers -> Add -> Browse…"
- 选择目标平台的GDB,路径:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan/buildroot/host/usr/bin/arm-linux-gnueabi-gdb

- 配置交叉工具链
- 点击菜单栏"Tools -> Options"
- 击"Kits -> Compilers -> Add -> GCC -> C++ -> Browse…"
- 选择目标平台的交叉工具链,路径:/home/rice/t113/T113-i_v1.0/out/t113_i/tlt113-evm-nand/longan/buildroot/host/usr/bin/arm-linux-gnueabi-g++

- 配置Qt Versions
- 点击菜单栏"Tools -> Options"
- 击"Kits -> Qt Versions -> Add -> GCC -> C++ -> Browse…"
- 选择目标平台的Qt Versions,路径:/home/rice/t113/T113-i_v1.0/platform/framework/qt/qt-everywhere-src-5.12.5/Qt_5.12.5/bin/qmake

- 配置Kits
- 点击菜单栏"Tools -> Options"
- 击"Kits -> Kits"
- 将 Name 修改为"T113",Device type 选择"Generic Linux Device",Compiler 的 C++选择"T113-GCC",Debugger 选择"T113-Debugger",Qt version 选择"T113-qt5",点击 Apply,然后点击 OK 完成配置

开发Qt应用
- 作者开发了一个快速验证硬件功能的,主要功能包含:
- 板载LED灯控制,代码实现:
static QString ledPath = "/sys/class/leds/user-led0";void rice::ledInit()
{setLedStatus(0);ui->ledPushButton->setText("LED OFF");ui->ledPushButton->setStyleSheet("border-width:1px;""border-style:solid; ""border-color:white;""background-color:rgba(88, 88, 88, 200)");
}void rice::ledDeinit()
{}bool rice::setLedStatus(int status)
{QString cmd = "echo " + QString::number(status) + " > " + ledPath + "/brightness";if (system(cmd.toStdString().c_str()) == -1) {printf("set led status failed!\n");return false;}return true;
}int rice::getLedStatus(void)
{QString cmd = "cat " + ledPath + "/brightness";FILE *fp = popen(cmd.toStdString().c_str(), "r");if (fp == nullptr) {return -1;}char led_status[32];if (fgets(led_status, sizeof(led_status), fp) == nullptr) {printf("fgets error: %s\n", cmd.toStdString().c_str());pclose(fp);return -1;}pclose(fp);return atoi(led_status);
}void rice::on_ledPushButton_clicked()
{int ledStatus = getLedStatus();if (ledStatus == 0) {setLedStatus(1);ui->ledPushButton->setText("LED ON");ui->ledPushButton->setStyleSheet("border-width:1px;""border-style:solid; ""border-color:white;""background-color:rgba(00, 205, 00, 255)");}else {setLedStatus(0);ui->ledPushButton->setText("LED OFF");ui->ledPushButton->setStyleSheet("border-width:1px;""border-style:solid; ""border-color:white;""background-color:rgba(88, 88, 88, 200)");}
}
- 板载按键检测,代码实现:
void rice::keyInit()
{keyFd = open(keyPath.toUtf8().data(), O_RDONLY);if(keyFd == -1){printf("Can not open file(%s)", keyPath.toUtf8().data());return;}ui->keyTextEdit->append("Key Monitor!\n");ui->keyTextEdit->append("Key user0 pressed!");keyNotify = new QSocketNotifier(this->keyFd, QSocketNotifier::Read, this);connect(this->keyNotify, SIGNAL(activated(int)), this, SLOT(keyHandler()));
}void rice::keyDeinit()
{}void rice::keyHandler()
{struct input_event buf;if(read(keyFd, &buf, sizeof(struct input_event)) > 0){if(buf.code == KEY_PROG1 && buf.value == 1){ui->keyTextEdit->append("Key user0 pressed!");}}
}
- RTC时钟获取并显示,代码实现:
void rice::dateInit()
{struct rtc_time rtc_tm_temp;dateFd = open(datePath.toUtf8().data(), O_RDONLY);if(dateFd == -1){printf("Can not open file(%s)", keyPath.toUtf8().data());return;}if(ioctl(dateFd, RTC_RD_TIME, &rtc_tm_temp) < 0){printf("Get date failed");return;}ui->yearLineEdit->setText(QString::number(rtc_tm_temp.tm_year + 1900));ui->monthLineEdit->setText(QString::number(rtc_tm_temp.tm_mon + 1));ui->dayLineEdit->setText(QString::number(rtc_tm_temp.tm_mday));
}void rice::dateDeint()
{}
- 网络调试助手,代码实现:
void rice::netInit()
{server = new QTcpServer();socket = new QTcpSocket();
}void rice::netDeint()
{}void rice::netNewClientConnect()
{socket = server->nextPendingConnection();connect(socket, &QTcpSocket::readyRead, this, &rice::netNewRcve);
}void rice::on_netPushButton_clicked()
{int port = ui->portLineEdit->text().toInt();if(ui->netPushButton->text() == tr("Open")){if(ui->typeComboBox->currentText() == tr("Server")){connect(server, &QTcpServer::newConnection, this, &rice::netNewClientConnect);if(!server->listen(QHostAddress::Any, port)){printf("Listen failed\n");return;}}else if(ui->typeComboBox->currentText() == tr("Client")){QString ip = ui->ipComboBox->currentText();socket->abort();socket->connectToHost(ip, port);if(!socket->waitForConnected(3000)){printf("Connect server failed");return;}connect(socket, &QTcpSocket::readyRead, this, &rice::netNewRcve);}ui->netPushButton->setText("Close");}else if(ui->netPushButton->text() == tr("Close")){if(ui->typeComboBox->currentText() == tr("Server")){socket->abort();server->close();}else if(ui->typeComboBox->currentText() == tr("Client")){socket->disconnectFromHost();}ui->netPushButton->setText("Open");}
}void rice::on_sendPushButton_clicked()
{if(socket->isOpen()){socket->write(ui->sendLineEdit->text().toUtf8().data());}
}void rice::netNewRcve()
{ui->recvTextEdit->append(socket->readAll());
}void rice::on_typeComboBox_currentIndexChanged(const QString &arg1)
{if(arg1 == tr("Server")){ui->ipComboBox->setEditable(false);}else{ui->ipComboBox->setEditable(true);}
}
Qt应用验证
- 板载LED灯控制验证,当点击开关LED按钮时,LED灯会根据状态亮灭:


- 当应用运行起来时,会获取RTC时间,并显示:

- 当板载按键按下时,窗口会显示按键按下:

- 网络调试助手支持TCP客户端和TCP服务器两种类型,下面演示服务器验证。开发板上设置板子的IP,和端口号,然后通过PC上网络调试助手连接上板子,并克实现数据的收发:
- 客户端往服务器发送数据


- 服务器往客户端发送数据


相关文章:
Qt应用开发--国产工业开发板全志T113-i的部署教程
Qt在工业上的使用场景包括工业自动化、嵌入式系统、汽车行业、航空航天、医疗设备、制造业和物联网应用。Qt被用来开发工业设备的用户界面、控制系统、嵌入式应用和其他工业应用,因其跨平台性和丰富的功能而备受青睐。 Qt能够为工业领域带来什么好处: -…...
css 常用动画效果
css 常用动画效果 文章目录 css 常用动画效果1.上下运动动画2.宽度变化动画 1.上下运动动画 <div class"box"><div class"item"></div> </div>css .box {position: relative; }.item {position: absolute;width: 50px;height: 50…...
【读书笔记】微习惯
周日晚上尝试速读一本书《微习惯》,共七章看了下目录结构并不复杂,计划每章7-8分钟读完, 从20:15-21:00。读的时候,订下闹钟,催促着自己的进度。边读边记了一些要点和微信读书里面的划线。 第六章实践内容最为丰富&…...
Oracle SQL优化
1、书写顺序和执行顺序 在Oracle SQL中,查询的书写顺序和执行顺序是不同的。 1.1SQL书写顺序如下: SELECTFROMWHEREGROUP BYHAVINGORDER BY 1.2 SQL执行顺序 FROM:数据源被确定,表连接操作也在此步骤完成。 WHERE:对…...
C++实现ATM取款机
C实现ATM取款机 代码:https://mbd.pub/o/bread/ZZeZk5Zp 1.任务描述 要求:设计一个程序,当输入给定的卡号和密码(初始卡号和密码为123456) 时,系统 能登录 ATM 取款机系统,用户可以按照以下规则进行: 查询…...
【数电笔记】11-最小项(逻辑函数的表示方法及其转换)
目录 说明: 逻辑函数的建立 1. 分析逻辑问题,建立逻辑函数的真值表 2. 根据真值表写出逻辑式 3. 画逻辑图 逻辑函数的表示 1. 逻辑表达式的常见表示形式与转换 2. 逻辑函数的标准表达式 (1)最小项的定义 (2&am…...
Gradio库的安装和使用教程
目录 一、Gradio库的安装 二、Gradio的使用 1、导入Gradio库 2、创建Gradio接口 3、添加接口到Gradio应用 4、处理用户输入和模型输出 5、关闭Gradio应用界面 三、Gradio的高级用法 1、多语言支持 2、自定义输入和输出格式 3、模型版本控制 4、集成第三方库和API …...
【BLE基础知识】--Slave latency设置流程及空中包解析
1、Slave latency基本概念 当BLE从设备对耗电量要求较高时,若需要节省耗电量,则可以通过设置Slave Latency参数来减少BLE从设备的耗电。 Slave Latency:允许Slave(从设备)在没有数据要发的情况下,跳过一定…...
数据结构之堆排序以及Top-k问题详细解析
个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 欢迎大家点赞,评论,收藏。 一起努力 目录 1.前言 2.堆排序 2.1降序排序 2.2时间复杂…...
ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO
ESP32-Web-Server 实战编程-通过网页控制设备多个 GPIO 概述 上节 ESP32-Web-Server 实战编程-通过网页控制设备的 GPIO 讲述了如何通过网页控制一个 GPIO。本节实现在网页上控制多个 GPIO。 示例解析 前端设计 前端代码建立了四个 GPIO,如下死 GPIO 2 在前端的…...
说一说MySQL中的锁机制
说一说MySQL中的锁机制 按粒度大小从大到小分为 全局锁 全局锁 全局锁是对整个数据库的锁,最常用的全局锁就是读写锁 读锁 阻止其他用户更新数据,允许其他用户读数据写锁 阻止其他用户更新和读数据 修改一些大量的数据,并且不希望其他用户…...
C++笔试训练day_1
文章目录 选择题编程题 选择题 编程题 #include <iostream> #include <algorithm> #include <vector>using namespace std;int main() {int n 0;cin >> n;vector<int> v;v.resize(3 * n);int x 0;for(int i 0; i < v.size(); i){cin >&…...
详解Spring对Mybatis等持久化框架的整合
😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…...
[Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
在使用 electron-packager 工具输出 linux 平台的 electron app 后,可以使用 electron-installer-debian 工具把 app 打包成供Ubuntu平台下安装的 debian 包。 electron-installer-debian是一个用于创建 Debian Linux(.deb)安装包的开发工…...
7.24 SpringBoot项目实战【审核评论】
文章目录 前言一、编写控制器二、编写服务层三、Postman测试前言 我们在 上文 7.23 已经实现了 评论 功能,本文我们继续SpringBoot项目实战 审核评论 功能。逻辑如下: 一是判断管理员权限,关于角色权限校验 在 7.5 和 7.6 分别基于 拦截器Interceptor 和 切面AOP 都实现过…...
Java实现动态加载的逻辑
日常工作中我们经常遇到这样的场景,某某些逻辑特别不稳定,随时根据线上实际情况做调整,比如商品里的评分逻辑,比如规则引擎里的规则。 常见的可选方案有: JDK自带的ScriptEngine 使用groovy,如GroovyClassLoader、Gro…...
数据库的设计规范
文章目录 第一范式(1NF):列不可再分 第二范式 (2NF):所有非主键字段,都必须 完全依赖主键,不能部分依赖 第三范式(3NF):所有非主键字段不能依赖于…...
正则表达式从放弃到入门(2):grep命令详解
正则表达式从放弃到入门(2):grep命令详解 总结 本博文转载自 这是一篇”正则表达式”扫盲贴,如果你还不理解什么是正则表达式,看这篇文章就对了。 如果你是一个新手,请从头阅读这篇文章,如果你…...
用Java写一个王者荣耀游戏
目录 sxt包 Background Bullet Champion ChampionDaji GameFrame GameObject Minion MinionBlue MinionRed Turret TurretBlue TurretRed beast包 Bear Beast Bird BlueBuff RedBuff Wolf Xiyi 打开Eclipse创建图片中的几个包 sxt包 Background package sxt;…...
基于SSM的新闻网站浏览管理实现与设计
基于ssm的新闻网站浏览管理实现与设计 摘要:在大数据时代下,科技与技术日渐发达的时代,人们不再局限于只获取自己身边的信息,而是对全球信息获取量也日渐提高,网络正是打开这新世纪大门的钥匙。在传统方式下ÿ…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
从物理机到云原生:全面解析计算虚拟化技术的演进与应用
前言:我的虚拟化技术探索之旅 我最早接触"虚拟机"的概念是从Java开始的——JVM(Java Virtual Machine)让"一次编写,到处运行"成为可能。这个软件层面的虚拟化让我着迷,但直到后来接触VMware和Doc…...
