当前位置: 首页 > news >正文

企业网站模板下载562南宁网站建设费用

企业网站模板下载562,南宁网站建设费用,爱站seo排名可以做哪些网站,集团网站建设流程这里写目录标题 前言一、赛题分析1、车型选择2、巡线1、OpenMv循迹2、灰度循迹 3、装载药品4、识别数字5、LED指示6、双车通信7、转向方案1、开环转向2、位置环速度环闭环串级转向3、MPU6050转向 二、调试经验分享1、循迹2、识别数字3、转向4、双车通信5、逻辑处理6、心态问题 … 这里写目录标题 前言一、赛题分析1、车型选择2、巡线1、OpenMv循迹2、灰度循迹 3、装载药品4、识别数字5、LED指示6、双车通信7、转向方案1、开环转向2、位置环速度环闭环串级转向3、MPU6050转向 二、调试经验分享1、循迹2、识别数字3、转向4、双车通信5、逻辑处理6、心态问题 总结开源链接 前言 自己是今年准备电赛的同学一名电赛结束了想把自己之前刷过的题目通过这篇文章来分享一波做这道题的思路和调试方法 自己在做之前的电赛题目时也苦苦没有思路不知道该怎么去下手面对题目的要求和限制应该如何去分析和实现 由于我们主要是准备小车相关的大部分时间都用来刷电赛期间出现的小车题目了 其中包括21年F题——智能送药小车、22年C题——小车跟随系统、22年B题——自动泊车系统等 可是今年电赛题目并没有小车小车和无人机一起 可以看出电赛题目更贴近于综合对个人能力的要求更高了 好了废话不多说我会在这段时间,将学习到的知识和做电赛题目的代码一步一步写出文章分享和教学希望以后的同学可以参考学习而不是盲目无从下手 一、赛题分析 赛题地图如下 1、车型选择 在做这道题目的时候采用过好几种车型并且采用过不同的方案其中一种是 四轮小车前轮为舵机转向后两轮为驱动轮三轮小车前轮为万向轮或牛眼轮后两轮为驱动轮 在实践的过程中因为题目要求是转向90°这种情况下三轮小车前轮为从动轮的更占优势转向更为方便而舵机前轮后轮驱动的车型转向就无法像三轮一般丝滑略显笨重但是也可以实现 2、巡线 巡线有两种方案 OpenMv巡线灰度循迹 这两种循迹方案都是差不多的都是检测当前小车行进的位置的偏差的误差值来改变小车的行进方向 就是接收误差将误差带入PID进行计算得出巡线补偿使小车始终保持在期望中心 1、OpenMv循迹 这部分我就不多写了OpenMv有很多种方法来巡线这部分是队友负责我大概也知道一些比如二值化、色块追踪、模拟灰度传感器等 32这边始终接收到的数据就是一个偏差Err,根据这个Err来计算PID,调节PID参数到达期巡线望值 最后这个计算出来的值一般也是串起来的循线环输出带入速度环的输入两轮不同的方向一边,一边-调节PID参数即可丝滑循迹 float location_pid_realize(_pid *pid, float actual_val) {/* 计算偏差 这里的偏差是指 巡线偏差 设定的巡线期望值 和 MV传回的巡线实际值 得偏差 */pid-err pid-target_val - actual_val;pid-integral pid-err; // 误差累积// if (pid-err 1000) // 积分限幅// {// pid-err 0;// }// if (huidu.output 550)// huidu.output 550;// if (huidu.output -600)// huidu.output -600;/*PID算法实现*/pid-actual_val pid-Kp * pid-err pid-Ki * pid-integral pid-Kd * (pid-err - pid-err_last);/*误差传递*/pid-err_last pid-err;/*返回当前实际值*/return pid-actual_val; }/*** brief 巡线pid输出函数 后轮差速* param actual_val:实际值* note 无* retval 通过PID计算后的输出*/ float OpenMV_location_pid_control(void) {float Expect_Pwm 0.0; // 当前控制值Pid_location OpenMv_data1 * 10; // 获取巡线模块当前误差 后轮差速// Pid_location 0;Expect_Pwm location_pid_realize(OpenMv_pid_track, Pid_location); // 进行 PID 计算// #if defined(PID_ASSISTANT_EN)// set_computer_value(SEND_FACT_CMD, CURVES_CH1, actual_speed, 1); // 给通道 1 发送实际值// #endifreturn Expect_Pwm; } 2、灰度循迹 这部分我使用的是五路灰度循迹也是根据灰度管检测当前时刻的巡线变化来得出巡线偏差带入PID进行计算这和OpenMv巡线类似我给出如何获得误差大家就可以把误差带入PID进行计算了 最后这个计算出来的值一般也是串起来的循线环输出带入速度环的输入两轮不同的方向一边,一边-调节PID参数即可丝滑循迹 /** Author: _oufen* Date: 2023-04-15 09:06:56* LastEditTime: 2023-07-27 19:50:46* Description: 五路灰度传感器*//* Includes -------------------------------------------------------------------------------------------------------------*/ #include tracking.h/* Define -----------------------------------------------------------------------------------------------------------------*/ PID_Track pid_track; /* Functions -----------------------------------------------------------------------------------------------------------------*/ /*** brief 五路灰度GPIO初始化* param None* retval None* 分别使用到了 PB0/PB1/PB8/PB9/PA4*/ void Tracking_Init(void) {// GPIO初始化 上拉输入MY_GPIO_Init(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9, GPIO_Mode_IPD);MY_GPIO_Init(GPIOA, GPIO_Pin_4, GPIO_Mode_IPD); }/*** brief 五路灰度GPIO初始化* param None* retval None* 分别使用到了 PB0/PB1/PB8/PB9/PA4* 计划使用中间三路进行巡线 最左端和最右端进行识别十字路口和丁字路口* 这里行驶的距离和巡线要有巡线补偿* 低电平有效输出 感应黑色输出高电平*/ void Tracking_Control(void) { }void PID_xun_init(void) // 五路灰度循迹pid初始化 {pid_track.Kp 35.0;pid_track.Ki 0.0;pid_track.Kd 0.0;pid_track.err 0.0;pid_track.err_last 0.0;pid_track.integral 0.0;pid_track.output 0.0; }/*** brief 循迹模块对应所有初始化* param None* retval None*/ void Tracking_All_Init(void) {Tracking_Init(); // 循迹GPIO初始化PID_xun_init(); // 循迹PID参数初始化 }float PID_output(void) {if ((L2 1) (L1 0) (M 0) (R1 0) (R2 0)) // 10000{pid_track.err -3;}else if ((L2 1) (L1 1) (M 0) (R1 0) (R2 0)) // 11000{pid_track.err -2;}else if ((L2 0) (L1 1) (M 0) (R1 0) (R2 0)) // 01000{pid_track.err -1.5;}else if ((L2 0) (L1 1) (M 1) (R1 0) (R2 0)) // 01100{pid_track.err -1;}else if ((L2 1) (L1 1) (M 1) (R1 0) (R2 0)) // 11100{pid_track.err -4;}else if ((L2 0) (L1 0) (M 1) (R1 0) (R2 0)) // 00100{pid_track.err 0;}else if ((L2 0) (L1 0) (M 1) (R1 1) (R2 0)) // 00110{pid_track.err 1;}else if ((L2 0) (L1 0) (M 0) (R1 1) (R2 0)) // 00010{pid_track.err 1.5;}else if ((L2 0) (L1 0) (M 0) (R1 1) (R2 1)) // 00011{pid_track.err 2;}else if ((L2 0) (L1 0) (M 0) (R1 0) (R2 1)) // 00001{pid_track.err 3;}else if ((L2 0) (L1 0) (M 1) (R1 1) (R2 1)) // 00111{pid_track.err 4;}// 十字路口else if ((L2 0) (L1 0) (M 1) (R1 0) (R2 1)) // 00101{pid_track.err 4;}elsepid_track.err 0;pid_track.integral pid_track.err;pid_track.output pid_track.Kp * pid_track.err pid_track.Ki * pid_track.integral pid_track.Kd * (pid_track.err - pid_track.err_last);pid_track.err_last pid_track.err;return pid_track.output; }/*****************************************************END OF FILE*********************************************************/ 3、装载药品 是否装载药品采用红外对管来实现 这部分我也不多说了就是检测红外的高低电平分别对应药品的状态 4、识别数字 识别数字我们采用的是OpenMv4和OpenMv4Plus,病房前识别数字采用模板匹配小车行进时采用神经网络匹配数字效果很好 但是由于我不是负责这方面的所以只知道一个大概思路 5、LED指示 这个也没什么好说的到达相应的状态时点亮和熄灭LED就行了 6、双车通信 这里我们采用的方案有两种 蓝牙通信模块HC-05Zigbee通信模块 其实配置好了之后这两种使用都是一样的不同的方面就是Zigbee相较于蓝牙配置好配置一些更方便一些 就一般的通信来说蓝牙足够了 关于这方面的通信模块一般肯定不会只发一个数据这个时候就需要定义数据包协议以保证发方和收方接收的数据的准确性 我自己定义的数据包协议和OpenMv协议相同 数据包为 b3 b3 data1 data2 data3 5b 其中b3 b3为帧头5b为帧尾 下方是相关代码 /** Author: _oufen* Date: 2023-07-06 15:05:38* LastEditTime: 2023-07-07 16:55:46* Description:*/ #include usart3.hint Bluetooth_Receive_Buff[6]; // 蓝牙接收数据 int16_t data1; // 三个有效数据位 第一个为 模式选择 int16_t data2; // 第二个为 停车标志 int16_t data3; // 第三个为 主车走的圈数/*** brief 串口3初始化* param 无* retval 无*/ void uart3_init(u32 bound) {// GPIO端口设置GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能USART3GPIOB时钟// USART3_TX GPIOB2 RX PA2GPIO_InitStructure.GPIO_Pin GPIO_Pin_10; // PA2GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出GPIO_Init(GPIOB, GPIO_InitStructure); // 初始化GPIOB2// USART3_RX GPIOB3 TX PA3GPIO_InitStructure.GPIO_Pin GPIO_Pin_11; // PB11GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; // 浮空输入GPIO_Init(GPIOB, GPIO_InitStructure); // 初始化GPIOB3// USART3 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel USART3_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 3; // 抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority 3; // 子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; // IRQ通道使能NVIC_Init(NVIC_InitStructure); // 根据指定的参数初始化VIC寄存器// USART 初始化设置USART_InitStructure.USART_BaudRate bound; // 串口波特率USART_InitStructure.USART_WordLength USART_WordLength_8b; // 字长为8位数据格式USART_InitStructure.USART_StopBits USART_StopBits_1; // 一个停止位USART_InitStructure.USART_Parity USART_Parity_No; // 无奇偶校验位USART_InitStructure.USART_HardwareFlowControl USART_HardwareFlowControl_None; // 无硬件数据流控制USART_InitStructure.USART_Mode USART_Mode_Rx | USART_Mode_Tx; // 收发模式USART_Init(USART3, USART_InitStructure); // 初始化串口2USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); // 开启串口接受中断USART_Cmd(USART3, ENABLE); // 使能串口2 }/*** brief 串口3发送数据包* param 无* retval 无*/ void u3_sendData(u8 *str) {u8 i 0;for (i 0; i 2; i) // b3 b3{USART_SendData(USART3, 0xb3);while (USART_GetFlagStatus(USART3, USART_FLAG_TC) ! SET);}for (i 0; i 3; i) // 发送三位有效位{USART_SendData(USART3, str[i]);while (USART_GetFlagStatus(USART3, USART_FLAG_TC) ! SET);}USART_SendData(USART3, 0x5b); // 0x5bwhile (USART_GetFlagStatus(USART3, USART_FLAG_TC) ! SET); }void Bluetooth_Data(void) // 处理蓝牙接收的数据 {data1 Bluetooth_Receive_Buff[2];data2 Bluetooth_Receive_Buff[3];data3 Bluetooth_Receive_Buff[4]; }/*** brief 串口3接收数据包 解析接收数据包 解析数据包 b3 b3 data1 data2 data3 5b* param 无* retval 无*/ void Bluetooth_Receive_Data(int16_t data) {int i 0;static u8 state 0; // 初始化状态值if (state 0 data 0xb3) // 第一个帧头 0xb3{state 1;Bluetooth_Receive_Buff[0] data;}else if (state 1 data 0xb3) // 第二个帧头 0xb3{state 2;Bluetooth_Receive_Buff[1] data;}else if (state 2) // 第一个有效数据{state 3;Bluetooth_Receive_Buff[2] data;}else if (state 3) // 第二个有效数据{state 4;Bluetooth_Receive_Buff[3] data;}else if (state 4) // 第三个有效数据{state 5;Bluetooth_Receive_Buff[4] data;}else if (state 5) // 接收帧尾{if (data 0x5b) // 是帧尾 直接回到初始状态{state 0;Bluetooth_Receive_Buff[5] data;Bluetooth_Data(); // 处理数据}else if (data ! 0x5b) // 不是帧尾 所有数据置0{state 0;for (i 0; i 6; i){Bluetooth_Receive_Buff[i] 0;}}}else{state 0;for (i 0; i 6; i){Bluetooth_Receive_Buff[i] 0;}} }/*** brief 串口3接收中断* param 无* retval 无*/ void USART3_IRQHandler(void) // 串口2中断服务程序 {uint8_t ReceiveData;if (USART_GetITStatus(USART3, USART_IT_RXNE) ! RESET) // 接收中断(接收到的数据必须是0x0d 0x0a结尾){USART_ClearITPendingBit(USART3, USART_IT_RXNE); // 清除中断标志ReceiveData USART_ReceiveData(USART3); // 接收的数据Bluetooth_Receive_Data(ReceiveData);Bluetooth_Data();// USART_SendData(USART3, ReceiveData);// 测试收发数据// if (ReceiveData 58) // 当接收到0x3A后 接收数据灯亮 这个是基于最小系统板的测试程序// {// MY_GPIO_Init(GPIOC, GPIO_Pin_13, GPIO_Mode_Out_PP);// }} }/********************************* 测试蓝牙接收数据 ****************************************************/// 在主函数中显示 但是要先引入usart3头文件 注意要在主函数中初始化 连线连接无错误// 在上位机中以定义协议格式发送 b3 b3 01 02 03 5b// 接收数据在OLED上显示 如发送数据和接收数据相同 则表示接收协议无错误// 下一步就是接收蓝牙主机的数据// // 显示串口3接收数据 这是蓝牙从机 接收数据 // OLED_ShowNum(3, 8, data1, 2); // 有效数据1 // OLED_ShowNum(3, 11, data2, 2); // 有效数据2 // OLED_ShowNum(3, 14, data3, 2); // 有效数据3/*********************************** 结束 *************************************************************/ 7、转向方案 转向方案可有很多种了嘞 在经过实际测试后我总结出来了主要的三种转向方案 开环转向位置环速度环串级转向MPU6050转向 1、开环转向 就是电机IO分别给0、1然后给一个PWM,记录此时两轮的脉冲数相加的绝对值当超过设定的脉冲时就停止 这时设定的脉冲就可以是90°的脉冲和180度的脉冲这需要自己一步一步的测试 我经过测试发现可行并且还挺稳定的 下面给出相关代码 /*** brief 转向 开环转向* param 脉冲值方向(左1 右2 pwm* retval 无*/ void Car_turn(int pluse, int mode, int pwm) {while (1){if (mode 1) // 向左{Load_Motor_PWM(-pwm, pwm);}else if (mode 2) // 向右{Load_Motor_PWM(pwm, -pwm);}if (pathLenth pluse) // 达到预设角度{break;}}Load_Motor_PWM(0, 0); // 立马定住Motor_Left_DIR(STOP);Motor_Right_DIR(STOP); }void TIM6_IRQHandler(void) // 10ms {if (TIM_GetITStatus(TIM6, TIM_IT_Update) ! RESET){LED_RED !LED_RED; // 测试程序是否卡死TIM_ClearITPendingBit(TIM6, TIM_IT_Update);a -Read_Encoder(2);b Read_Encoder(3);pathLenth MyABS(a) MyABS(b); // 累积脉冲数// rpm 330脉冲// speed1 ((float)a * 60000.0) / 13200;// speed2 ((float)b * 60000.0) / 13200;} }可以看出当小车当前脉冲到达自己设置的脉冲时小车就停止这个时候小车差速即可到达期望角度 // Car_turn(2000, 1, 1000); // 开环转弯 左转90 // Car_turn(2000, 2, 1000); // 开环转弯 右转90 // Car_turn(4000, 1, 1000); // 掉头180 2、位置环速度环闭环串级转向 位置环为外环速度环为内环位置环的输出即是速度环的输入 这个时候小车旋转的角度就是以小车两轮为直径的圆的四分之一的距离这个距离如何计算呢 小车转一圈的脉冲我们知道假定1040个脉冲 那么当前行进的脉冲数/小车转一圈的脉冲数我们就是不是就知道了小车转了几圈然后把这个×小车转一圈的周长就知道了小车行进的距离 把小车行进距离转换为脉冲带入位置环得到输出后赋值给速度环即可使小车转90°的距离恒定掉头的距离也恒定转向就完成了 这部分代码有些多我在文末会贴出代码大家可以自行查看 3、MPU6050转向 通过yaw角的反馈来改变小车的旋转方向yaw角为90°时即转向90°yaw角为180°时即掉头 这个也是串起来的PID角度环的输出是速度环的输入 调节好PID参数后即可丝滑转向 /*** brief 角度环pid输出函数* param actual_val:实际值 6050yaw* note 无* retval 通过PID计算后的输出*/ float Angle_pid_realize(_pid *pid, float actual_val) {/* 计算偏差 这里的偏差是指 巡线偏差 设定的巡线期望值 和 MV传回的巡线实际值 得偏差 */pid-err pid-target_val - actual_val;if (pid-err 180) // 防止小车转到180度时一直旋转的问题pid-err pid-err - 360;if (pid-err -180)pid-err pid-err 360;pid-integral pid-err; // 误差累积// if (pid-err 1000) // 积分限幅// {// pid-err 0;// }// if (huidu.output 550)// huidu.output 550;// if (huidu.output -600)// huidu.output -600;/*PID算法实现*/pid-actual_val pid-Kp * pid-err pid-Ki * pid-integral pid-Kd * (pid-err - pid-err_last);/*误差传递*/pid-err_last pid-err;/*返回当前实际值*/return pid-actual_val; }/*** brief 角度环pid输出函数* param actual_val:无* note 无* retval 通过PID计算后的输出*/ float Angle_pid_control(void) {float Expect_Pwm 0.0; // 当前控制值// pid_speed1.actual_val ((float)Param.UnitTime_Motor1Pluse * 1000.0 * 60.0) / (RESOULTION_TOTAL_RATIO * REDUCTION_RATIO * PID_PERIOD);// Pid_speed2 ((float)Param.UnitTime_Motor2Pluse * 60000.0) / 17680;Pid_Actual_angle KLM(yaw); // 实际值 为yaw 滤波后的数据Expect_Pwm Angle_pid_realize(pid_angle, Pid_Actual_angle); // 进行 PID 计算// #if defined(PID_ASSISTANT_EN)// set_computer_value(SEND_FACT_CMD, CURVES_CH1, actual_speed, 1); // 给通道 1 发送实际值// #endifreturn Expect_Pwm; }二、调试经验分享 大家在实际做题的时候肯定会出现非常多的问题不要慌慢慢来分析造成这种问题的原因是什么从现象出发再回到代码 等调出想要的代码的实际效果时那一刻就会感觉之前的努力都值了 关于这道题主要调试的有以下几部分 1、循迹 这个循迹只要偏差值没错补偿值两轮一正一负后面就是调节PID的问题了 2、识别数字 这个也是关键如何准确识别数字然后小车根据MV发过来的数据进行运动 识别数字的准确率也要有相应的保证小车一切行进的基础都是在准确识别到数字的基础上的 3、转向 在调试的时候多次发现小车不能完全转向90度造成小车循迹出线压黑线等 这个时候要检查一下小车的硬件结构是否合理程序是不是哪个地方写错了等 4、双车通信 通信部分我建议的是首先在上位机上模拟OpenMv或者蓝牙主机发送定义的数据包协议将接收到的数据在OLED上进行显示如果接收到正确的数据即可证明通信无问题再去排除其他问题 5、逻辑处理 其实在掌握了以上知识点后我觉得逻辑还是很重要的由自己亲身经历过就是你知道如何实现单个功能但是融合起来后就完全不行了在比赛过程中是很浪费时间的会造成时间的大量浪费再加上身体的高强度运作和心态就悲剧了 千万要在平时加强对程序逻辑的判断和处理作者本人亲身经历不要学我 比如这道题目我首先是在OpenMv识别数字后放上药品才可以小车行进去指定的病房送药一二号病房没有太大难度写死即可后面的病房要根据OpenMv二次判断来进行更正进病房并要求返回药房。 这个逻辑就很重要识别到Mv就返回一个标志位左边为0x3A,右边即为0x3B等。发挥部分从车等待主车卸载药品后取药这个时候是主车卸载完药品后才给从车发行进标志从车才可以动防止撞车等 6、心态问题 不要被一种方案限制住了比赛吗有无限可能的发挥不同的思路和方法只要能实现就是好方法 我已经给大家以身试法过了这次参加的电赛由于没有车只能做E题赛前玩了玩二维云台追踪小球大部分心思还是压在了车上而这道题目比赛完后再次复盘回想起这道题是自己的思维局限把自己限定死了导致越调越不行前两天想着闭环跑可惜没有实现后面自己稀里糊涂的实现了闭环但是速度不可控还是会超出黑线误差很大导致每分自己也很急就这样第一次电赛也是最后一次就结束了 总归来说还是心态和实力想的太多每次力争最优解 电赛还是很考验人的虽说可能结果不会怎么样但是我觉得在准备电赛得过程中还是很棒得一起每天早起得队友大家互相配合完成题目得喜悦一起解决问题得思考还是很有意义的。 总结 希望大家吸取教训大家有什么不懂得问题也可以在评论区留言看到了得话就肯定会恢复给大家解答希望自己得绵薄之力可以帮助大家 大家一定要不断的加强训练对学习的东西进行一个总结和汇总加强控制题目的训练而不是仅仅做小车小车是一个载体其内部原理也是控制的精细程度 开源链接 我会在这两天将自己这个开源链接的代码进行一个讲解 我采用了不同的主控不同的巡线方案、大家可以自行访问进行下载 下方为gitee开源链接请大家点一个star谢谢 oufen / 2021年电赛F题-智能送药小车
http://www.zqtcl.cn/news/641133/

相关文章:

  • 网站反向绑定域名企业网站的建立网络虚拟社区时对于企业
  • 重庆大渡口网站建设解决方案梓潼 网站建设 有限公司
  • 高端平面网站东营住房和城乡建设厅网站
  • 品牌网站建设e小蝌蚪易时代网站
  • 做搜狗手机网站点击软网站建设有哪些种类
  • 想自学做网站太原要做网站的公司
  • 站内seo优化淘宝网站推广策划方案
  • 福建建设执业注册中心网站网址格式怎么写
  • 网站开发外包公司坑襄垣城乡建设管理局的网站
  • 网络公司怎么做网站常州新北区网站建设
  • 扬州专业外贸网站建设推广做详情页上什么网站找素材
  • 北京做网站设计招聘深圳市住房和建设局官网平台
  • 冻品网站建设网站头图设计
  • 手机网站分辨率做多大h5微网站建设多少钱
  • 网站制作软件下载公司怎么注册邮箱帐号
  • 做婚纱网站的图片园林设计
  • 濮阳公司建站淮北城市住建网
  • 建设银行网站打不开 显示停止工作专门做地图的网站
  • 有没有人一起做网站app网站建设方案
  • 洛阳网站建设兼职企业网站建设文案
  • 动漫制作贵州seo策略
  • asp网站建设项目实训该怎么跟程序员谈做网站
  • 网站软件资源iis不能新建网站
  • 网站设计的发展趋势西安市建设工程交易网
  • 做外贸收费的服装网站武钢建设公司网站
  • wordpress 全文搜索企业网站优化策略
  • 犀牛云做网站如何网站备案需要什么东西
  • wordpress星座网站建设与优化计入什么科莫
  • 外贸网站优化方案绵阳网站建设怎么做
  • 黑龙江省网站建设电商的运营推广