简单硬件在环搭建(ROS+Prescan+Carsim+simulink)
本文通过ROS+Prescan+Carsim+simulink搭建简单的硬件在环仿真测试平台。
系统架构如下:
在Windows中运行prescan场景仿真软件,在jetson Nano中运行ROS,硬件上两台电脑通过一根网线相连传输信息;
1.prescan与carsim的集成
在C:\carsimworkspace\prescan\Extensions\Simulink的路径下,找到如下模型:
将carsim模型发送到simulink中如下:
打开prescan,建议使用prescan8.5,放置主车与一段道路:
在主车驾驶员模型中选择Path Follower,以便于录制跟踪的路径数据。在prescan中选择车辆动力学模型如下,点击browse,选择之间extension文件夹下的carsim动力学模型:
在道路设置中,用黄线将道路的参考线绘制出来,并将其添加到车辆的运动轨迹中:
添加路径示意图如下:
这样就将道路的参考线数据添加到了车辆的运动路径里面了。
2.ROS与prescan通讯配置
将prescan的模型发送到simulink,打开模型得到:
左边打红框的地方是carsim到prescan的坐标转换模块,右边是to workspace模块,用于将数据录制到matlab的工作区间:
打红框部分展开如下:
X0,Y0的数据录制模块如下图所示:
然后先运行仿真工程,让车辆沿着道路先走一次,录制得到的.mat格式的数据如下图所示:
在Windows这台PC上,点击Win+R打开,输入CMD打开终端:
找到本机的IP地址,如果设置IP地址与Ubuntu不在同一网段的话,点击网络设置中的以太网设置,对IP进行重新配置:
打开jetson nano,输入ifconfig查看IP:
在Ping一下jetson nano的IP地址,以确保通信是没有问题的:
注意,在ROS中,需要修改etc/home文件夹下的设置,将IP与用户名相绑定,这一步必须做,否则可能导致通讯链路是通的,但是ROS收不到simulink发布的ROS消息:
3.matlab/simulink与ROS通讯的接口代码
在matlab中建立与ros的通讯,代码如下:
setenv('ROS_MASTER_URI','http://10.120.175.3:11311')
%setenv('ROS_MASTER_URI','http://10.120.175.3:13637')
setenv('ROSIP', '10.120.175.22');
rosinit
其中ROS_MASTER_URI为Ubuntu端IP,ROSIP为主机(WINDOWS)的IP地址,这段代码主要是用于在matlab中初始化一个ROS节点。
编写代码,将.mat文件储存为txt文件:
X=global_x.Data;
Y=global_y.Data;
save('globalx.mat',"X");
save('globaly.mat',"Y");
% 1. 加载 .mat 文件
load('globalx.mat');
% 假设 data 是你要保存的变量
% 提取某一列数据(例如第1列)
global_X = X(:, 1);
% 2. 打开一个新的文本文件来写入数据
fileID = fopen('global_X.txt', 'w');
% 3. 将数据写入文本文件
fprintf(fileID, '%f\n', global_X);
% 4. 关闭文件
fclose(fileID);% 1. 加载 .mat 文件
load('globaly.mat');
% 假设 data 是你要保存的变量
% 提取某一列数据(例如第1列)
global_Y = Y(:, 1);
% 2. 打开一个新的文本文件来写入数据
fileID = fopen('global_Y.txt', 'w');
% 3. 将数据写入文本文件
fprintf(fileID, '%f\n', global_Y);
% 4. 关闭文件
fclose(fileID);
打开FileZilla,建立连接后将TXT文件传输到nano中:
在ROS中编写PID控制以及ROS节点的代码,这里建议先不要写PID算法,可以给执行器简单的输入进行开环测试:
#include <ros/ros.h>
#include <geometry_msgs/Pose2D.h>
#include <std_msgs/Float64.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>
#include <cmath>
#include <limits>// 创建一个算法类
class Algorithm {
public:double lambda = 0; // 积分权重参数double u = 1.0; // 微分权重参数// 距离计算函数double calculateDistance(double X, double Y, double X1, double Y1) {return sqrt((X - X1) * (X - X1) + (Y - Y1) * (Y - Y1));}// 找出最近的点int findClosestPoint(const std::vector<double>& X, const std::vector<double>& Y, double currentX, double currentY) {int closestIndex = -1;double minDistance = std::numeric_limits<double>::max();for (size_t i = 0; i < X.size(); ++i) {double distance = calculateDistance(X[i], Y[i], currentX, currentY);if (distance < minDistance) {minDistance = distance;closestIndex = i;}}return closestIndex+15;}// PID速度控制代码double PIDControl(double target_speed, double current_speed, double& integral, double& previous_error) {// PID增益double Kp = 14;double Ki = 0.4;double Kd = 0.06;// 计算误差double error = target_speed - current_speed;// 计算积分和微分项integral += error;double derivative = error - previous_error;// PID输出double output = Kp * error + Ki * integral + Kd * derivative;// 更新前一误差previous_error = error;return output;}// 二维查找表插值double lookupControlValue(const std::vector<std::vector<double>>& matrix, double control_input, double current_speed) {// 假设横坐标是控制输入,纵坐标是当前车速int row_index = std::min(static_cast<int>(current_speed), static_cast<int>(matrix.size() - 1));int col_index = std::min(static_cast<int>(control_input), static_cast<int>(matrix[0].size() - 1));// 插值输出return matrix[row_index][col_index];}// PID横向控制double PID(double target_X, double target_Y, double Phik, double X, double Y) {double Kp = 17; double Ki = 0.05; double Kd = 0.04;double Phi= Phik *3.1415/180;static double prev_err = 0; // 改为静态变量,保持上次调用的状态static double integral_err = 0; // 改为静态变量,保持上次调用的状态// 计算目标方向与当前位置的角度double alpha =atan2(target_Y - Y,target_X - X)-Phi;// 计算比例误差double proportional_err = alpha;// 计算积分误差integral_err += proportional_err;// 计算微分误差double derivative_err = proportional_err - prev_err;// 计算前轮转角 Deltadouble Delta = Kp * proportional_err + Ki * integral_err+ Kd *derivative_err;// 更新前一误差prev_err = proportional_err;return Delta; // 返回前轮转角}// 横向LQR控制double LQR() {// 实现横向LQR控制}// 横向PP控制double PureP() {// 实现横向PP控制}
};// 全局变量声明
std::vector<double> gloabel_X;
std::vector<double> gloabel_Y;
std::vector<double> globel_Angel;
Algorithm algorithm;
std::vector<std::vector<double>> matrix;
double integral = 0.0;
double previous_error = 0.0;
double target_speed = 30.0; // 目标速度 30 km/h
double current_speed = 0.0;
double output = 0;// 位置回调函数
void chatterCallback(const geometry_msgs::Pose2D& Pose_msg) {// 寻找索引值int index = algorithm.findClosestPoint(gloabel_X, gloabel_Y, Pose_msg.x, Pose_msg.y);ROS_INFO("索引: %f", gloabel_Y[index]);// 添加有效性检查if (index < 0 || index >= gloabel_X.size() || index >= gloabel_Y.size() || index >= globel_Angel.size()) {ROS_ERROR("索引越界: %d", index);return; // 如果索引无效,则返回}// 更新全局的 outputoutput = algorithm.PID(gloabel_X[index], gloabel_Y[index],Pose_msg.theta, Pose_msg.x, Pose_msg.y);
}// 速度回调函数
void velocityCallback(const geometry_msgs::Pose2D& Vel_msg) {current_speed = Vel_msg.x; // 假设当前速度在 x 轴
}// 从文件读取数据
std::vector<double> readData(const std::string& filePath) {std::ifstream file(filePath);std::vector<double> data;if (!file.is_open()) {ROS_ERROR("无法打开文件: %s", filePath.c_str());return data; // 返回空的vector}std::string line;while (std::getline(file, line)) {std::istringstream iss(line);double value;if (iss >> value) {data.push_back(value);} else {ROS_WARN("读取数据失败: %s", line.c_str());}}file.close();return data;
}// 从文件读取矩阵
std::vector<std::vector<double>> readMatrix(const std::string& filePath, int rows, int cols) {std::ifstream file(filePath);std::vector<std::vector<double>> matrix(rows, std::vector<double>(cols));if (!file.is_open()) {ROS_ERROR("无法打开文件: %s", filePath.c_str());return matrix;}std::string line;for (int i = 0; i < rows; ++i) {if (!std::getline(file, line)) {ROS_ERROR("读取文件时出错或文件行数不足");return matrix;}std::istringstream iss(line);for (int j = 0; j < cols; ++j) {if (!(iss >> matrix[i][j])) {ROS_ERROR("读取数据时出错或文件列数不足: 行 %d 列 %d", i, j);return matrix;}}}file.close();return matrix;
}int main(int argc, char **argv) {ros::init(argc, argv, "Communicate");ros::NodeHandle n;ros::Publisher chatter_pub = n.advertise<geometry_msgs::Pose2D>("control", 1000);ros::Subscriber sub = n.subscribe("simulink_pose", 1000, chatterCallback);ros::Subscriber sub1 = n.subscribe("vel_cmd", 1000, velocityCallback);ros::Rate loop_rate(10);// 读取X轴坐标轨迹值std::string filePathX = "/home/jetson/ROS/R2/yahboomcar_ws/src/ROS_Prescan/prescanpp/globel_X.txt"; // 替换为实际文件路径gloabel_X = readData(filePathX);// for (const double& value : gloabel_X) {// ROS_INFO("读取到的数据: %f", value);// }// 读取Y轴坐标轨迹值std::string filePathY = "/home/jetson/ROS/R2/yahboomcar_ws/src/ROS_Prescan/prescanpp/globel_Y.txt"; // 替换为实际文件路径gloabel_Y = readData(filePathY);// for (const double& value : gloabel_Y) {// ROS_INFO("读取到的数据: %f", value);// }// 读取航向角值std::string filePathAngel = "/home/jetson/ROS/R2/yahboomcar_ws/src/ROS_Prescan/prescanpp/globel_Angel.txt"; // 替换为实际文件路径globel_Angel = readData(filePathAngel);// for (const double& value : globel_Angel) {// ROS_INFO("读取到的航向角: %f", value);// }// 读取油门刹车查找表std::string filePathMatrix = "/home/jetson/ROS/R2/yahboomcar_ws/src/ROS_Prescan/prescanpp/src/tablebr.txt";matrix = readMatrix(filePathMatrix, 1001, 261);while (ros::ok()) {// 计算PID控制器输出double control_output = algorithm.PIDControl(target_speed, current_speed, integral, previous_error);// 查找表获取控制值double control_value = algorithm.lookupControlValue(matrix, control_output, current_speed);// 确定油门和刹车double throttle = (control_value > 0) ? control_value : 0;double brake = (control_value < 0) ? -control_value : 0;// 发布控制消息geometry_msgs::Pose2D msg;msg.x = throttle; // 油门开度msg.y = brake; // 刹车压力msg.theta = output-3.14/2; // 方向盘扭矩chatter_pub.publish(msg);// ROS_INFO("Throttle: %f, Brake: %f, Steering Torque (msg.theta): %f", throttle, brake, msg.theta);ros::spinOnce();loop_rate.sleep();}return 0;
}
编写CmakeList.txt文件如下:
cmake_minimum_required(VERSION 3.0.2)
project(prescanpp)## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTSroscppstd_msgs
)## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()################################################
## Declare ROS messages, services and actions ##
################################################## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
## * add a build_depend tag for "message_generation"
## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
## * If MSG_DEP_SET isn't empty the following dependency has been pulled in
## but can be declared for certainty nonetheless:
## * add a exec_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
## * add "message_generation" and every package in MSG_DEP_SET to
## find_package(catkin REQUIRED COMPONENTS ...)
## * add "message_runtime" and every package in MSG_DEP_SET to
## catkin_package(CATKIN_DEPENDS ...)
## * uncomment the add_*_files sections below as needed
## and list every .msg/.srv/.action file to be processed
## * uncomment the generate_messages entry below
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)## Generate messages in the 'msg' folder
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )## Generate services in the 'srv' folder
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )## Generate actions in the 'action' folder
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )## Generate added messages and services with any dependencies listed here
# generate_messages(
# DEPENDENCIES
# std_msgs
# )################################################
## Declare ROS dynamic reconfigure parameters ##
################################################## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
## * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
## * add "dynamic_reconfigure" to
## find_package(catkin REQUIRED COMPONENTS ...)
## * uncomment the "generate_dynamic_reconfigure_options" section below
## and list every .cfg file to be processed## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
# )###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES prescanpp
# CATKIN_DEPENDS roscpp std_msgs
# DEPENDS system_lib
)###########
## Build ##
############# Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include${catkin_INCLUDE_DIRS}
)## Declare a C++ library
# add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/prescanpp.cpp
# )## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# add_executable(${PROJECT_NAME}_node src/prescanpp_node.cpp)## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )#############
## Install ##
############## all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# catkin_install_python(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )## Mark executables for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html
# install(TARGETS ${PROJECT_NAME}_node
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )## Mark libraries for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html
# install(TARGETS ${PROJECT_NAME}
# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
# )## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )#############
## Testing ##
############### Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_prescanpp.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()## Add folders to be run by python nosetests
# catkin_add_nosetests(test)#add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/prescanpp.cpp
# )add_executable(Communicate src/Communicate.cpp)
add_dependencies(Communicate ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})target_link_libraries(Communicate${catkin_LIBRARIES})#----------------------------------------------------------------------#
在simulink中搭建ROS的发送与接收接口如下:
ROS_Prescan位置更新模块如下,如果前面的步骤均没有问题,这个地方应该可以自动读取出识别到的ROS节点,这个模块主要是将Prescan中车辆的数据接收并发送到ROS中:
ROS_Prescan位置信息更新模块如下,此模块主要用于接收ROS计算得到的执行器数值,并发送到场景软件中:
最后点击运行,如果没有问题,车辆应该能实现简单的轨迹跟踪。
相关文章:

