一切为了实现利用ros通过串口控制小车简单运动

  • 基于ROS平台的STM32小车-4-上位机控制器
    https://blog.csdn.net/weixin_39752599/article/details/86552511

下载串口通信的ROS包

cd ~/catkin_ws/src
git clone https://github.com/ncnynl/serial.git

下载键盘控制的ROS包

cd ~/catkin_ws/src
git clone https://github.com/ncnynl/teleop_twist_keyboard.git

进入下载好的ROS包的文件夹,选中 keyboard_teleop_zbot.py (没有此文件,只有teleop_twist_keyboard.py???),右键->设为可执行文件。

最后编译

cd ~/catkin_ws
catkin_make

在上位机上搭建一个控制器:
新建 base_controller ROS 包:

$ cd ~/catkin_ws/src
$ catkin_create_pkg base_controller roscpp
$ cd catkin_ws/src/base_controller
$ mkdir src 
$ touch src/base_controller.cpp
$ gedit src/base_controller.cpp

基于串口通信的ROS小车基础控制器,功能如下:
1.实现ros控制数据通过固定的格式和串口通信,从而达到控制小车的移动
2.订阅了/cmd_vel主题,只要向该主题发布消息,就能实现对控制小车的移动
3.发布里程计主题/odm 串口通信说明:
1.写入串口 (1)内容:左右轮速度,单位为mm/s (2)格式:10字节,[右轮速度4字节][左轮速度4字节][结束符"\r\n"2字节]
2.读取串口 (1)内容:小车x,y坐标,方向角,线速度,角速度,单位依次为:mm,mm,rad,mm/s,rad/s (2)格式:21字节,[X坐标4字节][Y坐标4字节][方向角4字节][线速度4字节][角速度4字节][结束符"\n"1字节]

base_control.cpp代码如下:

#include "ros/ros.h"  //ros需要的头文件
#include <geometry_msgs/Twist.h>
#include <tf/transform_broadcaster.h>
#include <nav_msgs/Odometry.h>
//以下为串口通讯需要的头文件
#include <string>        
#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <math.h>
#include "serial/serial.h"
/****************************************************************************/
using std::string;
using std::exception;
using std::cout;
using std::cerr;
using std::endl;
using std::vector;
/*****************************************************************************/
float ratio = 1000.0f ;   //转速转换比例,执行速度调整比例
float D = 0.2680859f ;    //两轮间距,单位是m
float linear_temp=0,angular_temp=0;//暂存的线速度和角速度
/****************************************************/
unsigned char data_terminal0=0x0d;  //“/r"字符
unsigned char data_terminal1=0x0a;  //“/n"字符
unsigned char speed_data[10]={0};   //要发给串口的数据
string rec_buffer;  //串口数据接收变量//发送给下位机的左右轮速度,里程计的坐标和方向
union floatData //union的作用为实现char数组和float之间的转换
{float d;unsigned char data[4];
}right_speed_data,left_speed_data,position_x,position_y,oriention,vel_linear,vel_angular;
/************************************************************/
void callback(const geometry_msgs::Twist & cmd_input)//订阅/cmd_vel主题回调函数
{string port("/dev/ttyUSB0");    //小车串口号unsigned long baud = 115200;    //小车串口波特率serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000)); //配置串口angular_temp = cmd_input.angular.z ;//获取/cmd_vel的角速度,rad/slinear_temp = cmd_input.linear.x ;//获取/cmd_vel的线速度.m/s//将转换好的小车速度分量为左右轮速度left_speed_data.d = linear_temp - 0.5f*angular_temp*D ;right_speed_data.d = linear_temp + 0.5f*angular_temp*D ;//存入数据到要发布的左右轮速度消息left_speed_data.d*=ratio;   //放大1000倍,mm/sright_speed_data.d*=ratio;//放大1000倍,mm/sfor(int i=0;i<4;i++)    //将左右轮速度存入数组中发送给串口{speed_data[i]=right_speed_data.data[i];speed_data[i+4]=left_speed_data.data[i];}//在写入串口的左右轮速度数据后加入”/r/n“speed_data[8]=data_terminal0;speed_data[9]=data_terminal1;//写入数据到串口my_serial.write(speed_data,10);
}int main(int argc, char **argv)
{string port("/dev/ttyUSB0");//小车串口号unsigned long baud = 115200;//小车串口波特率serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000));//配置串口ros::init(argc, argv, "base_controller");//初始化串口节点ros::NodeHandle n;  //定义节点进程句柄ros::Subscriber sub = n.subscribe("cmd_vel", 20, callback); //订阅/cmd_vel主题ros::Publisher odom_pub= n.advertise<nav_msgs::Odometry>("odom", 20); //定义要发布/odom主题static tf::TransformBroadcaster odom_broadcaster;//定义tf对象geometry_msgs::TransformStamped odom_trans;//创建一个tf发布需要使用的TransformStamped类型消息nav_msgs::Odometry odom;//定义里程计对象geometry_msgs::Quaternion odom_quat; //四元数变量//定义covariance矩阵,作用为解决文职和速度的不同测量的不确定性float covariance[36] = {0.01,   0,    0,     0,     0,     0,  // covariance on gps_x0,  0.01, 0,     0,     0,     0,  // covariance on gps_y0,  0,    99999, 0,     0,     0,  // covariance on gps_z0,  0,    0,     99999, 0,     0,  // large covariance on rot x0,  0,    0,     0,     99999, 0,  // large covariance on rot y0,  0,    0,     0,     0,     0.01};  // large covariance on rot z //载入covariance矩阵for(int i = 0; i < 36; i++){odom.pose.covariance[i] = covariance[i];;}       ros::Rate loop_rate(10);//设置周期休眠时间while(ros::ok()){rec_buffer =my_serial.readline(25,"\n");    //获取串口发送来的数据const char *receive_data=rec_buffer.data(); //保存串口发送来的数据if(rec_buffer.length()==21) //串口接收的数据长度正确就处理并发布里程计数据消息{for(int i=0;i<4;i++)//提取X,Y坐标,方向,线速度,角速度{position_x.data[i]=receive_data[i];position_y.data[i]=receive_data[i+4];oriention.data[i]=receive_data[i+8];vel_linear.data[i]=receive_data[i+12];vel_angular.data[i]=receive_data[i+16];}//将X,Y坐标,线速度缩小1000倍position_x.d/=1000; //mposition_y.d/=1000; //mvel_linear.d/=1000; //m/s//里程计的偏航角需要转换成四元数才能发布odom_quat = tf::createQuaternionMsgFromYaw(oriention.d);//将偏航角转换成四元数//载入坐标(tf)变换时间戳odom_trans.header.stamp = ros::Time::now();//发布坐标变换的父子坐标系odom_trans.header.frame_id = "odom";     odom_trans.child_frame_id = "base_footprint";       //tf位置数据:x,y,z,方向odom_trans.transform.translation.x = position_x.d;odom_trans.transform.translation.y = position_y.d;odom_trans.transform.translation.z = 0.0;odom_trans.transform.rotation = odom_quat;        //发布tf坐标变化odom_broadcaster.sendTransform(odom_trans);//载入里程计时间戳odom.header.stamp = ros::Time::now(); //里程计的父子坐标系odom.header.frame_id = "odom";odom.child_frame_id = "base_footprint";       //里程计位置数据:x,y,z,方向odom.pose.pose.position.x = position_x.d;     odom.pose.pose.position.y = position_y.d;odom.pose.pose.position.z = 0.0;odom.pose.pose.orientation = odom_quat;       //载入线速度和角速度odom.twist.twist.linear.x = vel_linear.d;//odom.twist.twist.linear.y = odom_vy;odom.twist.twist.angular.z = vel_angular.d;    //发布里程计odom_pub.publish(odom);ros::spinOnce();//周期执行loop_rate.sleep();//周期休眠}//程序周期性调用//ros::spinOnce();  //callback函数必须处理所有问题时,才可以用到}return 0;
}

