活动介绍

private Vector3 depth; private Vector3 offset; public float sudu = 0.001f; private void OnMouseDown() { depth = Camera.main.WorldToScreenPoint(transform.position); Vector3 mousePosition = Input.mousePosition; mousePosition = new Vector3(mousePosition.x, mousePosition.y, depth.z); offset = transform.position - Camera.main.ScreenToWorldPoint(mousePosition); } private void OnMouseDrag() { Vector3 mousePosition = Input.mousePosition; mousePosition = new Vector3(mousePosition.x, mousePosition.z, depth.y); transform.Rotate(-Vector3.forward * (Camera.main.ScreenToWorldPoint(mousePosition) + offset).x * sudu); }这个代码怎么加上限制旋转的范围

时间: 2024-02-14 12:06:44 浏览: 92
你可以在`OnMouseDrag()`函数中添加限制旋转的范围的代码。例如,你可以使用Quaternion来限制旋转的角度。在`OnMouseDrag()`函数中,你可以将旋转的角度保存在一个变量中,然后在限制范围时,通过Quaternion来限制旋转的角度。 以下是一个示例代码,可以让物体只能在y轴上旋转: ``` private Vector3 depth; private Vector3 offset; public float sudu = 0.001f; private float rotationY = 0f; public float minY = 0f; public float maxY = 360f; private void OnMouseDown() { depth = Camera.main.WorldToScreenPoint(transform.position); Vector3 mousePosition = Input.mousePosition; mousePosition = new Vector3(mousePosition.x, mousePosition.y, depth.z); offset = transform.position - Camera.main.ScreenToWorldPoint(mousePosition); } private void OnMouseDrag() { Vector3 mousePosition = Input.mousePosition; mousePosition = new Vector3(mousePosition.x, mousePosition.z, depth.y); float rotationX = -((Camera.main.ScreenToWorldPoint(mousePosition) + offset).x * sudu); rotationY += ((Camera.main.ScreenToWorldPoint(mousePosition) + offset).y * sudu); rotationY = Mathf.Clamp(rotationY, minY, maxY); transform.rotation = Quaternion.Euler(new Vector3(rotationY, rotationX, 0)); } ``` 在这个示例代码中,`rotationY`变量保存了物体在y轴上的旋转角度。在`OnMouseDrag()`函数中,我们通过修改`rotationX`和`rotationY`来计算旋转角度。同时,我们使用`Mathf.Clamp()`函数来限制`rotationY`的值在`minY`和`maxY`之间。最后,我们使用`Quaternion.Euler()`函数来将旋转角度转换为Quaternion,并将其应用于物体的旋转。
阅读全文

相关推荐

estore clump_sample ball property fric 0.5 [txx=-10e3] [tyy=-10e3] [sevro_factor=0.2] [do_xSevro=true] [do_ySevro=true] [sevro_freq=100] [timestepNow=global.step-1] def sevro_walls compute_stress if timestepNow<global.step then get_g(sevro_factor) timestepNow+=sevro_freq endif if do_xSevro=true then Xvel=gx*(wxss-txx) wall.vel.x(wpRight)=-Xvel; sudu wall.vel.x(wpLeft)=Xvel endif if do_ySevro=true then Yvel=gy*(wyss-tyy) wall.vel.y(wpUp)=-Yvel wall.vel.y(wpDown)=Yvel endif end def wp_ini wpDown=wall.find(1) wpRight=wall.find(2) wpUp=wall.find(3) wpLeft=wall.find(4) end @wp_ini def computer_chiCun wlx=wall.pos.x(wpRight)-wall.pos.x(wpLeft) wly=wall.pos.y(wpUp)-wall.pos.y(wpDown) end def compute_stress computer_chiCun wxss=-(wall.force.contact.x(wpRight)-wall.force.contact.x(wpLeft))*0.5/wly wyss=-(wall.force.contact.y(wpUp)-wall.force.contact.y(wpDown))*0.5/wlx end @compute_stress def get_g(fac) computer_chiCun gx=0 gy=0 zongKNX=100e6*10 zongKNY=100e6*10 loop foreach ct wall.contactmap(wpLeft) zongKNX+=contact.prop(ct,"kn") endloop loop foreach ct wall.contactmap(wpRight) zongKNX+=contact.prop(ct,"kn") endloop loop foreach ct wall.contactmap(wpUp) zongKNY+=contact.prop(ct,"kn") endloop loop foreach ct wall.contactmap(wpDown) zongKNY+=contact.prop(ct,"kn") endloop gx=fac*wly/(zongKNX*global.timestep) gy=fac*wlx/(zongKNY*global.timestep) end @compute_stress set fish callback -1.0 @sevro_walls history id 1 @wxss history id 2 @wyss cycle 1 set timestep fix 1e-6 solve time 1e-2 save yuya在PFC5.0颗粒流软件中,上述代码的含义

