基于动力学的MPC控制器设计盲点解析
文章目录
-
- Apollo MPC控制器的设计架构
- 误差模型和离散化
- 预测模型推导
- 目标函数和约束设计
- 优化求解
- 优化OSQP求解器
- 参考文献
Apollo MPC控制器的设计架构
误差模型和离散化
状态变量和控制变量
1、Apollo MPC控制器中状态变量主要有如下6个
matrix_state_ = Matrix::Zero(basic_state_size_, 1);// State matrix update;matrix_state_(0, 0) = debug->lateral_error();matrix_state_(1, 0) = debug->lateral_error_rate();matrix_state_(2, 0) = debug->heading_error();matrix_state_(3, 0) = debug->heading_error_rate();matrix_state_(4, 0) = debug->station_error();matrix_state_(5, 0) = debug->speed_error();
状态变量计算:
控制变量有两个:
其中
为前轮转角,
为加速度补偿
Eigen::MatrixXd control_matrix(controls_, 1);control_matrix << 0, 0;
在代码中控制量的计算和输出:
// 解mpc,输出一个vector,control内有10个control_matrix SolveLinearMPC(matrix_ad_, matrix_bd_, matrix_cd_, matrix_q_updated_,matrix_r_updated_, lower_bound, upper_bound, matrix_state_, reference,mpc_eps_, mpc_max_iteration_, &control) // 已知,mpc仅取第一组解为当前时刻最优控制解,即control[0] // steer_single_direction_max_degree_ --- the maximum turn of steer // control中第一个矩阵中的第一个值用于计算方向盘转角 double steer_angle_feedback = control[0](0, 0) * 180 / M_PI *steer_transmission_ratio_ /steer_single_direction_max_degree_ * 100;double steer_angle = steer_angle_feedback + steer_angle_feedforwardterm_updated_ +steer_angle_ff_compensation + steer_angle_feedback_augment;// control中第一个矩阵中的第二个值control[0](1, 0),用于计算加速度 = 加速度补偿 + 期望加速度 + 坡度加速度补偿 debug->set_acceleration_cmd_closeloop(control[0](1, 0)); double acceleration_cmd = control[0](1, 0) + debug->acceleration_reference() + control_conf_.enable_slope_offset() * debug->slope_offset_compensation();
动力学误差模型
代码实现:
// 初始化矩阵 Status MPCController::Init(const ControlConf *control_conf) {...// Matrix init operations.matrix_a_ = Matrix::Zero(basic_state_size_, basic_state_size_);matrix_ad_ = Matrix::Zero(basic_state_size_, basic_state_size_);...// TODO(QiL): expand the model to accomendate more combined states.matrix_a_coeff_ = Matrix::Zero(basic_state_size_, basic_state_size_);...matrix_b_ = Matrix::Zero(basic_state_size_, controls_);matrix_bd_ = Matrix::Zero(basic_state_size_, controls_);...matrix_bd_ = matrix_b_ * ts_;matrix_c_ = Matrix::Zero(basic_state_size_, 1);...matrix_cd_ = Matrix::Zero(basic_state_size_, 1);...}// 更新矩阵 void MPCController::UpdateMatrix(SimpleMPCDebug *debug) {const double v = VehicleStateProvider::instance()->linear_velocity();matrix_a_(1, 1) = matrix_a_coeff_(1, 1) / v;matrix_a_(1, 3) = matrix_a_coeff_(1, 3) / v;matrix_a_(3, 1) = matrix_a_coeff_(3, 1) / v;matrix_a_(3, 3) = matrix_a_coeff_(3, 3) / v;Matrix matrix_i = Matrix::Identity(matrix_a_.cols(), matrix_a_.cols());matrix_ad_ = (matrix_i + ts_ * 0.5 * matrix_a_) *(matrix_i - ts_ * 0.5 * matrix_a_).inverse();matrix_c_(1, 0) = (lr_ * cr_ - lf_ * cf_) / mass_ / v - v;matrix_c_(3, 0) = -(lf_ * lf_ * cf_ + lr_ * lr_ * cr_) / iz_ / v;matrix_cd_ = matrix_c_ * debug->heading_error_rate() * ts_; }// 求解MPC // discrete linear predictive control solver, with control format // x(i + 1) = A * x(i) + B * u (i) + C bool SolveLinearMPC(const Matrix &matrix_a, const Matrix &matrix_b,const Matrix &matrix_c, const Matrix &matrix_q,const Matrix &matrix_r, const Matrix &matrix_lower,const Matrix &matrix_upper,const Matrix &matrix_initial_state,const std::vector<Matrix> &reference, const double eps,const int max_iter, std::vector<Matrix> *control)
apollo使用的是双线性变换离散法的方法:
matrix_ad_ = (matrix_i + ts_ * 0.5 * matrix_a_) *(matrix_i - ts_ * 0.5 * matrix_a_).inverse();matrix_bd_ = matrix_b_ * ts_;matrix_cd_ = matrix_c_ * debug->heading_error_rate() * ts_;
补充:
Apollo采用的中点欧拉法和向前欧拉法的结合:
预测模型推导
为什么不用上述推导出的离散化的状态空间方程来推导我们的预测模型,以此来设计MPC控制器?
主要考虑在设计目标函数的时候,想将我们的控制增量设计到我们的目标函数中去,而非直接使用控制量,以控制增量为代价,能有效改善控制的平滑性。
此处我们需要注意的是:
- 控制步长为Nc,因此当预测步长为k+Nc+1时,此时预测状态y(k+Nc+1)的最后一项也只写到k+Nc-1。因为到k+Nc时刻及以后的控制量有两种处理策略:第一种就是控制步长Nc之后的预测控制量保持不变;第二种就是Nc之后的预测控制量全部置零。我们此处达到控制步长之后的控制量全置零;
- 最终推导出的系统的预测模型Y, 其可以根据系统当前的状态量,以及施加一个未来一段时间Nc序列的控制增量,我们就可以知道系统未来(Np步)的表现是什么样子的(系统输出),即y(k+1)~y(k+Np);
目标函数和约束设计
设计目标:
- 希望我们的路径跟踪误差在预测时域内尽可能趋于0,也即希望目标函数的第一项的几个状态量尽可能趋于0,这样我们的车辆才能更好的跟随规划路径;
- 其次,我们希望目标函数的第二项控制增量的代价越小越好,也即希望前后两帧的控制量变化越小越好,这样控制的效果越平滑,对应前轮转角和加速度变化越平滑;
- 目标函数最后一项引入松弛因子(在程序中是一个具体的数值),其主要作用就是改善优化问题的可行解,提高求解效率;
在MPC控制规律中,将控制序列中的第一个参数作为控制量,输入给被控系统。
对于车辆控制来说,就是找到一组合适的控制量,如
,
其中
为前轮转角,
为刹车/油门系数,使车辆沿参考轨迹行驶,且误差最小、控制最平稳、舒适度最高等。因此在设计目标函数的时候可以考虑以下几点:
1、设计代价函数时候,一般设计为二次型的样式,为的是避免在预测时域内,误差忽正忽负,导致误差相互抵消;
2、考虑的代价主要有如下:
- 横向误差:指实际轨迹点与参考轨迹点间的距离;
- 航向误差:车辆当前航向与参考轨迹点航向的偏差;
- 速度误差:车辆当前速度与规划轨期望车速的偏差;
- 刹车/油门调节量:目的是为了保证刹车/油门变化的平稳性;
3、约束条件:
- 最大前轮转角
- 最大前轮转角变化量
- 最大刹车/油门调节量
- 最大方向盘转角
- 最大车速
- 最大加速度等
此处关于控制增量的约束,比如说,我们的前轮转角打30°需要2s,则1s需要打15°,然而我们的控制周期T=0.05s,则控制周期我们需要下发的转角最大为0.75°,也即我们下发转角的最大速率不超过0.75°/T。
关于软约束,也即代价函数,使其值越小越好。
优化求解
滚动优化求解的目的是为了求最优控制解,是一种在线优化,它每一时刻都会针对当前误差重新计算控制量,通过使某一或某些性能指标达到最优来实现控制作用。因此,滚动优化可能不会得到全局最优解,但是却能对每一时刻的状态进行最及时的响应,达到局部最优。
第一步:目标函数如何转化为标准二次型
注意:
目标函数化简后的每一项其实都是一个具体的数,第三项表示具体数的转置等于其自身。因此合并第二项和第三项,二者实质相等。其次化成二次型后,G属于已知项,且Q也是已知项,故二次型的最后一项其实不影响最终的优化求解最小值问题,因此放在最后一项,且求解过程可以忽略。
第二步:约束的转化
将
作为此时的控制量输入给系统,直到下一个控制时刻,系统根据新的状态信息预测下一时段内的输出,然后通过优化得到一组新的控制序列。如此反复,直至完成整个控制过程。
OSQP求解器
带参构造函数MpcOsqp 求解
输入矩阵Ad,Bd,Q,R,初始状态阵X0,控制量上下边界,状态量上下边界,参考状态(0矩阵),最大迭代次数mpc_max_iteration_,预测时域周期数horizon_,求解精度mpc_eps_,用输入参数去初始化类对象的数据成员
MpcOsqp::MpcOsqp(const Eigen::MatrixXd &matrix_a,const Eigen::MatrixXd &matrix_b,const Eigen::MatrixXd &matrix_q,const Eigen::MatrixXd &matrix_r,const Eigen::MatrixXd &matrix_initial_x,const Eigen::MatrixXd &matrix_u_lower,const Eigen::MatrixXd &matrix_u_upper,const Eigen::MatrixXd &matrix_x_lower,const Eigen::MatrixXd &matrix_x_upper,const Eigen::MatrixXd &matrix_x_ref, const int max_iter,const int horizon, const double eps_abs): matrix_a_(matrix_a),matrix_b_(matrix_b),matrix_q_(matrix_q),matrix_r_(matrix_r),matrix_initial_x_(matrix_initial_x),matrix_u_lower_(matrix_u_lower),matrix_u_upper_(matrix_u_upper),matrix_x_lower_(matrix_x_lower),matrix_x_upper_(matrix_x_upper),matrix_x_ref_(matrix_x_ref),max_iteration_(max_iter),horizon_(horizon),eps_abs_(eps_abs) {state_dim_ = matrix_b.rows();control_dim_ = matrix_b.cols();ADEBUG << "state_dim" << state_dim_;ADEBUG << "control_dim_" << control_dim_;num_param_ = state_dim_ * (horizon_ + 1) + control_dim_ * horizon_; }
OSQP求解结果输出:
std::vector<double> control_cmd(controls_, 0);apollo::common::math::MpcOsqp mpc_osqp(matrix_ad_, matrix_bd_, matrix_q_updated_, matrix_r_updated_,matrix_state_, lower_bound, upper_bound, lower_state_bound,upper_state_bound, reference_state, mpc_max_iteration_, horizon_,mpc_eps_); //取控制序列的第一个作为输出的控制量if (!mpc_osqp.Solve(&control_cmd)) {AERROR << "MPC OSQP solver failed";} else {ADEBUG << "MPC OSQP problem solved! ";control[0](0, 0) = control_cmd.at(0);control[0](1, 0) = control_cmd.at(1);}//第一个元素前轮反馈转角steer_angle_feedback = Wheel2SteerPct(control[0](0, 0));//第二个元素加速度补偿acc_feedback = control[0](1, 0);
参考文献
本文针对运动学MPC控制器进行回顾总结,详细可以参考下述文献。
1、【基础】自动驾驶控制算法第五讲 连续方程的离散化与离散LQR原理_哔哩哔哩_bilibili
2、基于MPC轨迹跟踪~理论篇上_哔哩哔哩_bilibili
3、Apollo代码学习(六)—模型预测控制(MPC)_apollo mpc-CSDN博客
相关文章:
基于动力学的MPC控制器设计盲点解析
文章目录 Apollo MPC控制器的设计架构误差模型和离散化预测模型推导目标函数和约束设计优化求解优化OSQP求解器参考文献 Apollo MPC控制器的设计架构 误差模型和离散化 状态变量和控制变量 1、Apollo MPC控制器中状态变量主要有如下6个 matrix_state_ Matrix::Zero(basic_stat…...
leetcode 面试经典 150 题:轮转数组
链接轮转数组题序号189题型数组解法1. 额外数组法,2. 原数组翻转法(三次翻转法)难度中等熟练度✅✅✅✅ 题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,…...
Elasticsearch:探索 Elastic 向量数据库的深度应用
Elasticsearch:探索 Elastic 向量数据库的深度应用 一、Elasticsearch 向量数据库简介 1. Elasticsearch 向量数据库的概念 Elasticsearch 本身是一个基于 Lucene 的搜索引擎,提供了全文搜索和分析的功能。随着技术的发展,Elasticsearch 也…...
From matplotl1b.path 1mport failed to import ImportError:numpy.core.multiarray
问题:From matplotl1b.path 1mport failed to import ImportError:numpy.core.multiarray 安装labelme的时候说numpy与环境不兼容,调不了labelme 解决1:安装虚拟环境 (这里安装labelmede 虚拟环境) #查看python版本 …...
Docker- Unable to find image “hello-world“locally
Docker- Unable to find image “hello-world“locally 文章目录 Docker- Unable to find image “hello-world“locally问题描述一. 切换镜像1. 编辑镜像源2. 切换镜像内容 二、 检查设置1、 重启dockers2、 检查配置是否生效3. Docker镜像源检查4. Dokcer执行测试 三、自定义…...
linux定时执行脚本的方法
使用 cron 服务(推荐) 简介: Cron 是一个基于时间的任务调度程序,它允许用户在指定的时间间隔自动运行命令或脚本。它使用crontab(cron table 的缩写)文件来存储定时任务的配置信息。操作步骤: 编辑用户的 crontab 文件:在终端中输入crontab -e命令。这将打开一个文本编…...
Docker 中启动 Nacos
要在 Docker 中启动 Nacos,你可以使用以下步骤来启动 Nacos 服务。我已经有了 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:v2.4.2.1 这个镜像。 1. 创建并启动 MySQL 容器(Nacos 依赖 MySQL) Nacos 默认使用 …...
【计算机网络】课程 实验三 跨交换机实现 VLAN 间路由
实验 3 跨交换机实现 VLAN 间路由 一、实验目的 1.理解跨交换机之间VLAN的特点。 2.掌握如何在交换机上划分基于端口的VLAN,给VLAN内添加端口。 3.利用三层交换机跨交换机实现 VLAN 间路由。 二、实验分析与设计 【背景描述…...
【74CH192D+4511减法30进制2022年7月7日】
缘由30秒定时器错误帮我看看-大数据-CSDN问答 电路图用到S1倒计时信号控制,S2置数30。从演示可以看到置数,开始,暂停,继续,等于0时清零,并且灯亮,最后断开信号输入完成所有功能。看题主有自己动…...
基于ESP32的桌面小屏幕实战[5]:PCB下单
1. 焊接调试前准备 PCB下单 点击“PCB下单” 检查一下DRC 确认无错误之后,确认下单 然后就会跳转到下面的网页 基本上保持默认选项即可。可以看到“焊盘喷镀”有3个选项。 在选择表面处理工艺时,应综合考虑产品的具体需求、环保法规以及成本等因素。例…...
孤独症儿童寄宿:温馨寄宿,陪伴成长
在社会的各个角落,有一群特殊的孩子,他们生活在自己的世界里,对外界的感知和反应与众不同。他们,就是孤独症(自闭症)儿童。孤独症,这个看似遥远的名词,却真实地影响着无数家庭&#…...
云备份项目--服务端编写
文章目录 7. 数据管理模块7.1 如何设计7.2 完整的类 8. 热点管理8.1 如何设计8.2 完整的类 9. 业务处理模块9.1 如何设计9.2 完整的类9.3 测试9.3.1 测试展示功能 完整的代码–gitee链接 7. 数据管理模块 TODO: 读写锁?普通锁? 7.1 如何设计 需要管理…...
CSS——2.书写格式一
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><!--css书写中:--><!--1.css 由属性名:属性值构成--><!--style"color: red;font-size: 20px;&quo…...
【保姆级】sql注入之堆叠注入
一、堆叠注入的原理 mysql数据库sql语句的默认结束符是以";"号结尾,在执行多条sql语句时就要使用结束符隔 开,而堆叠注入其实就是通过结束符来执行多条sql语句 比如我们在mysql的命令行界面执行一条查询语句,这时语句的结尾必须加上分号结束 select * fr…...
大模型推理加速调研(框架、方法)
大模型推理加速调研(框架、方法) 大模型推理框架调研总结推理框架TensorRT-LLMllama.cppmnn-llmfastllmmlc-llm 环境搭建&部署推理环境llama.cppfastllmmnn-llmvllm vllm_openai_completions.pylmdeployTensorRT-LLM 大模型加速技术总结模型压缩量化…...
js -音频变音(听不出说话的人是谁)
学习参考来源: https://zhuanlan.zhihu.com/p/634848804 https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Audio_API 实际效果: http://www.qingkong.zone/laboratory?typeaudio-confusion 前言 本文内容可结合上面学习参考来源,结合…...
3D Object Detection和6D Pose Estimation有什么异同?
知乎讨论: (99 封私信 / 95 条消息) 3D Object Detection和6D Pose Estimation有什么异同? - 知乎 GPT回答: 3D Object Detection 和 6D Pose Estimation 都是计算机视觉领域的重要任务,广泛应用于机器人、自动驾驶和增强现实…...
NRF24L01模块STM32通信-通信初始化
目录 前言 一、IO口初始化 二、模拟SPI的基础代码 1.一些代码的宏定义 2.起始信号 3.CS,SCK,MOSI操作 4.MISO,IRQ操作 三.中间层代码 1.字节的输入和读取 2.写操作 3.读操作 四.应用层代码 1.24L01的检测 2.在main函数进行简单验证 3.24L01宏定义的代码 总结 前…...
vue Element Ui Upload 上传 点击一个按钮,选择多个文件后直接上传,使用防抖解决多次上传的问题。
问题: 在使用Element Ui Upload 上传文件时,选择多个文件上传时,on-change事件会一个一个返回上传的文件,导致前端不知道什么时候可以拿到全部上传的文件,再一起调后台接口。 解决方法: 上传文件后&…...
算法题(26):最后一个单词的长度
审题: 需要我们返回最后一个单词的长度,并且字符串内只有空格来分割单词 思路: 找到最后一个单词的方法就是从后开始遍历找到第一个非空格的元素,称为pos(第一个出现单词的位置) 然后再从pos位置开始反向寻…...
Ungoogled Chromium127 编译指南 MacOS 篇(二)- 项目要求
1. 引言 在开始编译 Ungoogled Chromium 之前,我们需要确保系统满足所有必要的硬件和软件要求。由于浏览器编译是一个资源密集型的任务,合适的硬件配置和完整的软件环境至关重要。本文将详细介绍编译 Ungoogled Chromium 所需的各项要求。 2. 硬件要求…...
nginx配置-其他配置
nginx配置-其他配置 server_tokens server_tokens server_token on/off 是 Nginx 配置文件中的一个指令,用于控制 Nginx 服务器在响应 HTTP 请求时是否显示服务器的版本信息。 默认情况下,Nginx 会在响应头中包含服务器的版本号,例如 Serve…...
Springboot使用RabbitMQ实现关闭超时订单的一个简单示例
1.maven中引入rabbitmq的依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 2.application.yml中进行rabbitmq相关配置: # rabbit…...
QT-------------对话框和多窗口程序设计
一、标准对话框 1. QFileDialog 对话框 功能:提供文件选择对话框,方便用户选择文件或目录。 #include <QApplication> #include <QFileDialog> #include <QMessageBox>int main(int argc, char *argv[]) {QApplication app(argc, a…...
信息科技伦理与道德2:研究方法
1 问题描述 1.1 讨论? 请挑一项信息技术,谈一谈为什么认为他是道德的/不道德的,或者根据使用场景才能判断是否道德。判断的依据是什么(自身的道德准则)?为什么你觉得你的道德准则是合理的,其他…...
Linux(Centos 7.6)命令详解:ls
1.命令作用 列出目录内容(list directory contents) 2.命令语法 Usage: ls [OPTION]... [FILE]... 3.参数详解 OPTION: -l,long list 使用长列表格式-a,all 不忽略.开头的条目(打印所有条目,包括.开头的隐藏条目)…...
深入理解 WebSocket:实时通信的基础
随着互联网技术的不断发展,实时通信逐渐成为现代应用程序中不可或缺的一部分。无论是即时通讯应用、在线游戏、社交平台还是股票交易系统,都需要能够在客户端与服务器之间快速、高效地传输数据。传统的 HTTP 协议虽然简单且广泛应用,但它并不…...
【网络协议】开放式最短路径优先协议OSPF详解(一)
OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议,它通过使用区域划分以实现更好的可扩展性。 文章目录 链路状态路由协议OSPF 的工作原理OSPF 数据包类型Dijkstra算法、管理距离与度量值OSPF的管理距离OSPF的度量值 链路状态路由协议的优势拓扑结构路由器O…...
2000-2020年各省地区生产总值数据/各省gdp数据
2000-2020年各省地区生产总值数据/各省gdp数据 1、时间:2000-2020年 2、来源:国家统计局 3、指标:行政区划代码、地区、年份、地区生产总值 4、范围:31省 指标解释:地区生产总值(Regional GDP…...
消息转换器在SpringMVC执行流程
消息转换器的工作机制 内部工作流程 读取(Read)操作 当接收到一个包含实体内容的HTTP请求时,Spring MVC会根据请求头中的Content-Type属性来确定应该使用哪个HttpMessageConverter来解析请求体。DispatcherServlet会遍历已注册的HttpMessage…...
7. C语言 运算符详解
本章目录: 前言C语言运算符的分类1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 杂项运算符 运算符优先级 前言 在C语言中,运算符是程序中执行各种操作的核心工具,涉及算术运算、逻辑判断、位操作等多个方面。掌握C语言中的各种运…...
一、准备工作(2):部署TensorFlow和Keras
目录 一、确保已安装 Python 和 pip 二、打开命令行界面并执行安装命令 Windows macOS 和 Linux 三、安装过程中的注意事项 创建虚拟环境 激活虚拟环境 在虚拟环境中安装包 四、验证安装 五、常见问题排查 六、下一步 pip install tensorflow keras 是一个用于在计算…...
Rabbitmq Fanout如何保证不重复消费及应用场景
rabbitmq fanout业务场景,一个交换机对应多个队列,不会重复消费吗 在 RabbitMQ 中,使用 Fanout 类型的交换机时,确实可以将一个交换机绑定到多个队列。每当有消息发布到这个交换机时,交换机会把消息广播到所有绑定的队…...
【Linux系列】使用 `nohup` 命令运行 Python 脚本并保存输出日志的详细解析
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
基于Python的考研学习系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
多模态大模型文生图和图生文的主要技术
1 图生文 CLIP 该模型架构由图像编码器和文本编码器组成。图像编码器将图像转换为嵌入(数字列表),文本编码器将文本转换为嵌入。 这两个编码器在成批的图像-文本对上进行训练,其中文本描述图像。编码器的训练方式如下࿱…...
云架构:考量与框架
云架构:考量与框架 引言 在当今的数字化环境中,云计算已成为现代商业运营的基石。一个设计良好的云架构框架为可扩展、安全和弹性的系统奠定了基础。本文将深入探讨云架构的核心要素,讨论重要的考量因素、设计指南,以及最佳实践…...
用uniapp写一个播放视频首页页面代码
效果如下图所示 首页有导航栏,搜索框,和视频列表, 导航栏如下图 搜索框如下图 视频列表如下图 文件目录 视频首页页面代码如下 <template> <view class"video-home"> <!-- 搜索栏 --> <view class…...
开发培训-慧集通(iPaaS)集成平台脚本开发Groovy基础培训视频
Groovy是一种基于Java虚拟机(JVM)的敏捷开发语言,结合了Python、Ruby和Smalltalk的许多强大特性。它旨在提高开发者的生产力,通过简洁、熟悉且易于学习的语法,Groovy能够与Java代码无缝集成,并提供强大…...
供需平台信息发布付费查看小程序系统开发方案
供需平台信息发布付费查看小程序系统主要是为了满足个人及企业用户的供需信息发布与匹配需求。 一、目标用户群体 个人用户:寻找兼职工作、二手物品交换、本地服务(如家政、维修)等。 小微企业:推广产品和服务,寻找合…...
【Qt】如何保证线程安全(以日志写入为例)
前言 在近日学习中发现,如果开发一个单例模式的日志系统,难免会出现多个线程记录日志的情况,这个时候线程可能导致竞争,或者始料未及的情况发生。 通过学习,如果要保证线程安全,要使用互斥锁QMutex…...
k8s基础(3)—Kubernetes-Deployment
一、 Deployment概述 Kubernetes Deployment是Kubernetes中的一个核心概念,它是一种高级别的控制器,用于管理Pod和ReplicaSet,确保应用程序的高可用性和稳定性。Deployment通过声明式配置来创建和更新Pod和ReplicaSet,从而…...
信息系统管理师试题-人力资源
下列( )不属于人力资源管理的主要工作内容。 A根据各工作岗位任务的特点和工作要求,预测组织的人力需求 B根据工作需要,选拔出符合组织需要的员工 C对新员工进行工作指导和培训 D为项目团队争取和募集更多资金 答案D 解析…...
【情感】程序人生之情感关系中的平等意识(如何经营一段长期稳定的关系 沸羊羊舔狗自查表)
【情感】程序人生之情感关系中的平等意识(如何经营一段长期稳定的关系 & 沸羊羊舔狗自查表) 文章目录 1、情感关系中的平等意识2、如何经营一段长期稳定的关系(避免左倾 | 敬畏与担当)3、沸羊羊/舔狗自查表(避免右…...
pyspark执行group by操作
前情提要 在处理亿级别数据时,常常输入是hive表,因此需要在pypark流程中引入一些场景sql操作,其中group by就是比较常见的操作。 基础步骤 创建SparkSession:通过enableHiveSupport()方法启用Hive支持,确保能够访问…...
小寒时处在二三九,天寒地冻北风吼
今(1月5日上午10时33分)天迎来了小寒节气,本“人民体验官”推广人民日报官方微博文化产品《小寒来了!最冷的时候如何养生防病》,同时科普小寒相关知识。 截图:来源本“人民体验官”推广平台 人民微博告诉我…...
微信小程序校园自助点餐系统实战:从设计到实现
随着移动互联网的发展,越来越多的校园场景开始智能化、自助化。微信小程序凭借其轻量化、便捷性和强大的生态支持,成为了各类校园应用的首选工具之一。今天,我们将通过实际开发一个微信小程序“校园自助点餐系统”来展示如何设计和实现这样一…...
java基础之代理
代理模式(Proxy Pattern) 简介 是一种结构型设计模式,主要用于为某对象提供一个代理对象,以控制对该对象的访问。通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端的…...
uniapp - 基于uniapp+vue3实现自定义增强版table表格组件体验「兼容H5+小程序+App端」
本文提供增强版table表格组件体验,打造跨端表格的新标杆. uv3-table:一款基于uniappvue3跨端自定义手机端增强版表格组件。支持固定表头/列、边框、斑马纹、单选/多选,自定义表头/表体插槽、左右固定列阴影高亮显示。支持编译兼容H5小程序端App端。 提供…...
【Obsidian插件开发】新建窗口时出现多余的空白窗口
问题描述 在打开Edit Task的Modal的时候,有一个多余的空白modal同时也被打开了,并且点右上角的叉号可以把Edit Task窗口也关上。最开始没有这个问题,我给edit task窗口加了css,移动位置之后问题就出现了。 解决方法 我最开始看到…...