修改 CMakeLists.txt :


find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generationserialtfnav_msgs
)
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES base_controllerCATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
)
include_directories(${catkin_INCLUDE_DIRS}${serial_INCLUDE_DIRS}
)
add_executable(base_controller src/base_controller.cpp)
target_link_libraries(base_controller ${catkin_LIBRARIES})

检查确认底盘的串口号,如若不是ttyUSB0则在base_controller.cpp文件中修改串口号

$ ls -l /dev |grep ttyUSB

在终端执行

$cd ~/catkin_ws
$catkin_make
$ roscore 
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py
$ rosrun base_controller base_controller
  • [ 以上已经完成虽然最后一步rosrun一直在运行中但键盘无法控制小车动,可以控制数据变化,连接的小车板子是STM32f103]
    在这里插入图片描述
    - 基于ROS平台的STM32小车-2-小车底盘控制
    https://blog.csdn.net/weixin_39752599/article/details/86551764
    STM32控制程序
    (1)main.c 接收和发送串口数据,控制电机
#include "stm32f10x.h"
#include "stm32f10x_it.h"#include "delay.h"
#include "nvic_conf.h"
#include "rcc_conf.h"#include "usart.h"
#include "encoder.h"
#include "contact.h"
#include "gpio_conf.h"
#include "tim2_5_6.h"
#include "odometry.h"
#include "tim2_5_6.h"#include "stdbool.h"
#include <stdio.h>
#include "string.h"
#include "math.h"
/***********************************************  输出  *****************************************************************/char odometry_data[21]={0};   //发送给串口的里程计数据数组float odometry_right=0,odometry_left=0;//串口得到的左右轮速度/***********************************************  输入  *****************************************************************/extern float position_x,position_y,oriention,velocity_linear,velocity_angular;         //计算得到的里程计数值extern u8 USART_RX_BUF[USART_REC_LEN];     //串口接收缓冲,最大USART_REC_LEN个字节.
extern u16 USART_RX_STA;                   //串口接收状态标记   extern float Milemeter_L_Motor,Milemeter_R_Motor;     //dt时间内的左右轮速度,用于里程计计算/***********************************************  变量  *****************************************************************/u8 main_sta=0; //用作处理主函数各种if,去掉多余的flag(1打印里程计)(2调用计算里程计数据函数)(3串口接收成功)(4串口接收失败)union recieveData  //接收到的数据
{float d;    //左右轮速度unsigned char data[4];
}leftdata,rightdata;       //接收的左右轮数据union odometry  //里程计数据共用体
{float odoemtry_float;unsigned char odometry_char[4];
}x_data,y_data,theta_data,vel_linear,vel_angular;     //要发布的里程计数据,分别为:X,Y方向移动的距离,当前角度,线速度,角速度/****************************************************************************************************************/  
int main(void)
{       
u8 t=0;
u8 i=0,j=0,m=0;RCC_Configuration();      //系统时钟配置      
NVIC_Configuration();     //中断优先级配置
GPIO_Configuration();     //电机方向控制引脚配置
USART1_Config();          //串口1配置TIM2_PWM_Init();          //PWM输出初始化
ENC_Init();               //电机处理初始化
TIM5_Configuration();     //速度计算定时器初始化
TIM1_Configuration();     //里程计发布定时器初始化while (1)
{       if(main_sta&0x01)//执行发送里程计数据步骤{//里程计数据获取x_data.odoemtry_float=position_x;//单位mmy_data.odoemtry_float=position_y;//单位mmtheta_data.odoemtry_float=oriention;//单位radvel_linear.odoemtry_float=velocity_linear;//单位mm/svel_angular.odoemtry_float=velocity_angular;//单位rad/s//将所有里程计数据存到要发送的数组for(j=0;j<4;j++){odometry_data[j]=x_data.odometry_char[j];odometry_data[j+4]=y_data.odometry_char[j];odometry_data[j+8]=theta_data.odometry_char[j];odometry_data[j+12]=vel_linear.odometry_char[j];odometry_data[j+16]=vel_angular.odometry_char[j];}odometry_data[20]='\n';//添加结束符//发送数据要串口for(i=0;i<21;i++){USART_ClearFlag(USART1,USART_FLAG_TC);  //在发送第一个数据前加此句,解决第一个数据不能正常发送的问题             USART_SendData(USART1,odometry_data[i]);//发送一个字节到串口 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //等待发送结束            }main_sta&=0xFE;//执行计算里程计数据步骤}if(main_sta&0x02)//执行计算里程计数据步骤{odometry(Milemeter_R_Motor,Milemeter_L_Motor);//计算里程计main_sta&=0xFD;//执行发送里程计数据步骤} if(main_sta&0x08)        //当发送指令没有正确接收时{USART_ClearFlag(USART1,USART_FLAG_TC);  //在发送第一个数据前加此句,解决第一个数据不能正常发送的问题for(m=0;m<3;m++){USART_SendData(USART1,0x00);    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);}       USART_SendData(USART1,'\n');    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); main_sta&=0xF7;}if(USART_RX_STA&0x8000)  // 串口1接收函数{           //接收左右轮速度for(t=0;t<4;t++){rightdata.data[t]=USART_RX_BUF[t];leftdata.data[t]=USART_RX_BUF[t+4];}//储存左右轮速度odometry_right=rightdata.d;//单位mm/sodometry_left=leftdata.d;//单位mm/sUSART_RX_STA=0;//清楚接收标志位}car_control(rightdata.d,leftdata.d);     //将接收到的左右轮速度赋给小车   
}//end_while
}//end main
/*********************************************END OF FILE**************************************************/