给出主函数的主要流程步骤:#include "system.h" #include "lcd12864_st7920.h" #include "delay.h" #include <stdio.h> #include "18b20.h" sbit buzzer = P1^3 ; sbit yeweiG =P1^0; sbit yeweiD =P1^1; unsigned char xdata dis0[16];//定义显示区域临时存储数组 unsigned char xdata dis1[16]; unsigned char xdata dis2[16]; unsigned char xdata dis3[16]; unsigned char i; unsigned char ReadTempFlag;//定义读时间标志 int temp1; //温度读取值 float temperature; unsigned long time_20ms=0; //定时器计数 float Sudu =0; //速度值 unsigned int PluNum = 0; //脉冲数 unsigned int disPlu = 0; //脉冲数 bit dealSuduFlag =0; //处理速度标志 float xdata juli=0; //距离 bit disFlag =0;//更新显示 unsigned char yeweiFlag = 'N';//液位标志 void main(void) { Init_Timer0(); //定时器0初始化 UART_Init(); DelayMs(200); //延时有助于稳定 Init_ST7920(); //初始化 ClrScreen(); buzzer =1; // sprintf(dis0,"20%02d-%02d-%02d ",(int)time_buf1[1],(int)time_buf1[2],(int)time_buf1[3],(int)time_buf1[7]);//年月日周 // LCD_PutString(0,1,dis0,16);//显示第时间 // // sprintf(dis0,"%02d:%02d:%02d ",(int)time_buf1[4],(int)time_buf1[5],(int)time_buf1[6]);//时分秒 // LCD_PutString(0,2,dis0,16);//显示第时间 // // LCD_PutString(0,3,"起:5元 3元/km ",16); //固定显示价格 // LCD_PutString(0,4,"实际价格",8); // uartSendStr("ready ok !",10); // Ds1302_Write_Time(); while(1) { if(dealSuduFlag == 1) { Sudu=(float)PluNum0.23.6/2; //m/s 20个脉冲为1圈 3s时间进行检测 disPlu = PluNum/2; //转速 PluNum=0; dealSuduFlag=0; juli = juli+Sudu0.2; //公里 } if(disFlag==1) //显示 { disFlag=0; //标志位清零 ReadTempFlag++; //读取温度计时 if(ReadTempFlag >= 3) { ReadTempFlag=0; temp1=ReadTemperature(); //读取温度 temperature=(float)temp10.0625; //温度值转换 } if((yeweiG == 0)&&(yeweiD == 0))//上下液位有水 { yeweiFlag = 'H'; } sprintf(dis0,"液位 %c ",yeweiFlag);//打印 LCD_PutString(0,1,dis0,16);//显示 sprintf(dis1,"温度 %4.1fC 40 ",temperature);//打印 LCD_PutString(0,2,dis1,16);//显示 if((Sudu>1.5)||(temperature>40)||(yeweiFlag=='L')) //异常情况 {buzzer = !buzzer;} } } }