简单硬件在环搭建(ROS+Prescan+Carsim+simulink)
本文通过ROSPrescanCarsimsimulink搭建简单的硬件在环仿真测试平台。 系统架构如下: 在Windows中运行prescan场景仿真软件,在jetson Nano中运行ROS,硬件上两台电脑通过一根网线相连传输信息; 1.prescan与carsim的集成 在C:\car…...

【Python 数据分析学习】Pandas基础与应用(1)
题目 1 Pandas 简介1.1 主要特征1.2 Pandas 安装 2 Pandas中的数据结构2.1 Series 数据结构和操作2.1.1 Series的数据结构2.1.2 Seres的操作 2.2 DataFrame 数据结构和操作2.2.1 DataFrame 数据结构2.2.2 Dataframe 操作2.2.3 DateFrame 的特殊操作 2.3 Series 和 DataFrame 的…...

pytorch入门(1)——pytorch加载数据初认识
环境配置及其安装: 2023最新pytorch安装(超详细版)-CSDN博客 pytorch加载数据初认识 Dataset:创建可被Pytorch使用的数据集 提供一种方式获取数据及其label Dataloader:向模型传递数据 为网络提供不同的数据形式 …...

Spring下载文件
1、controller /*** 下载文件通过ID** param auditInformationDTO 靓号稽核文件DTO* param servletResponse 响应体*/ GetMapping(value "/downloadAuditFileByAuditFileId") public void downloadAuditFileByAuditFileId(ModelAttribute final GoodNumberAuditInf…...

如何在数据库中备份表:操作指南与注意事项
在数据库管理中,备份表是一种常见的操作,它可以帮助我们保存数据的当前状态,以便在需要时进行恢复或分析。备份表可以通过创建一个新表并复制原表的所有数据到新表中来实现。 以下是具体的SQL语句: CREATE TABLE backup_table A…...

【数据结构】第八节:链式二叉树
个人主页: NiKo 数据结构专栏: 数据结构与算法 源码获取:Gitee——数据结构 一、二叉树的链式结构 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left; // 左子树根节点struct BinaryT…...

Fair Graph RepresentationLearning via Diverse Mixture-of-Experts
发表于:WWW23 推荐指数: #paper/⭐⭐ 问题背景: 背景 现实世界的数据很多样,阻止GNN学习公平的表示。当去偏见化后,他们面临着可学知识不足且属性有限的重大问题 解决方法: 应对公平训练导致可学习知识…...

电机驱动开发之驱动板
目录 1.主要器件选型2.原理图设计3.PCB绘制电源调理驱动电路电流反馈位置反馈 4.PCB绘制5.打板验证6.总结 1.主要器件选型 器件参数封装理由LDOLM317DCYR (24V-12V 12V-5V)SOT-223小电流应用 LDO比DCDC噪声小响应快更为稳定预驱FD6288TTssop-20常见无刷…...

STM32F1 HAL库笔记2_HAL 系统驱动程序
1、HAL 固件驱动程序 API 1.1、如何使用此驱动程序 通用 HAL 驱动程序包含一组通用的 API,PPP 外设驱动程序可以使用这些 API 来开始使用 HAL。HAL 包含两个 API 类别: • 常见的 HAL API • 服务 HAL API 1.2、初始化和去初始化函数 本节提供的功能&a…...

el-table实现当内容过多时,el-table显示滚动条,页面不显示滚动条
估计有不少小伙伴在开发公司的ERP使用el-table都会遇到这么一个问题,就是产品经理提出,页面不出现滚动条,因为不美观。但是当el-table内容过多,超过页面的宽度时候,页面就会有滚动条。那应该如何解决呢?能不能让滚动条…...

Java面试篇基础部分-Java中的异常以及异常处理
导语 在实际的开发过程中,往往会遇到各种各样的编程异常,如何处理这些异常,直接会影响到整个程序和系统的稳定性,如果不能在合适的地方抛出合适的异常或者是对异常进行捕获。那么就会影响到整个程序的运行。所以如何处理异常,是作为每个开发者来说必不可少的开发技能。…...

win11 MySQL的坑
最近升级了系统,导致以前的安装的两个版本MySQL服务无法启动,只能在mysql的bin目录,执行mysqld --console才能启动,mysqld都无法启动, 所幸进行了数据库初始化,这次在MySQL的bin目录执行 mysqld或者mysqld …...

stm32单片机个人学习笔记1(简单介绍)
前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…...

python中@staticmethod、@classmethod用法
1、类的基础介绍 类对象:定义的类就是类对象 类属性:定义在__init__ 外部的变量 类方法:定义在类中,且被classmethod 装饰的方法 实例对象:类对象实例化后就是实例对象 实例属性:定义在__init__内部带…...

Harmony Next 文件命令操作(发送、读取、媒体文件查询)
查询文件位置 hdc shell mediatool query IMG_20240902_204224.jpg 输出示例 拉取文件 hdc file recv /storage/cloud/100/files/Photo/4/IMG_1725281044_036.jpg aa.jpg 发送文件 hdc file send aa.jpg /storage/media/100/local/files/Docs/Download/ab.jpg 下载目录位置…...

Go语言中的链表与双向链表实现
链表基础 链表是一种由有限元素组成的数据结构,其中每个元素至少使用两个内存空间:一个存储实际数据,另一个存储指向下一个元素的指针,从而形成一个元素序列构成链表。链表的第一个元素称为头结点,而最后一个元素通常…...

开始一个WPF项目时的记忆重载入
目前在工业软件的UI开发方案选择中,WPF仍然是一个重要的选项。 但是其固有的复杂性,对于像我这样,并不是一直在从事界面开发的人来说,每次重启,都需要一两天的适应的时间。所以这里稍微写一个笔记。 还是老办法&…...

用go语言实现树和哈希表算法
算法复杂度 判断一个算法的效率通常基于其计算复杂度,这主要与算法访问输入数据的次数有关。计算机科学中常用大O表示法来描述算法的复杂度。例如,O(n)的算法只需访问一次输入数据,因此优于O(n)的算法,后者则优于O(n)的算法&…...

基于SpringBoot+Vue+MySQL的校园健康驿站管理系统
系统展示 用户前台界面 管理员后台界面 系统背景 本文设计并实现了一个基于SpringBoot后端、Vue前端与MySQL数据库的校园健康驿站管理系统。该系统旨在通过数字化手段,全面管理学生的健康信息,包括体温监测、疫苗接种记录、健康状况申报等,为…...

深入理解MATLAB中的事件处理机制
在MATLAB中,事件处理机制是一种强大的工具,它允许对象之间的交互和通信。这种机制基于观察者设计模式,其中一个对象(观察者)监听另一个对象(发布者)的状态变化。当发布者的状态发生变化时&#…...

线程--线程同步
这里写目录标题 同步概念线程同步概念数据混乱原因 互斥量原理锁的注意事项1、cpu时间轮片2、建议锁总结 使用锁来管理线程同步问题产生主要函数init、destorylock、unlock代码注意事项(锁的粒度) try锁死锁出现原因图解 读写锁特性图解函数总览init、de…...

【QT】Qt窗口
欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:QT 目录 👉🏻菜单栏设置👉🏻QToolBar练习 👉🏻QStausBar👉🏻Q…...

场外个股期权怎么给股票加杠杆?
今天期权懂带你了解场外个股期权怎么给股票加杠杆?场外期权交易通过向证券公司支付一定额度的股票期权费,然后买入大额的股票持仓,从而实现的杠杆交易。 买入看涨期权 操作:支付权利金购买看涨期权。 杠杆作用: 期…...

【Docker部署ELK】(7.15)
1、拉取镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.0 docker pull docker.elastic.co/kibana/kibana:7.15.0 docker pull docker.elastic.co/logstash/logstash:7.15.02、配置文件(解压资源到D盘DOCKER目录下) 2.1 配置文件…...

UE4_后期处理_后期处理材质及后期处理体积一
后期处理效果 在渲染之前应用于整个渲染场景的效果。 后期处理效果(Post-processing effect)使美术师和设计师能够对影响颜色、色调映射、光照的属性和功能进行组合选择,从而定义场景的整体外观。要访问这些功能,可以将一种称为…...

【PyQt6 应用程序】基于QtDesigner做一个用户登录页面
在当今的软件开发领域,用户界面(UI)设计和后端编程是创建现代、互动应用程序的两大重要组成部分。尤其是在开发具有用户登录功能的应用程序时,不仅要注重外观和用户体验的设计,还要确保后端逻辑的安全性和可靠性。 本文将介绍如何使用PyQt6框架结合UI设计,实现一个简单而…...

Ollama—87.4k star 的开源大模型服务框架!!
这一年来,AI 发展的越来越快,大模型使用的门槛也越来越低,每个人都可以在自己的本地运行大模型。今天再给大家介绍一个最厉害的开源大模型服务框架——ollama。 项目介绍 Ollama 是一个开源的大语言模型(LLM)服务工具…...

MySQL表的操作与数据类型
目录 前言 一、表的操作 1.创建一个表 2.查看表的结构 3.修改表 4.删除一个表 二、 MySQL的数据类型 0.数据类型一览: 1.整数类型 2.位类型 3.小数类型 4.字符类型 前言 在MySQL库的操作一文中介绍了有关MySQL库的操作,本节要讲解的是由库管理的结构——…...

mysql把某一个字段的值中的aa,替换成bb
UPDATE my_table SET my_column REPLACE(my_column, aa, bb); 例 假设my_table表在替换前的数据如下: idmy_column1hello aa2world aa aa3no aa here 执行上述UPDATE语句后,my_table表的数据将变为: idmy_column1hello bb2world bb b…...

【系统架构设计师】原型模式详解
原型模式详解 1. 什么是原型模式? 原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制已有的对象来创建新的对象,而不是通过类实例化来创建新对象。通过这种方式,原型模式能够减少创建对象的开销,尤其是当对象的创建过程非常复杂或者耗费资源时。原型模…...