2.odometry.c 里程计计算


#include "odometry.h"/***********************************************  输出  *****************************************************************/float position_x=0,position_y=0,oriention=0,velocity_linear=0,velocity_angular=0;/***********************************************  输入  *****************************************************************/extern float odometry_right,odometry_left;//串口得到的左右轮速度/***********************************************  变量  *****************************************************************/float wheel_interval= 268.0859f;//    272.0f;        //  1.0146
//float wheel_interval=276.089f;    //轴距校正值=原轴距/0.987float multiplier=4.0f;           //倍频数
float deceleration_ratio=90.0f;  //减速比
float wheel_diameter=100.0f;     //轮子直径,单位mm
float pi_1_2=1.570796f;          //π/2
float pi=3.141593f;              //π
float pi_3_2=4.712389f;          //π*3/2
float pi_2_1=6.283186f;          //π*2
float dt=0.005f;                 //采样时间间隔5ms
float line_number=4096.0f;       //码盘线数
float oriention_interval=0;  //dt时间内方向变化值float sin_=0;        //角度计算值
float cos_=0;float delta_distance=0,delta_oriention=0;   //采样时间间隔内运动的距离float const_frame=0,const_angle=0,distance_sum=0,distance_diff=0;float oriention_1=0;u8 once=1;/****************************************************************************************************************///里程计计算函数
void odometry(float right,float left)
{   if(once)  //常数仅计算一次{const_frame=wheel_diameter*pi/(line_number*multiplier*deceleration_ratio);const_angle=const_frame/wheel_interval;once=0;}distance_sum = 0.5f*(right+left);//在很短的时间内,小车行驶的路程为两轮速度和distance_diff = right-left;//在很短的时间内,小车行驶的角度为两轮速度差//根据左右轮的方向,纠正短时间内,小车行驶的路程和角度量的正负if((odometry_right>0)&&(odometry_left>0))            //左右均正{delta_distance = distance_sum;delta_oriention = distance_diff;}else if((odometry_right<0)&&(odometry_left<0))       //左右均负{delta_distance = -distance_sum;delta_oriention = -distance_diff;}else if((odometry_right<0)&&(odometry_left>0))       //左正右负{delta_distance = -distance_diff;delta_oriention = -2.0f*distance_sum;       }else if((odometry_right>0)&&(odometry_left<0))       //左负右正{delta_distance = distance_diff;delta_oriention = 2.0f*distance_sum;}else{delta_distance=0;delta_oriention=0;}oriention_interval = delta_oriention * const_angle;//采样时间内走的角度  oriention = oriention + oriention_interval;//计算出里程计方向角oriention_1 = oriention + 0.5f * oriention_interval;//里程计方向角数据位数变化,用于三角函数计算sin_ = sin(oriention_1);//计算出采样时间内y坐标cos_ = cos(oriention_1);//计算出采样时间内x坐标position_x = position_x + delta_distance * cos_ * const_frame;//计算出里程计x坐标position_y = position_y + delta_distance * sin_ * const_frame;//计算出里程计y坐标velocity_linear = delta_distance*const_frame / dt;//计算出里程计线速度velocity_angular = oriention_interval / dt;//计算出里程计角速度//方向角角度纠正if(oriention > pi){oriention -= pi_2_1;}else{if(oriention < -pi){oriention += pi_2_1;}}
}

3.编码器处理


#include "PID.h"extern int span;float MaxValue=9;//输出最大限幅
float MinValue=-9;//输出最小限幅float OutputValue;//PID输出暂存变量,用于积分饱和抑制float PID_calculate(struct PID *Control,float CurrentValue_left )//位置PID计算B
{float Value_Kp;//比例分量float Value_Ki;//积分分量float Value_Kd;//微分分量Control->error_0 = Control->OwenValue - CurrentValue_left + 0*span;//基波分量,Control->OwenValue为想要的速度,CurrentValue_left为电机真实速度Value_Kp = Control->Kp * Control->error_0 ;Control->Sum_error += Control->error_0;     /***********************积分饱和抑制********************************************/OutputValue = Control->OutputValue;if(OutputValue>5 || OutputValue<-5) {Control->Ki = 0; }/*******************************************************************/Value_Ki = Control->Ki * Control->Sum_error;Value_Kd = Control->Kd * ( Control->error_0 - Control->error_1);Control->error_1 = Control->error_0;//保存一次谐波Control->OutputValue = Value_Kp  + Value_Ki + Value_Kd;//输出值计算,注意加减//限幅if( Control->OutputValue > MaxValue)Control->OutputValue = MaxValue;if (Control->OutputValue < MinValue)Control->OutputValue = MinValue;return (Control->OutputValue) ;
}

4.pid处理