/* * Copyright (c) 2021, Texas Instruments Incorporated * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "ti_msp_dl_config.h" #include "main.h" #include "stdio.h" #include "board.h" #include "bsp_gyro.h" #include "motor.h" #include "Uart.h" #include "No_Mcu_Ganv_Grayscale_Sensor_Config.h" #include "bsp_sr04.h" #include "math.h" // 用于fabs()函数 #include <stdlib.h> #define ZX_SUDU 50 extern volatile Encoder Encoder_A; extern volatile Encoder Encoder_B; extern short V_A,V_B; extern float distance ; extern uint8_t SR04_Flag ; unsigned short Anolog[8]={0}; unsigned short white[8]={3034,2157,3303,3278,3040,3243,3239,2340};//原1524,3247,3081,3236,3205,3102,2682,2927,现3139-3219-3104-3177-3184-3109-2832-2997.........再3085-3140-3067-3128-3096-3068-2984-2999.........3034-2157-3303-3278-3040-3243-3239-2340 unsigned short black[8]={497,136,762,577,337,711,500,278};//920-923-408-1184-785-349-111-323....原761,995,508,1102,675,502,244,323.....纯黑:666-806-238-542-356-208-138-185//1938-1365-738-1230-914-766-451-797//497-136-762-577-337-711-500-278 unsigned short Normal[8]; unsigned short d[8],w=0,c=0,c1=0,zt=0,zt1=0,zt2=0,zt3=0; short j=0; short b[4]; float weight[4]={0.4,0.3,0.2,0.1}; float a[8], max_abs; unsigned char rx_buff[256]={0}; /********************************************No_Mcu_Demo*******************************************/ /*****************芯片型号 MSPM0G3507 主频32Mhz ***************************************************/ /*****************引脚 AD0:PB17 AD1:PB18 AD2:PB19 ***************************************************/ /*****************OUT PA27*************************************************************************/ /********************************************No_Mcu_Demo*******************************************/ int16_t rxbuf = 0,rxbuf1=0,crxbuf=0, crxbuf1=0,cx0=0,cx = 0,cx1=0,cx2=0,cx3=0,dl=0,dr=0; int16_t baseSpeed = ZX_SUDU; int16_t SpeedL = 0, SpeedR = 0; float KP = 0.5; uint8_t oled_buffer[32]; int aim; int V1,V2; int V_L; int V_R; int output=0,output1,output2; char PWM_Value0[10],PWM_Value1[10],PWM_Value2[10],PWM_Value3[10],PWM_Value4[10],PWM_Value5[10],PWM_Value6[10]; float SetVoltage0; //定义设定值 int js=0; //初始化 No_MCU_Sensor sensor; unsigned char Digtal; //串口0发送单个字符 void uartxc_send_char(char ch); //串口0发送字符串 void uartxc_send_string(char* str); void Motor_Ctrl(void); //OLED显示各项参数 void SyncParamsToOLED(void); //获取传感器数值并处理 void SampleSensorData(void); //等待读取病房号 void AwaitWardID(void); //判断是否需要自选停车点 void CheckAutoParkingNeed(void); //正常循迹 void FollowLine(void); //遇弯道强制直行 void DisableCurveTurning(void); //启程遇弯道转弯并记住路线,到病房开始掉头 void FollowPathCurves(void); //返程 void ExecuteReturn(void); //结束转弯恢复循迹 void ResumeLineFollowing(void); int main(void) { SYSCFG_DL_init(); // SysTick_Init(); //清除串口中断标志 NVIC_ClearPendingIRQ(UART_K230_INST_INT_IRQN); //使能串口中断 NVIC_EnableIRQ(UART_K230_INST_INT_IRQN); //清除串口中断标志 NVIC_ClearPendingIRQ(UART_XC2_INST_INT_IRQN); //使能串口中断 NVIC_EnableIRQ(UART_XC2_INST_INT_IRQN); NVIC_ClearPendingIRQ(TIMER_2_INST_INT_IRQN); NVIC_EnableIRQ(TIMER_2_INST_INT_IRQN); // NVIC_ClearPendingIRQ(GPIOB_INT_IRQn); // NVIC_EnableIRQ(GPIOB_INT_IRQn);//开启按键引脚的GPIOB端口中断 uint8_t t=' '; Motor_Init(); OLED_Init(); // SR04_Init(); // jy61pInit(); // // lc_printf("\r\nJY61P 3D Attitude Measurement Sensor Start...\r\n"); //......................................................................感为灰度模块初始化 //初始化传感器,不带黑白值 No_MCU_Ganv_Sensor_Init_Frist(&sensor); No_Mcu_Ganv_Sensor_Task_Without_tick(&sensor); Get_Anolog_Value(&sensor,Anolog); //此时打印的ADC的值,可用通过这个ADC作为黑白值的校准 //也可以自己写按键逻辑完成一键校准功能 sprintf((char *)rx_buff,"Anolog %d-%d-%d-%d-%d-%d-%d-%d\r\n",Anolog[0],Anolog[1],Anolog[2],Anolog[3],Anolog[4],Anolog[5],Anolog[6],Anolog[7]); uart0_send_string((char *)rx_buff); // uart0_send_string((char *)rx_buff); // delay_cycles(CPUCLK_FREQ/10); memset(rx_buff,0,256); //得到黑白校准值之后,初始化传感器 No_MCU_Ganv_Sensor_Init(&sensor,white,black); // delay_cycles(CPUCLK_FREQ/10); while (1) { // Motor_On(); // DL_TimerA_setCaptureCompareValue(PWM_MOTOR_INST, 0, DL_TIMER_CC_0_INDEX); // DL_TimerA_setCaptureCompareValue(PWM_MOTOR_INST, 0, DL_TIMER_CC_1_INDEX); // uartxc_send_string("!2@"); // delay_cycles(CPUCLK_FREQ); //OLED显示各项参数 SyncParamsToOLED(); //获取传感器数值并处理 SampleSensorData(); //等待读取病房号 AwaitWardID(); //判断是否需要自选停车点 CheckAutoParkingNeed(); //正常循迹 FollowLine(); //遇弯道强制直行 DisableCurveTurning(); //启程遇弯道转弯并记住路线,到病房开始掉头 FollowPathCurves(); //返程 ExecuteReturn(); //结束转弯恢复循迹 ResumeLineFollowing(); // //.......................................................................JY901模块 // Gyro_Struct *JY61P_Data = get_angle(); // lc_printf("\n"); // lc_printf("JY61P RollX = [ %d ]\r\n",(int)JY61P_Data->x); // lc_printf("JY61P PitchY = [ %d ]\r\n",(int)JY61P_Data->y); // lc_printf("JY61P YawZ = [ %d ]\r\n",(int)JY61P_Data->z); // delay_ms(100); // // ..........................................................................................灰度模拟量与模拟量归一化处理应用 // sprintf((char *)rx_buff,"Digtal %d-%d-%d-%d-%d-%d-%d-%d\r\n",d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7]); // uart0_send_string((char *)rx_buff); // memset(rx_buff,0,256); // //获取传感器模拟量结果(有黑白值初始化后返回1 没有返回 0) // if(Get_Anolog_Value(&sensor,Anolog)){ // sprintf((char *)rx_buff,"Anolog %d-%d-%d-%d-%d-%d-%d-%d\r\n",Anolog[0],Anolog[1],Anolog[2],Anolog[3],Anolog[4],Anolog[5],Anolog[6],Anolog[7]); // uart0_send_string((char *)rx_buff); // memset(rx_buff,0,256); // } // //获取传感器归一化结果(只有当有黑白值传入进去了之后才会有这个值!!有黑白值初始化后返回1 没有返回 0) // if(Get_Normalize_For_User(&sensor,Normal)){ // sprintf((char *)rx_buff,"Normalize %d-%d-%d-%d-%d-%d-%d-%d\r\n",Normal[0],Normal[1],Normal[2],Normal[3],Normal[4],Normal[5],Normal[6],Normal[7]); // uart0_send_string((char *)rx_buff); // memset(rx_buff,0,256); // } //经典版理论性能1khz,只需要delay1ms,青春版100hz,需要delay10ms,否则不能正常使用 // delay_cycles(CPUCLK_FREQ/10); // // //........................................................................................................SR04模块 // // uint32_t Value = (int)SR04_GetLength(); // // lc_printf("Distance = %dCM\r\n", Value); // // delay_ms(500); // ...................................................使用串口调试参数 // sprintf((char *)rx_buff,"cx2 %d\r\n",cx2); // uart0_send_string((char *)rx_buff); // memset(rx_buff,0,256); // sprintf((char *)rx_buff,"cx3 %d\r\n",cx3); // uart0_send_string((char *)rx_buff); // memset(rx_buff,0,256); } } void GROUP1_IRQHandler(void)//Group1的中断服务函数 { uint32_t gpio_interrup = 0; //读取Group1的中断寄存器并清除中断标志位 switch( DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1) ) { //检查GPIO端口中断,注意是INT_IIDX case DL_INTERRUPT_GROUP1_IIDX_GPIOB: //获取中断信号 gpio_interrup = DL_GPIO_getEnabledInterruptStatus(ENCODER_PORT,ENCODER_E1A_PIN|ENCODER_E1B_PIN|ENCODER_E2A_PIN|ENCODER_E2B_PIN); // encoderA if((gpio_interrup & ENCODER_E1A_PIN)==ENCODER_E1A_PIN) { if(!DL_GPIO_readPins(ENCODER_PORT,ENCODER_E1B_PIN)) { Encoder_A.Should_Get_Encoder_Count--; } else { Encoder_A.Should_Get_Encoder_Count++; } } else if((gpio_interrup & ENCODER_E1B_PIN)==ENCODER_E1B_PIN) { if(!DL_GPIO_readPins(ENCODER_PORT,ENCODER_E1A_PIN)) { Encoder_A.Should_Get_Encoder_Count++; } else { Encoder_A.Should_Get_Encoder_Count--; } } // encoderB if((gpio_interrup & ENCODER_E2A_PIN)==ENCODER_E2A_PIN) { if(!DL_GPIO_readPins(ENCODER_PORT,ENCODER_E2B_PIN)) { Encoder_B.Should_Get_Encoder_Count--; } else { Encoder_B.Should_Get_Encoder_Count++; } } else if((gpio_interrup & ENCODER_E2B_PIN)==ENCODER_E2B_PIN) { if(!DL_GPIO_readPins(ENCODER_PORT,ENCODER_E2A_PIN)) { Encoder_B.Should_Get_Encoder_Count++; } else { Encoder_B.Should_Get_Encoder_Count--; } } DL_GPIO_clearInterruptStatus(ENCODER_PORT,ENCODER_E1A_PIN|ENCODER_E1B_PIN|ENCODER_E2A_PIN|ENCODER_E2B_PIN); break; // //检查GPIO端口中断,注意是INT_IIDX // case SR04_INT_IIDX: // if( SR04_ECHO() ) // 上升沿 // { // SR04_Flag = 0; // distance = 0.0; // Open_Timer(); //打开定时器 // } // else // 下降沿 // { // NVIC_DisableIRQ(SR04_INT_IRQN); // 关闭按键引脚的GPIO端口中断 // Close_Timer(); // 关闭定时器 // SR04_Flag = 1; // distance = (float)Get_TIMER_Count() / 58.0f; // 获取时间,分辨率为1us // } // break; } } void TIMER_0_INST_IRQHandler(void) { //编码器速度计算 if( DL_TimerA_getPendingInterrupt(TIMER_0_INST) == DL_TIMER_IIDX_ZERO ) { // lc_printf("[ %d ] | [ %d ]\r\n",Motor_Get_Encoder(0),Motor_Get_Encoder(1)); // Gyro_Struct *JY61P_Data = get_angle(); GetMotorPulse(); if( DL_GPIO_readPins(KEY_PORT, KEY_PIN_21_PIN) ==0 ) { if(DL_GPIO_readPins(KEY_PORT, KEY_PIN_21_PIN) ==0) { if(zt1==2)zt1=0; } } if(zt1==1) { if(js>=150)zt1=0; } if(zt1==3) { if(js>=1900) { zt1=0; } } // if(zt1==2) // { // if(js>=1000) // { // zt1=0; // } // } if(((zt1==0)||(zt1==3))&&((cx>=1)&&(cx<=8))) { output1 = PID_A(baseSpeed+output); output2 = PID_B(baseSpeed-output); left( output1 ); right( output2 ); } // Motor_Off(); } } void TIMER_2_INST_IRQHandler() { if( DL_TimerA_getPendingInterrupt(TIMER_2_INST) == DL_TIMER_IIDX_ZERO ) { js++; } } void UART_K230_INST_IRQHandler(void) { uint8_t gData; switch (DL_UART_Main_getPendingInterrupt(UART_K230_INST)) { case DL_UART_MAIN_IIDX_RX: gData = DL_UART_Main_receiveData(UART_K230_INST); if(gData == '#') rxbuf = 0; else if(gData == '$') { cx = rxbuf; cx0=cx; } else rxbuf =(gData - '0'); if(gData == '&') rxbuf1 = 0; else if(gData == '*') { cx1 = rxbuf1; } else rxbuf1 =(gData - '0'); break; default: break; } } void UART_XC2_INST_IRQHandler(void) { uint8_t gData; switch (DL_UART_Main_getPendingInterrupt(UART_XC2_INST)) { case DL_UART_MAIN_IIDX_RX: gData = DL_UART_Main_receiveData(UART_XC2_INST); if(gData == '!') crxbuf = 0; else if(gData == '@') { cx2 = crxbuf; } else crxbuf =(gData - '0'); if(gData == '%') crxbuf1 = 0; else if(gData == '^') { cx3 = crxbuf1; } else crxbuf1 =(gData - '0'); break; default: break; } } //OLED显示各项参数 void SyncParamsToOLED(void) { sprintf(PWM_Value0,"CX:%d",cx); OLED_ShowString(0,0,(uint8_t *)PWM_Value0,8); sprintf(PWM_Value1,"ZT2:%d",zt2); OLED_ShowString(0,1,(uint8_t *)PWM_Value1,16); sprintf(PWM_Value2,"CX1:%d",cx1); OLED_ShowString(0,3,(uint8_t *)PWM_Value2,8); sprintf(PWM_Value3,"ZT1:%d",zt1); OLED_ShowString(0,4,(uint8_t *)PWM_Value3,8); sprintf(PWM_Value4,"C:%d",c); OLED_ShowString(0,5,(uint8_t *)PWM_Value4,8); sprintf(PWM_Value5,"zt:%d",zt); OLED_ShowString(0,6,(uint8_t *)PWM_Value5,8); sprintf(PWM_Value6,"C1:%d",c1); OLED_ShowString(0,7,(uint8_t *)PWM_Value6,8); } //zt:是否转弯,=3时左转,=4时右转,=0时巡线,=1时转头;zt1:=1时是否延迟转弯,=3是否转弯延时,=2时是否停车等待1秒钟;zt2:是否进入返程模式,=1为返程,=0为启程;zt3:去远端病房是否进入二次转弯;w:灰度是否全是识别到红色(转弯处),=1为是;c:灰度是否全识别到白色(药房),=0为是;c1:灰度检测到红色的数量;js:定时器计时代替延时函数使用的计时变量单位1ms。cx:送药前识别到需要去的病房号;cx1:送药中识别到的病房号;cx:需要去的病房;cx0:再次储存需要去的病房号;cx1:在路途中识别到的病房号;cx2:自选的停车点;cx3:从自选停车点到病房需要的操作指示:=1开始回头,遇线等待,且反转返程路线,=2退出等待且重置zt2为启程模式使其去到下一个病房。 //获取传感器数值并处理 void SampleSensorData(void) { //......................................................................感为灰度模块 //无时基传感器常规任务,包含模拟量,数字量,归一化量 No_Mcu_Ganv_Sensor_Task_Without_tick(&sensor); //获取传感器数字量结果(只有当有黑白值传入进去了之后才会有这个值!!) Digtal=Get_Digtal_For_User(&sensor); // sprintf((char *)rx_buff,"Digtal %d-%d-%d-%d-%d-%d-%d-%d\r\n",(Digtal>>0)&0x01,(Digtal>>1)&0x01,(Digtal>>2)&0x01,(Digtal>>3)&0x01,(Digtal>>4)&0x01,(Digtal>>5)&0x01,(Digtal>>6)&0x01,(Digtal>>7)&0x01); // uart0_send_string((char *)rx_buff); // memset(rx_buff,0,256); //处理数据 for(int i=0;i<8;i++) { d[i]=(Digtal>>i)&0x01; } w=d[0]&d[1]&d[2]&d[3]&d[4]&d[5]&d[6]&d[7]; c=d[0]|d[1]|d[2]|d[3]|d[4]|d[5]|d[6]|d[7]; c1=d[0]+d[1]+d[2]+d[3]+d[4]+d[5]+d[6]+d[7]; } //等待读取病房号 void AwaitWardID(void) { while(!((cx>=1)&&(cx<=8))) { Motor_Off(); } } //判断是否需要自选停车点 void CheckAutoParkingNeed(void) { if(cx2!=0) { cx=cx2; } } //正常循迹 void FollowLine(void) { if((zt==0)&&(zt1!=3)) { if(d[3])output=0; if(d[2])output=-15; if(d[1])output=-20; if(d[0])output=-35; if(d[4])output=0; if(d[5])output=15; if(d[6])output=20; if(d[7])output=35; } } //遇弯道强制直行 /** * @brief Disable curve turning (禁用弯道转向) * @note Maintains current heading (保持当前航向) */ void DisableCurveTurning(void) { if(zt2==0) { if((cx1==0)&&(cx!=1)&&(cx!=2)) { if(c1>=4) output=0; } } if(zt2==1) { if(j<=0) { if(!c) { zt1=2; // js=0; uartxc_send_string("%2^"); while(zt1==2) { Motor_Off(); } } if(c1>=4) { output=0; } } } } //启程遇弯道转弯并记住路线,到病房开始掉头 void FollowPathCurves(void) { if(zt2==0) { if(zt==0) { if(c1>=5) { if(cx==1) { zt1=1; js=0; output=-20; baseSpeed=0; zt=3; } if(cx==2) { zt1=1; js=0; output=20; baseSpeed=0; zt=4; } if(cx==cx1) { if((cx==8)&&(zt3==1)) { cx=7; } else if((cx==5)&&(zt3==1)) { cx=6; } if(cx%2==0) { zt1=1; js=0; output=20; baseSpeed=0; zt=4; zt3=1; } if(cx%2!=0) { zt1=1; js=0; output=-20; baseSpeed=0; zt=3; zt3=1; } } } if(!c) { if(cx2!=0) { DL_GPIO_setPins(GPIOB, DL_GPIO_PIN_22); cx2=0; cx=cx0; } zt=1; zt1=2; // js=0; uartxc_send_string("!2@"); while(zt1==2) { Motor_Off(); if(cx3==1) { zt1=0; DL_GPIO_clearPins(GPIOB, DL_GPIO_PIN_22); } } uartxc_send_string("%1^"); output=-30; baseSpeed=0; zt1=3; js=0; } } } } //返程 /** * @brief Execute return journey (执行返程) * @note Follows pre-recorded path in reverse (沿预存路径反向行驶) */ void ExecuteReturn(void) { if((zt2==1)&&(zt1!=3)) { if(c1>=4) { if(j>0) { output=b[j-1]*20; baseSpeed=0; if(output>0) { zt=4; zt1=1; js=0; } if(output<0) { zt=3; zt1=1; js=0; } } } } } //结束转弯恢复循迹 /** * @brief Resume line following (恢复正常循迹) * @note Switches from turn mode to straight tracking (从转弯模式切换为直线跟踪) */ void ResumeLineFollowing(void) { if(zt==3) { if(((d[0]==1))&&(c1==1)) { zt=0; baseSpeed=ZX_SUDU; if(zt2==0) { b[j]=1; j++; } if(zt2==1) { j--; } if(cx3==2) { zt2=0; cx3=0; } } } else if(zt==4) { if(((d[7]==1))&&(c1==1)) { zt=0; baseSpeed=ZX_SUDU; if(zt2==0) { b[j]=-1; j++; } if(zt2==1) { j--; } if(cx3==2) { zt2=0; cx3=0; } } } else if(zt==1) { if((c)&&(c1==1)&&(zt1!=3)) { if(cx3==1) { b[j-1]=-b[j-1]; } while(cx3==1) { Motor_Off(); } baseSpeed=ZX_SUDU; zt=0; zt2=1; } } } //串口发送单个字符 void uartxc_send_char(char ch) { //当串口0忙的时候等待,不忙的时候再发送传进来的字符 while( DL_UART_isBusy(UART_XC2_INST) == true ); //发送单个字符 DL_UART_Main_transmitData(UART_XC2_INST, ch); } //串口发送字符串 void uartxc_send_string(char* str) { //当前字符串地址不在结尾 并且 字符串首地址不为空 while(*str!=0&&str!=0) { //发送字符串首地址中的字符,并且在发送完成之后首地址自增 uartxc_send_char(*str++); } } // void Motor_Ctrl(void) // { // SpeedL = baseSpeed + cx*KP;//.....................................改 // SpeedR = baseSpeed - cx*KP;// // if(SpeedL > 40) // SpeedL = 40; // else if(SpeedL < 0) // SpeedL = 0; // if(SpeedR > 40) // SpeedR = 40; // else if(SpeedR < 0) // SpeedR = 0; // Set_Speed(0, SpeedL); // Set_Speed(1, SpeedR); // } 分析代码

最新推荐

recommend-type

双向CLLLC谐振闭环仿真设计与软开关技术实现:高压侧与低压侧波形优化及软开关性能研究 · 谐振波形优化

内容概要:本文介绍了双向CLLLC谐振技术及其在电力电子领域的应用,重点讨论了软开关和谐振波形的优化设计。文中首先简述了CLLLC谐振技术的基本原理,然后详细描述了在一个仿真环境下构建的双向CLLLC谐振系统,该系统能够在广泛的电压范围内(高压侧380-430V,低压侧40-54V)实现过谐振、欠谐振及满载轻载情况下的软开关。此外,文章展示了理想的谐振波形,并强调了软开关对减少开关损耗和电磁干扰的重要性。最后,文章提到可以通过参考相关文献深入了解系统的电路设计、控制策略和参数优化。 适合人群:从事电力电子设计的研究人员和技术工程师。 使用场景及目标:适用于需要理解和掌握双向CLLLC谐振技术及其仿真设计的专业人士,旨在帮助他们提升电源转换和能量回收系统的性能。 其他说明:文中提供的代码片段和图示均为假设的仿真环境,实际应用时需根据具体情况调整。建议参考相关文献获取更详尽的设计细节。
recommend-type

操作系统原理-PPT(1).ppt

操作系统原理-PPT(1).ppt
recommend-type