#include "encoder.h"/****************************************************************************************************************/s32 hSpeed_Buffer2[SPEED_BUFFER_SIZE]={0}, hSpeed_Buffer1[SPEED_BUFFER_SIZE]={0};//左右轮速度缓存数组
static unsigned int hRot_Speed2;//电机A平均转速缓存
static unsigned int hRot_Speed1;//电机B平均转速缓存
unsigned int Speed2=0; //电机A平均转速 r/min,PID调节
unsigned int Speed1=0; //电机B平均转速 r/min,PID调节static volatile u16 hEncoder_Timer_Overflow1;//电机B编码数采集 
static volatile u16 hEncoder_Timer_Overflow2;//电机A编码数采集//float A_REMP_PLUS;//电机APID调节后的PWM值缓存
float pulse = 0;//电机A PID调节后的PWM值缓存
float pulse1 = 0;//电机B PID调节后的PWM值缓存int span;//采集回来的左右轮速度差值static bool bIs_First_Measurement2 = true;//电机A以清除速度缓存数组标志位
static bool bIs_First_Measurement1 = true;//电机B以清除速度缓存数组标志位struct PID Control_left  ={0.01,0.1,0.75,0,0,0,0,0,0};//左轮PID参数,适于新电机4096
struct PID Control_right ={0.01,0.1,0.75,0,0,0,0,0,0};//右轮PID参数,适于新电机4096/****************************************************************************************************************/s32 hPrevious_angle2, hPrevious_angle1;/****************************************************************************************************************/void ENC_Init2(void)//电机A码盘采集定时器,TIM4编码器模式
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;    GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);TIM_DeInit(ENCODER2_TIMER);TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0;  TIM_TimeBaseStructure.TIM_Period = (4*ENCODER2_PPR)-1;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   TIM_TimeBaseInit(ENCODER2_TIMER, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(ENCODER2_TIMER, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;TIM_ICInit(ENCODER2_TIMER, &TIM_ICInitStructure);TIM_ClearFlag(ENCODER2_TIMER, TIM_FLAG_Update);TIM_ITConfig(ENCODER2_TIMER, TIM_IT_Update, ENABLE);TIM_Cmd(ENCODER2_TIMER, ENABLE); 
}void ENC_Init1(void)//电机B码盘采集定时器,TIM3编码器模式
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_ICInitTypeDef TIM_ICInitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);TIM_DeInit(ENCODER1_TIMER);TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);TIM_TimeBaseStructure.TIM_Prescaler = 0;TIM_TimeBaseStructure.TIM_Period = (4*ENCODER1_PPR)-1;  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   TIM_TimeBaseInit(ENCODER1_TIMER, &TIM_TimeBaseStructure);TIM_EncoderInterfaceConfig(ENCODER1_TIMER, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);TIM_ICStructInit(&TIM_ICInitStructure);TIM_ICInitStructure.TIM_ICFilter = ICx_FILTER;TIM_ICInit(ENCODER1_TIMER, &TIM_ICInitStructure);TIM_ClearFlag(ENCODER1_TIMER, TIM_FLAG_Update);TIM_ITConfig(ENCODER1_TIMER, TIM_IT_Update, ENABLE);TIM_Cmd(ENCODER1_TIMER, ENABLE); 
}/****************************************************************************************************************/s16 ENC_Calc_Rot_Speed2(void)//计算电机A的编码数
{   s32 wDelta_angle;u16 hEnc_Timer_Overflow_sample_one;u16 hCurrent_angle_sample_one;s32 temp;s16 haux;if (!bIs_First_Measurement2)//电机A以清除速度缓存数组{  hEnc_Timer_Overflow_sample_one = hEncoder_Timer_Overflow2;  hCurrent_angle_sample_one = ENCODER2_TIMER->CNT;hEncoder_Timer_Overflow2 = 0;haux = ENCODER2_TIMER->CNT;   if ( (ENCODER2_TIMER->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)  {// encoder timer down-counting 反转的速度计算     wDelta_angle = (s32)((hEnc_Timer_Overflow_sample_one) * (4*ENCODER2_PPR) -(hCurrent_angle_sample_one - hPrevious_angle2));}else  {//encoder timer up-counting 正转的速度计算wDelta_angle = (s32)(hCurrent_angle_sample_one - hPrevious_angle2 + (hEnc_Timer_Overflow_sample_one) * (4*ENCODER2_PPR));}       temp=wDelta_angle;} else{bIs_First_Measurement2 = false;//电机A以清除速度缓存数组标志位temp = 0;hEncoder_Timer_Overflow2 = 0;haux = ENCODER2_TIMER->CNT;       }hPrevious_angle2 = haux;  return((s16) temp);
}s16 ENC_Calc_Rot_Speed1(void)//计算电机B的编码数
{   s32 wDelta_angle;u16 hEnc_Timer_Overflow_sample_one;u16 hCurrent_angle_sample_one;s32 temp;s16 haux;if (!bIs_First_Measurement1)//电机B以清除速度缓存数组{   hEnc_Timer_Overflow_sample_one = hEncoder_Timer_Overflow1;  //得到采样时间内的编码数   hCurrent_angle_sample_one = ENCODER1_TIMER->CNT;hEncoder_Timer_Overflow1 = 0;//清除脉冲数累加haux = ENCODER1_TIMER->CNT;   if ( (ENCODER1_TIMER->CR1 & TIM_CounterMode_Down) == TIM_CounterMode_Down)  {// encoder timer down-counting 反转的速度计算wDelta_angle = (s32)((hEnc_Timer_Overflow_sample_one) * (4*ENCODER1_PPR) -(hCurrent_angle_sample_one - hPrevious_angle1));  }else  {//encoder timer up-counting 正转的速度计算wDelta_angle = (s32)(hCurrent_angle_sample_one - hPrevious_angle1 + (hEnc_Timer_Overflow_sample_one) * (4*ENCODER1_PPR));}temp=wDelta_angle;} else{bIs_First_Measurement1 = false;//电机B以清除速度缓存数组标志位temp = 0;hEncoder_Timer_Overflow1 = 0;haux = ENCODER1_TIMER->CNT;       }hPrevious_angle1 = haux;  return((s16) temp);
}/****************************************************************************************************************/void ENC_Clear_Speed_Buffer(void)//速度存储器清零
{   u32 i;//清除左右轮速度缓存数组for (i=0;i<SPEED_BUFFER_SIZE;i++){hSpeed_Buffer2[i] = 0;hSpeed_Buffer1[i] = 0;}bIs_First_Measurement2 = true;//电机A以清除速度缓存数组标志位bIs_First_Measurement1 = true;//电机B以清除速度缓存数组标志位
}void ENC_Calc_Average_Speed(void)//计算三次电机的平均编码数
{   u32 i;signed long long wtemp3=0;signed long long wtemp4=0;//累加缓存次数内的速度值for (i=0;i<SPEED_BUFFER_SIZE;i++){wtemp4 += hSpeed_Buffer2[i];wtemp3 += hSpeed_Buffer1[i];}//取平均,平均脉冲数单位为 个/s  wtemp3 /= (SPEED_BUFFER_SIZE);wtemp4 /= (SPEED_BUFFER_SIZE); //平均脉冲数 个/s  //将平均脉冲数单位转为 r/minwtemp3 = (wtemp3 * SPEED_SAMPLING_FREQ)*60/(4*ENCODER1_PPR);wtemp4 = (wtemp4 * SPEED_SAMPLING_FREQ)*60/(4*ENCODER2_PPR); hRot_Speed2= ((s16)(wtemp4));//平均转速 r/minhRot_Speed1= ((s16)(wtemp3));//平均转速 r/minSpeed2=hRot_Speed2;//平均转速 r/minSpeed1=hRot_Speed1;//平均转速 r/min
}/****************************************************************************************************************/void Gain2(void)//设置电机A PID调节 PA2
{//static float pulse = 0;span=1*(Speed1-Speed2);//采集回来的左右轮速度差值pulse= pulse + PID_calculate(&Control_right,hRot_Speed2);//PID调节//pwm幅度抑制if(pulse > 3600) pulse = 3600;if(pulse < 0) pulse = 0;//A_REMP_PLUS=pulse;//电机APID调节后的PWM值缓存
}void Gain1(void)//设置电机B PID调节 PA1
{//static float pulse1 = 0;span=1*(Speed2-Speed1);//采集回来的左右轮速度差值pulse1= pulse1 + PID_calculate(&Control_left,hRot_Speed1);//PID调节pwm 幅度抑制if(pulse1 > 3600) pulse1 = 3600;if(pulse1 < 0) pulse1 = 0;TIM2->CCR2 = pulse1;//电机B赋值PWM//TIM2->CCR3 = A_REMP_PLUS;//电机A赋值PWMTIM2->CCR3 = pulse;//电机A赋值PWM
}/****************************************************************************************************************/void ENC_Init(void)//电机处理初始化
{ENC_Init2();              //设置电机A TIM4编码器模式PB6 PB7 右电机ENC_Init1();              //设置电机B TIM3编码器模式PA6 PA7 左电机ENC_Clear_Speed_Buffer();//速度存储器清零
}/****************************************************************************************************************/void TIM4_IRQHandler (void)//执行TIM4(电机A编码器采集)计数中断
{   TIM_ClearFlag(ENCODER2_TIMER, TIM_FLAG_Update);if (hEncoder_Timer_Overflow2 != U16_MAX)//不超范围  {hEncoder_Timer_Overflow2++; //脉冲数累加}
}void TIM3_IRQHandler (void)//执行TIM3(电机B编码器采集)计数中断
{  TIM_ClearFlag(ENCODER1_TIMER, TIM_FLAG_Update);if (hEncoder_Timer_Overflow1 != U16_MAX)//不超范围    {hEncoder_Timer_Overflow1++;  //脉冲数累加}
}