计算机网络期末考试试卷B-及答案试卷教案(1).doc

计算机网络期末考试试卷B-及答案试卷教案(1).doc
recommend-type

基于STM32的USB简易鼠标[最终版](1).pdf

基于STM32的USB简易鼠标[最终版](1).pdf
recommend-type

精选Java案例开发技巧集锦

从提供的文件信息中,我们可以看出,这是一份关于Java案例开发的集合。虽然没有具体的文件名称列表内容,但根据标题和描述,我们可以推断出这是一份包含了多个Java编程案例的开发集锦。下面我将详细说明与Java案例开发相关的一些知识点。 首先,Java案例开发涉及的知识点相当广泛,它不仅包括了Java语言的基础知识,还包括了面向对象编程思想、数据结构、算法、软件工程原理、设计模式以及特定的开发工具和环境等。 ### Java基础知识 - **Java语言特性**:Java是一种面向对象、解释执行、健壮性、安全性、平台无关性的高级编程语言。 - **数据类型**:Java中的数据类型包括基本数据类型(int、short、long、byte、float、double、boolean、char)和引用数据类型(类、接口、数组)。 - **控制结构**:包括if、else、switch、for、while、do-while等条件和循环控制结构。 - **数组和字符串**:Java数组的定义、初始化和多维数组的使用;字符串的创建、处理和String类的常用方法。 - **异常处理**:try、catch、finally以及throw和throws的使用,用以处理程序中的异常情况。 - **类和对象**:类的定义、对象的创建和使用,以及对象之间的交互。 - **继承和多态**:通过extends关键字实现类的继承,以及通过抽象类和接口实现多态。 ### 面向对象编程 - **封装、继承、多态**:是面向对象编程(OOP)的三大特征,也是Java编程中实现代码复用和模块化的主要手段。 - **抽象类和接口**:抽象类和接口的定义和使用,以及它们在实现多态中的不同应用场景。 ### Java高级特性 - **集合框架**:List、Set、Map等集合类的使用,以及迭代器和比较器的使用。 - **泛型编程**:泛型类、接口和方法的定义和使用,以及类型擦除和通配符的应用。 - **多线程和并发**:创建和管理线程的方法,synchronized和volatile关键字的使用,以及并发包中的类如Executor和ConcurrentMap的应用。 - **I/O流**:文件I/O、字节流、字符流、缓冲流、对象序列化的使用和原理。 - **网络编程**:基于Socket编程,使用java.net包下的类进行网络通信。 - **Java内存模型**:理解堆、栈、方法区等内存区域的作用以及垃圾回收机制。 ### Java开发工具和环境 - **集成开发环境(IDE)**:如Eclipse、IntelliJ IDEA等,它们提供了代码编辑、编译、调试等功能。 - **构建工具**:如Maven和Gradle,它们用于项目构建、依赖管理以及自动化构建过程。 - **版本控制工具**:如Git和SVN,用于代码的版本控制和团队协作。 ### 设计模式和软件工程原理 - **设计模式**:如单例、工厂、策略、观察者、装饰者等设计模式,在Java开发中如何应用这些模式来提高代码的可维护性和可扩展性。 - **软件工程原理**:包括软件开发流程、项目管理、代码审查、单元测试等。 ### 实际案例开发 - **项目结构和构建**:了解如何组织Java项目文件,合理使用包和模块化结构。 - **需求分析和设计**:明确项目需求,进行系统设计,如数据库设计、系统架构设计等。 - **代码编写和实现**:根据设计编写符合要求的代码,实现系统的各个模块功能。 - **测试和维护**:进行单元测试、集成测试,确保代码质量,对项目进行维护和升级。 ### 其他相关知识点 - **Java虚拟机(JVM)**:了解JVM的基本工作原理,包括类加载机制、内存管理、垃圾回收算法等。 - **常用Java框架**:比如Spring、Hibernate、MyBatis等,在实际开发中常常与Java基础结合使用,提高开发效率。 以上知识点可以作为学习Java案例开发的基础框架。在实际的开发实践中,开发者需要结合具体的项目需求,对这些知识点进行灵活运用。通过反复的案例实践,可以加深对Java编程的理解,并逐步提升开发技能。这份集锦可能包含的案例可能涉及上述知识点的具体应用,能够帮助学习者更好地理解理论与实践的结合,从而快速提升个人的Java开发能力。
recommend-type

【VASP报错深度解析】:5大技巧识别并永久解决离子距离太近警告

# 1. VASP软件简介及离子距离太近问题概述 ## 1.1 VASP软件简介 **VASP(Vienna Ab initio Simulation Package)** 是一款广泛应用于计算材料科学的软件,它基于密度泛函理论(DFT)计算固体、表面和分子的电子结构和性质。
recommend-type

npm error A complete log of this run can be found in: D:\Program Files\nodejs\node_cache\_logs\2025-04-20T15_11_51_454Z-debug-0.log

<think>好的,我需要帮助用户找到npm的错误调试日志位置,并解决他们遇到的npm错误。首先,用户已经提供了一个具体的日志路径:'D:\Program Files\nodejs\node_cache\_logs\2025-04-20T15_11_51_454Z-debug-0.log',但看起来这个路径可能有问题,因为日期是2025年,这可能是一个示例或输入错误。我需要确认正确的日志路径生成方式。 根据npm的默认配置,日志文件通常位于npm的缓存目录下的_logs文件夹中。默认情况下,Windows系统中npm的缓存路径是%AppData%\npm-cache,而日志文件会以当前日期和
recommend-type

深入理解内存技术文档详解

由于文件内容无法查看,仅能根据文件的标题、描述、标签以及文件名称列表来构建相关知识点。以下是对“内存详解”这一主题的详细知识点梳理。 内存,作为计算机硬件的重要组成部分,负责临时存放CPU处理的数据和指令。理解内存的工作原理、类型、性能参数等对优化计算机系统性能至关重要。本知识点将从以下几个方面来详细介绍内存: 1. 内存基础概念 内存(Random Access Memory,RAM)是易失性存储器,这意味着一旦断电,存储在其中的数据将会丢失。内存允许计算机临时存储正在执行的程序和数据,以便CPU可以快速访问这些信息。 2. 内存类型 - 动态随机存取存储器(DRAM):目前最常见的RAM类型,用于大多数个人电脑和服务器。 - 静态随机存取存储器(SRAM):速度较快,通常用作CPU缓存。 - 同步动态随机存取存储器(SDRAM):在时钟信号的同步下工作的DRAM。 - 双倍数据速率同步动态随机存取存储器(DDR SDRAM):在时钟周期的上升沿和下降沿传输数据,大幅提升了内存的传输速率。 3. 内存组成结构 - 存储单元:由存储位构成的最小数据存储单位。 - 地址总线:用于选择内存中的存储单元。 - 数据总线:用于传输数据。 - 控制总线:用于传输控制信号。 4. 内存性能参数 - 存储容量:通常用MB(兆字节)或GB(吉字节)表示,指的是内存能够存储多少数据。 - 内存时序:指的是内存从接受到请求到开始读取数据之间的时间间隔。 - 内存频率:通常以MHz或GHz为单位,是内存传输数据的速度。 - 内存带宽:数据传输速率,通常以字节/秒为单位,直接关联到内存频率和数据位宽。 5. 内存工作原理 内存基于电容器和晶体管的工作原理,电容器存储电荷来表示1或0的状态,晶体管则用于读取或写入数据。为了保持数据不丢失,动态内存需要定期刷新。 6. 内存插槽与安装 - 计算机主板上有专用的内存插槽,常见的有DDR2、DDR3、DDR4和DDR5等不同类型。 - 安装内存时需确保兼容性,并按照正确的方向插入内存条,避免物理损坏。 7. 内存测试与优化 - 测试:可以使用如MemTest86等工具测试内存的稳定性和故障。 - 优化:通过超频来提高内存频率,但必须确保稳定性,否则会导致数据损坏或系统崩溃。 8. 内存兼容性问题 不同内存条可能由于制造商、工作频率、时序、电压等参数的不匹配而产生兼容性问题。在升级或更换内存时,必须检查其与主板和现有系统的兼容性。 9. 内存条的常见品牌与型号 诸如金士顿(Kingston)、海盗船(Corsair)、三星(Samsung)和芝奇(G.Skill)等知名品牌提供多种型号的内存条,针对不同需求的用户。 由于“内存详解.doc”是文件标题指定的文件内容,我们可以预期在该文档中将详细涵盖以上知识点,并有可能包含更多的实践案例、故障排查方法以及内存技术的最新发展等高级内容。在实际工作中,理解并应用这些内存相关的知识点对于提高计算机性能、解决计算机故障有着不可估量的价值。
recommend-type

【机械特性分析进阶秘籍】:频域与时域对比的全面研究

# 1. 机械特性分析的频域与时域概述 ## 1.1 频域与时域分析的基本概念 机械特性分析是通
recommend-type

dslicsrv安装报错Too many errors

<think>好的,用户遇到了安装dslicsrv时出现“Too many errors”的问题,需要帮助解决。首先,我需要明确dslicsrv是什么。可能是指某个特定的软件服务,但根据常见软件库和搜索引擎的信息,没有直接对应的结果。可能是拼写错误,或者是某个特定领域的专有软件?比如,可能与Dell的某个服务有关?例如,Dell System License Manager Service(dsLicSvc)可能更接近。假设用户可能拼写错误,将dslicsrv理解为dsLicSvc,即Dell的系统许可证管理服务。 接下来,用户遇到的错误是安装时出现“Too many errors”,这通常