5.contact.c 电机控制函数


#include "contact.h"/***********************************************  输出  *****************************************************************//***********************************************  输入  *****************************************************************/extern struct PID Control_left;//左轮PID参数,适于新电机4096
extern struct PID Control_right;//右轮PID参数,适于新电机4096/***********************************************  变量  *****************************************************************//*******************************************************************************************************************/void LeftMovingSpeedW(unsigned int val)//左轮方向和速度控制函数
{     if(val>10000){  GPIO_SetBits(GPIOC, GPIO_Pin_6);    GPIO_ResetBits(GPIOC, GPIO_Pin_7);  Control_left.OwenValue=(val-10000);//PID调节的目标编码数            }else if(val<10000){  GPIO_SetBits(GPIOC, GPIO_Pin_7);    GPIO_ResetBits(GPIOC, GPIO_Pin_6);  Control_left.OwenValue=(10000-val);//PID调节的目标编码数     }   else{GPIO_SetBits(GPIOC, GPIO_Pin_6);   GPIO_SetBits(GPIOC, GPIO_Pin_7);Control_left.OwenValue=0;//PID调节的目标编码数}                   
}void RightMovingSpeedW(unsigned int val2)//右轮方向和速度控制函数
{    if(val2>10000){  /* motor A 正转*/GPIO_SetBits(GPIOC, GPIO_Pin_10);   GPIO_ResetBits(GPIOC, GPIO_Pin_11); Control_right.OwenValue=(val2-10000);//PID调节的目标编码数}else if(val2<10000){  /* motor A 反转*/GPIO_SetBits(GPIOC, GPIO_Pin_11);   GPIO_ResetBits(GPIOC, GPIO_Pin_10); Control_right.OwenValue=(10000-val2);//PID调节的目标编码数   }   else{GPIO_SetBits(GPIOC, GPIO_Pin_10);   GPIO_SetBits(GPIOC, GPIO_Pin_11);Control_right.OwenValue=0;//PID调节的目标编码数}                                               
}void car_control(float rightspeed,float leftspeed)//小车速度转化和控制函数
{float k2=17.179;         //速度转换比例,转/分钟  //将从串口接收到的速度转换成实际控制小车的速度?还是PWM?int right_speed=(int)k2*rightspeed;int left_speed=(int)k2*leftspeed;RightMovingSpeedW(right_speed+10000);LeftMovingSpeedW(left_speed+10000);
}//void Contact_Init(void)//左右轮方向和速度初始化
//{
//  LeftMovingSpeedW(12000); //电机B
//  RightMovingSpeedW(12000);//电机A  
//}
  • [ 不会独立建立一个完整的stm32工程???]

  • 基于ROS平台的STM32小车-3-小车底盘与ROS的通信
    https://blog.csdn.net/weixin_39752599/article/details/86552189

ROS平台与底盘通信协议

ROS平台与小车底盘的通信一般是通过串口或者CAN总线。
我这里采用的是串口,以下为我自定义的通信数据格式:

——底盘串口部分:

串口接收
(1)内容:小车左右轮速度,单位:mm/s(所有数据都为 float型,float型占4字节)
(2)格式:10字节 [右轮速度4字节][左轮速度4字节][结束符"\r\n"2字节]

串口发送
(1)内容:里程计(x,y坐标、线速度、角速度和方向角,单位依次为:mm,mm,mm/s,rad/s,rad,所有数据都为float型,float型占4字节)
(2)格式:21字节 [x坐标4字节][y坐标4字节][方向角4字节][线速度4字节][角速度4字节][结束符"\n"1字节]

——ROS平台串口节点部分:

写入串口
(1)内容:左右轮速度,单位为mm/s
(2)格式:10字节,[右轮速度4字节][左轮速度4字节][结束符"\r\n"2字节]

读取串口

(1)内容:小车x,y坐标,方向角,线速度,角速度,单位依次为:mm,mm,rad,mm/s,rad/s

(2)格式:21字节,[X坐标4字节][Y坐标4字节][方向角4字节][线速度4字节][角速度4字节][结束符"\n"1字节]

串口通信处理程序

(1)小车底盘串口处理程序:

底盘串口处理的程序主要写在了 main.c 文件中。

底盘向串口发送里程计代码:


if(main_sta&0x01)//执行发送里程计数据步骤
{//里程计数据获取x_data.odoemtry_float=position_x;//单位mmy_data.odoemtry_float=position_y;//单位mmtheta_data.odoemtry_float=oriention;//单位radvel_linear.odoemtry_float=velocity_linear;//单位mm/svel_angular.odoemtry_float=velocity_angular;//单位rad/s//将所有里程计数据存到要发送的数组for(j=0;j<4;j++){odometry_data[j]=x_data.odometry_char[j];odometry_data[j+4]=y_data.odometry_char[j];odometry_data[j+8]=theta_data.odometry_char[j];odometry_data[j+12]=vel_linear.odometry_char[j];odometry_data[j+16]=vel_angular.odometry_char[j];}odometry_data[20]='\n';//添加结束符//发送数据要串口for(i=0;i<21;i++){USART_ClearFlag(USART1,USART_FLAG_TC);  //在发送第一个数据前加此句,解决第一个数据不能正常发送的问题             USART_SendData(USART1,odometry_data[i]);//发送一个字节到串口 while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); //等待发送结束            }main_sta&=0xFE;//执行计算里程计数据步骤
}

2.底盘接收串口发来的速度代码:


if(USART_RX_STA&0x8000)  // 串口1接收函数
{           //接收左右轮速度for(t=0;t<4;t++){rightdata.data[t]=USART_RX_BUF[t];leftdata.data[t]=USART_RX_BUF[t+4];}//储存左右轮速度odometry_right=rightdata.d;//单位mm/sodometry_left=leftdata.d;//单位mm/sUSART_RX_STA=0;//清楚接收标志位
}

(2)ROS平台串口处理程序

ROS平台串口处理程序主要写在 base_controller.cpp 文件中。

ROS平台向串口发送速度代码:

void callback(const geometry_msgs::Twist & cmd_input)//订阅/cmd_vel主题回调函数
{string port("/dev/ttyUSB0");    //小车串口号unsigned long baud = 115200;    //小车串口波特率serial::Serial my_serial(port, baud, serial::Timeout::simpleTimeout(1000)); //配置串口angular_temp = cmd_input.angular.z ;//获取/cmd_vel的角速度,rad/slinear_temp = cmd_input.linear.x ;//获取/cmd_vel的线速度.m/s//将转换好的小车速度分量为左右轮速度left_speed_data.d = linear_temp - 0.5f*angular_temp*D ;right_speed_data.d = linear_temp + 0.5f*angular_temp*D ;//存入数据到要发布的左右轮速度消息left_speed_data.d*=ratio;   //放大1000倍,mm/sright_speed_data.d*=ratio;//放大1000倍,mm/sfor(int i=0;i<4;i++)    //将左右轮速度存入数组中发送给串口{speed_data[i]=right_speed_data.data[i];speed_data[i+4]=left_speed_data.data[i];}//在写入串口的左右轮速度数据后加入”/r/n“speed_data[8]=data_terminal0;speed_data[9]=data_terminal1;//写入数据到串口my_serial.write(speed_data,10);
}

2.ROS平台接收串口发来的里程计代码:

rec_buffer =my_serial.readline(25,"\n");    //获取串口发送来的数据
const char *receive_data=rec_buffer.data(); //保存串口发送来的数据
  • [ 这些代码又该何去何从???]

  • rosserial通信协议简介

https://blog.csdn.net/x_r_su/article/details/52734403

1 概述
rosserial是一种ROS串行通信协议,通过串行传输介质实现ROS的P2P通信。这种协议通过简单的添加包头和包尾可以实现了多主题或者服务共享串行通信介质(如串口,网络socket)。

2 协议包格式

1st Byte - Sync Flag (Value: 0xff)
2nd Byte - Sync Flag / Protocol version
3rd Byte - Message Length (N) - Low Byte
4th Byte -Message Length (N) - High Byte
5th Byte - Checksum over message length
6th Byte - Topic ID - Low Byte
7th Byte - Topic ID - High Byte
N Bytes - Serialized Message Data Byte
N+8 - Checksum over Topic ID and Message Data

不同ROS发行版对应不同协议版本字段定义
(0xff:ROS Groovy, 0xfe on ROS Hydro, Indigo, and Jade.)。

Topics ID 0-100为系统功能专用主题使用, 这些主题类似于消息 rosserial_msgs/TopicInfo 中定义的那些特定主题。

长度和data的checksum字段用于确保包的完整性,data的checksum可以按照如下公式计算:

255 - ( (Topic ID Low Byte +
Topic ID High Byte +
data byte values) % 256)

3 主题协商

在数据传输之前,PC/平板一侧必须先向Arduino或者其它嵌入式设备发送主题查询请求,确定将要发送或者订阅的主题的名字和消息类型。

主题协商由主题查询请求,响应和主题定义组成。主题查询请求使用的topic ID为0。

主题查询请求类似于如下所示:

0xff 0xfe 0x00 0x00 0xff 0x00 0x00 0xff

主题查询响应包 (消息类型为rosserial_msgs/TopicInfo) 包含了特定主题信息,使用如下的数据信息:

uint16 topic_id
string topic_name
string message_type
string md5sum
int32 buffer_size

上面的topic_name是主题名称,如 “cmd_vel”, message_type是消息类型,如"geometry_msgs/Twist"。

注意:如果响应包未收到,查询会重发。

4 同步
相互之间的时间同步通过发送消息 std_msgs::Time实现。 嵌入式设备可以向PC/平板发送空的时间消息获取当前时间,响应返回的时间可以用于时间同步(检查时钟偏差)。

5 rosserial相关包
5.1 客户端库

通过这些库用户可以方便的让ROS节点在各种系统上启动和运行。下面这些库是通用ANSI C++ rosserial_client 库的具体化,目前包括如下:

rosserial_arduino
Arduino, especially UNO and Leonardo
rosserial_embeddedlinux
support for Embedded Linux (eg, routers)
rosserial_windows
support for communicating with Windows applications
rosserial_mbed
support for mbed platforms
rosserial_tivac
support for TI’s Launchpad boards, TM4C123GXL and TM4C1294XL

5.2 ROS厕接口

运行rosserial的众多设备需要通过在主机上运行的节点来把它们桥接起来,接入更广的ROS网络拓扑。

rosserial_python
A Python-based implementation (recommended for PC usage).
rosserial_server
A C++ implementation based on the ShapeShifter message, some limitations compared to rosserial_python but recommended for high-performance applications.
rosserial_java
A Java-based implementation. This implementation is only recommended when you need a Java OSGI based rosserial module or when you want to use rosserial with the Android ADK.

  • [ 看了也不知道重点在哪怎么用系列???]

ros下使用rosserial和STM32F1/STM32F4系列进行通信(MDK5工程)

https://blog.csdn.net/qq_36349536/article/details/82773064
本文主要介绍ROS下使用rosserial和STM32(ST库)进行通信,移植网上各位大神的代码,实现自己想要的功能

主要参考:https://www.baidu.com/link?url=HHBcr34K6SbLnst52P-4mSGPKxvCAQXGwGbHb5C_cp97Oe8f8cDQ8My__1_I3D-B0MezdtSdFuXy8awy6odoeqcmc8YiFrvOT8nCAFGr-YqwF1TCLtuqvRBkzquqXlP0&wd=&eqid=b7c144b80000b29c000000065ba1fb47

rosserial的详细介绍:http://wiki.ros.org/rosserial
rosserial_client的介绍:http://wiki.ros.org/rosserial_client
rosserial_client的教程程:http://wiki.ros.org/rosserial_client/Tutorials

本文配置的串口是串口1波特率是57600

写好底盘的代码后我们在我们的Ubuntu(ROS系统)中使用:

git clone https://github.com/ros-drivers/rosserial.git  

下载rosserial的包然后使用catkin_make进行编译,
编译完成后先运行roscore (已完成至此)
然后再运行rosrun rosserial_python serial_node.py /dev/ttyUSB0
如果出现 "robot_Star Connected!"则说明连接成功。

  • [ 程序已经下载到电脑了,问题是怎么下载到板子里,有stlink,但是板子没有对应的插口,这个程序有什么用呢???]

- ROS下使用stm32 与rosserial进行通信的开发说明及源代码示例

https://blog.csdn.net/ykevin0510/article/details/72725633?locationNum=7&fps=1
关于stm32下的ROS开发环境介绍说明,此开发环境是在Linux下使用stm32的标准库“STM32F10x_StdPeriph_Driver3.5”,进行stm32开发,整体开发框架已搭建完成,用户开发简单,只需要按自己的方式开发代码即可,它集成了ros_lib,让开发ros底层像arduino一样操作,让广大机友从写stm32解析器结点中解放出来
一、开发环境的配置(ubuntu16.04系统)
1、安装编译工具链

$sudo apt-get install -y git build-essential gcc-arm-none-eabi

如果提示找不到相关安装包,请执行下面操作

$sudo add-apt-repository ppa:team-gcc-arm-embedded/ppa 
$sudo apt-get update 
$sudo apt-get install -y git build-essential gcc-arm-none-eabi libusb-1.0-0-dev

2、安装st-link 烧写器驱动

$git clone https://github.com/texane/stlink.git 
$cd stlink 
$ make 
$ cd build/Release 
$ sudo make install

(已完成至此)
二、怎样添加自己的代码
1、往代码目录那面的Src、Bsp、Driver目录下面添加源码后,代码可支持C与C++,编写好代码后,(可直接参考上一篇下载好的程序)
请在Makefile文件中“OBJS += ./Driver/xxx.o
(???makefile在ros里面哪,具体如何添加)
”的样式添加,其中“xxx”就是你代码的文件名。
(这篇文章可能有帮助http://www.360doc.com/content/14/0307/15/7991404_358531203.shtml
高级~看不明白)

2、编译程序,进入工程主目录,执行

3、如果是添加C代码时,进行混编译,请注意.c中(这个是修改keil里面的程序吗???)请按下面格式编写代码,请注意只是.c代码需要添加,如果.c文件对应的有.h文件,则只需要在.h文件添加即可,.cpp代码不需要,此处作用,用户可以自己去了解,我就不赘述

#ifdef __cplusplus extern “C” {
#endif

/*添加自己编写代码区域*/

#ifdef __cplusplus } #endif

make

3、确认st-link驱动是否安装好,插入st-link V2 烧写器,执行下面命令,如果有“STMicroelectronics ST-LINK/V2”,则说明st-link烧写器已被系统识别

lsusb

4、进入工程主目录,执行

make flash

三、关于项目代码结构
1、 Bsp目录,关于驱动的配置与串口的驱动文件都放在此目录
2、 Driver目录,关于模块的驱动文件都放在此目录
3、Src目录,main程序入口文件放在此目录
4、Libs,里面放了ros_lib 与 stm32 标准库

四、关于开发板的测试使用
用户购买到开发板后,一般都是烧写好测试程序的,拿到手后可直接测试,测试流程如下

  • 1、用micro usb(一定是能传输数据的usb)将开发板与PC端的ROS系统(indigo以上版本系统,如果是indigo版本系统请先删除系统默认的rosserial包,下载最新的rosserial,重新编译)相连接,连接好后检查是否识别到ttyUSB0,如果有,则说明连接正常,然后打开四个终端依次在每个终端运行

    $roscore

    $ rosrun rosserial_python serial_node.py /dev/ttyUSB0

运行下面命令,则会反馈系统的供电电压值,如下图

$ rostopic echo /battery 

运行下面命令,板子上的LED会以0.1s的频率闪烁

$ rostopic pub -r 10 led std_msgs/Float64 – -0.001

(跳过第二步进行第四步得到的结果如下图)
跳过第二步进行第四步得到的结果

问题解决—Unable to sync with device; possible link problem or link software version mismatch such as hyd
https://blog.csdn.net/wangguchao/article/details/86598059
(这篇文章波特率是115200,但是对于这个程序波特率应该就是57600)

2.1 下位机程序波特率看一下对不对,是不是115200;(没有下位机程序???)

2.2 上位机ROS查看波特率设置,例如在launch文件中查看参数设置,(哪个launch文件???stm32程序里面用的波特率确实为57600)

< node pkg="rosserial_python" type="serial_node.py" name="serial_node"
> < param name="port" value="/dev/ttyUSB0" / >< param name="baud" value="115200" / >< /node >

2.3 设置用到的USB波特率(就是57600应该不用修改)

查看usb的属性:

stty -F /dev/ttyUSB0

如果不是115200,,修改usb的波特率为115200,方法如下:

 stty -F /dev/ttyUSB0  115200

五、关于使用中的问题

$sudo chmod 777 /dev/ttyUSB0

1、永久解决串口权限问题, 其中riki是你系统的用户名,请替换,然后重启

$sudo usermod -aG dialout riki

2、“/dev/ttyUSB0: Input/output error” 此种问题是驱动问题,请安装我提供的驱动,将驱动源码放到ubuntu系统中

$unzip CH341SER_LINUX.zip 
$ cd CH341SER_LINUX 
$ make

上面编译后会生ch34x.ko文件,如果你已经能识别usb说明已装了老驱动,此时将它删除,加载新驱动

$sudo rmmod ch341 
$sudo insmod ch34x.ko

要开机启动时自己加载驱动怎么办?

$sudo cp ch34x.ko /lib/modules/$(uname -r)/kernel/drivers/usb/serial 
$sudo depmod 
$sudo rm /lib/modules/$(uname -r)/kernel/drivers/usb/serial/ch341.ko

3、重启系统后,执行下面命令,如果驱动有ch34x,则说明安装成功

lsmod | grep ch

六、没有st-link的在linux下用ISP烧写程序
1、安装烧写环境

$sudo apt-get install stm32flash

(这一步已完成)
2、用usb串口烧写程序,烧写前请将Boot0设置为高,BOOT1设置为低,main.bin就是你要烧写的二进制文件,请替换,烧写时请按复位后,立即执行下面烧写命令,速度要快,不然会跳转失败,烧完请恢复默认设置。

$sudo stm32flash -w main.bin -v -g 0x0 /dev/ttyUSB0 -b 115200

(可能有帮助http://www.elecfans.com/emb/app/20171116580349_a.html)

———————————————————————————————————————
将rikirobot的程序下载到舵机小车里后蓝灯不再闪烁,单片机无法正常工作,再次在虚拟机控制还是不行

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 如何整合Flowable-modeler到自己的项目中

    如何整合Flowable-modeler到自己的项目中 Flowable工作流 flowable-modeler 几年没做工作流了&#xff0c;时过进迁&#xff0c;时不时忆起当年&#xff0c;还时那般激情热血。牢骚完&#xff0c;感慨闭&#xff0c;几年后的今天又要开始做自定义工作流的开发&#xff0c;今天…...

    2024/5/6 10:28:42
  2. 项目总结(ionic3中的生命周期钩子和各种装饰器)

    新做的项目采用了angular4.0和ionic3.0&#xff0c;所以就总结一下对ionic3.0的一些认识。 首先先认识一下ionic3.0的生命周期钩子&#xff0c;生命周期钩子又叫生命周期事件&#xff0c;它们分别会在页面生命周期的各个阶段被触发&#xff0c;我们来简单了解一下。 1.ionVie…...

    2024/4/21 14:25:06
  3. 微信JSSDK遇到的那些坑

    作为一个前端开发者&#xff0c;相信很多同道中人在微信公众号的开发中被坑的很惨&#xff0c;我也分享开发过程中的一点点经验给大家&#xff0c;可以减少很多弯路。由于项目需要&#xff0c;前端开发使用的是angular4.0技术&#xff0c;微信开发工具v1.02。前端开发公众号最坑…...

    2024/4/30 1:06:44
  4. day50.品优购电商,springSecurity安全框架,运营商登陆与安全控制功能,商家的入驻和审核

    什么是springSecurity安全框架: springSecurity是spring这个组织生产的一个安全框架, 也就是权限管理框架 作用: 将springSecurity集成到我们系统中, 我们就可以用它来完成系统的权限控制管理. a) 用户名, 密码认证(判断用户名密码是否正确) b) 授权: 给予登录用户对应的访问权…...

    2024/4/29 10:49:38
  5. Web应用的组件化开发(二)

    管控平台 在上一篇中我们提到了组件化的大致思路&#xff0c;这一篇主要讲述在这么做之后&#xff0c;我们需要哪些外围手段去管控整个开发过程。从各种角度看&#xff0c;面对较大规模前端开发团队&#xff0c;都有必要建立这么一个开发阶段的协作平台。 在这个平台上&#xf…...

    2024/4/21 14:25:04
  6. 前端每周清单:React Router 4.0发布、Firefox 52默认支持WebAssembly、苹果热修复门盘点...

    前端每周清单&#xff1a;React Router 4.0发布、Firefox 52默认支持WebAssembly、苹果热修复门盘点 为InfoQ中文站特供稿件&#xff0c;首发地址为这里&#xff1b;如需转载&#xff0c;请与InfoQ中文站联系。从属于笔者的Web 前端入门与工程实践。更多阅读清单请转向往期索引…...

    2024/4/29 17:22:18
  7. [DELVE][web]基于angular js的Spring security验证

    REQUIREMENT 现在做的项目&#xff0c;前台是angular js&#xff0c;后台是基于spring的java web。 两者是完全分离开的。身份验证是首次传入帐后密码&#xff0c;之后用token进行验证。 Spring security的默认配置是应用在jsp条件&#xff0c;前后台耦合的情况下。适用于前…...

    2024/5/2 17:54:43
  8. 【图吧导航】非常好的手机导航软件Mapbar,支持离线地图下载(就是谷歌地图)...

    以前发的百度离线地图存在两个问题,导航的时候当前位置不会居中,会跑到屏幕外面去,再就是地图数据太大。现在找到了图吧,因为名是Mapbar,在用Google地图的时候,就会看到中国的地图供应商是Mapbar,因此这家的地图还是可以的,全国的离线地图才332MB,导航和给力。1-软件…...

    2024/4/29 16:09:36
  9. 割完双眼皮多久戴

    ...

    2024/4/21 14:24:59
  10. angular2回调函数与数据绑定不能实时更新的问题

    关于Angular2中回调函数与数据绑定不能实时更新的问题 回调函数跑出了Angular2的zone&#xff0c;所以需要注入ChangeDetector&#xff0c;显式地通知Angular2框架进行更新&#xff0c;类似于Angular1.x中的apply()&#xff1a; import {ChangeDetectorRef} from "angula…...

    2024/5/2 22:38:21
  11. 割完双眼皮多久冰敷

    ...

    2024/4/28 11:34:46
  12. angularJs指令的3种绑定策略

    今天&#xff0c;我来谈谈angularJs指令的3种绑定策略。 公司最近大量使用angularJs做单页面应用&#xff0c;就免不了使用angularJs的一些组件&#xff0c;而有的组件网上有现成的&#xff0c;不必操心&#xff0c;而有的就得自食其力&#xff0c;先前对指令这一块的封装一直…...

    2024/4/28 20:22:10
  13. 割完双眼皮多吃什么

    ...

    2024/4/29 21:27:36
  14. 电商项目的app学习笔记(四)-路由跳转的过渡动画实现

    原本的效果是这样的&#xff1a; 官网教程&#xff1a;https://cn.vuejs.org/v2/guide/transitions.html Vue 提供了 transition 的封装组件&#xff0c;在下列情形中&#xff0c;可以给任何元素和组件添加进入/离开过渡 条件渲染 (使用 v-if) 条件展示 (使用 v-show) 动态组…...

    2024/4/28 2:04:35
  15. 割完双眼皮第一天好疼

    ...

    2024/4/29 1:56:53
  16. 割完双眼皮吃什么粥好

    ...

    2024/4/28 21:36:05
  17. 割完双眼皮吃什么食物

    ...

    2024/4/29 18:35:01
  18. 割完双眼皮吃什么东西

    ...

    2024/5/1 17:47:54
  19. 割完双眼皮吃哪些水果

    ...

    2024/4/29 2:02:14
  20. 数万字的0基础React知识大纲一定要藏藏好

    第1章&#xff1a;React入门 1.1.React简介 1.1.1 官网 1.英文官网: https://reactjs.org/ 2.中文官网: https://react.docschina.org/ 1.1.2介绍描述 1.用于动态构建用户界面的 JavaScript 库(只关注于视图) 2.由Facebook开源 1.1.3React的特点 1.声明式编码 2.组件化编…...

    2024/5/1 19:07:10

最新文章

  1. c++跳转语句

    ...

    2024/5/6 10:49:30
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/6 9:38:23
  3. 深入浅出 -- 系统架构之微服务中Nacos的部署

    前面我们提到过&#xff0c;在微服务架构中&#xff0c;Nacos注册中心属于核心组件&#xff0c;通常我们会采用高性能独立服务器进行部署&#xff0c;下面我们一起来看看Nacos部署过程&#xff1a; 1、环境准备 因为Nacos是支持windows和Linux系统的&#xff0c;且服务器操作…...

    2024/5/5 1:21:32
  4. 【Godot4自学手册】第三十五节摇杆控制开门

    本节主要实现&#xff0c;在地宫墙壁上安装一扇门&#xff0c;在核实安装一个开门的摇杆&#xff0c;攻击摇杆&#xff0c;打开这扇门&#xff0c;但是只能攻击一次&#xff0c;效果如下&#xff1a; 一、添加完善节点 切换到underground场景&#xff0c;先将TileMap修改一下…...

    2024/5/3 8:55:49
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/6 9:21:00
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/4 23:55:01
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57