找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 5491|回复: 2

请教一下robotC小车寻线

[复制链接]
发表于 2014-5-23 19:25:56 | 显示全部楼层 |阅读模式
小弟初学robotc 想做一个寻线加避障的小车,可是写出来的代码有问题
  1.   #pragma config(Sensor, S4,     sonarSensor,         sensorSONAR)
  2. #pragma config(Sensor, S1,lightSensor,sensorLightActive)
  3. #pragma config(Sensor, S2,lightSensor,sensorLightActive)
  4. #pragma platform(NXT)          //智能在NXT中使用


  5. #define Kproportional 2         // Kp, 比例因子
  6. #define Kintegral 0.001          // Ki,积分因子
  7. #define Kderivative 10            // Kd,微分因子
  8. #define dt 1                   // 取样时间
  9. task main()
  10. {
  11.         for(;;){
  12.    do
  13.     {
  14.       motor[motorA]=100;
  15.         motor[motorC]=100;
  16.         
  17.   }
  18.     while(SensorValue(sonarSensor)>8);
  19.     motor[motorB]=0;
  20.     motor[motorC]=0;
  21.     wait1Msec(1000);
  22.    
  23.     nMotorEncoderTarget[motorA] = 150;
  24. motor[motorA] = -20;
  25. wait1Msec(800);
  26. motor[motorA]=0;
  27. wait1Msec(1000);
  28. nMotorEncoder[motorB] = 0;               
  29. nMotorEncoder[motorC] = 0;  
  30. // reset the Motor Encoder of Motor C
  31. nMotorEncoderTarget[motorB] = 300;        // set the  target for Motor Encoder of Motor B to 360
  32. nMotorEncoderTarget[motorC] = -300;        // set the  target for Motor Encoder of Motor C to 360
  33. motor[motorB] = 70;                       // motor B is run at a power level of 75
  34. motor[motorC] = -70;  
  35. // motor C is run at a power level of 75
  36.        
  37. while(nMotorRunState[motorB] != runStateIdle && nMotorRunState[motorC] != runStateIdle)
  38. wait1Msec(1000);
  39. {
  40.        
  41. motor[motorA]=25;
  42. wait1Msec(800);
  43. motor[motorB] = -50;                       // motor B is run at a power level of 75
  44. motor[motorC] = 50;
  45. wait1Msec(700);
  46. }
  47. }
  48. }
复制代码


这个代码能很好的执行,小车检测到前面的障碍物就把它放到旁边
但是下面这个代码加上寻线之后

  1. #pragma config(Sensor, S4,     sonarSensor,         sensorSONAR)
  2. #pragma config(Sensor, S1,lightSensor,sensorLightActive)
  3. #pragma config(Sensor, S2,lightSensor,sensorLightActive)
  4. #pragma platform(NXT)          //智能在NXT中使用


  5. #define Kproportional 2         // Kp, 比例因子
  6. #define Kintegral 0.001          // Ki,积分因子
  7. #define Kderivative 10            // Kd,微分因子
  8. #define dt 1                   // 取样时间
  9. task main()
  10. {
  11.         for(;;){
  12.    do
  13.     {
  14.     int error = 0;
  15.     float previous_error = 0;
  16.     float setpoint = 0;
  17.     float actual_position = 0;
  18.     float proportional = 0;
  19.     int integral = 0;
  20.     float derivative = 0;
  21.     float output = 0;
  22.     float left = 0;
  23.     float right = 0;

  24.     // 设定马达初始速度
  25.     float speed=35;

  26.     // 开传感器
  27.     //SetSensorColorFull(IN_3);

  28.     // 设定初始值。
  29.     setpoint=50;
  30.     nxtDisplayTextLine(1,"setpoint= %d",setpoint);
  31.     wait1Msec(20);

  32.     // 循环
  33.     while (true)
  34.     {
  35.         // 读取传感器当前值
  36.         actual_position = SensorValue[lightSensor];
  37.         nxtDisplayTextLine(3,"ac_pos= %d",actual_position);

  38.         // 计算误差
  39.         error = setpoint - actual_position;
  40.         // 偏离航线... 发出声音示警
  41.         //if (error <> 0) PlayTone(TONE_B7, 1);

  42.         // 比例部分: 当前误差 x 比例因子
  43.         proportional = Kproportional * error;

  44.         // 积分: 误差累积
  45.         integral = integral + error;

  46.         // 微分: 误差变化率
  47.         derivative = (error - previous_error) / dt;

  48.         // 比例、积分、微分三部分加总
  49.         output = proportional + Kintegral * dt * integral + Kderivative * derivative;

  50.         // 保存当前误差,留作下次计算时的前次误差
  51.         previous_error = error;

  52.         // 控制左侧马达
  53.         left = speed - output;

  54.         // 控制右侧马达
  55.         right = speed + output;

  56.         // 判断是否越界
  57.         if (left >   100) left  =  100;
  58.         if (left <  -100) left  = -100;
  59.         if (right >  100) right =  100;
  60.         if (right < -100) right = -100;

  61.         motor[motorB]=left;
  62.         motor[motorC]=right;
  63.         nxtDisplayTextLine(5,"motorB= %d",left);
  64.         nxtDisplayTextLine(7,"motorC= %d",right);

  65.         // 等待取样时间
  66.         wait1Msec(dt);
  67.       }
  68.         
  69.   }
  70.     while(SensorValue(sonarSensor)>8);
  71.     motor[motorB]=0;
  72.     motor[motorC]=0;
  73.     wait1Msec(1000);
  74.    
  75.     nMotorEncoderTarget[motorA] = 150;
  76. motor[motorA] = -20;
  77. wait1Msec(800);
  78. motor[motorA]=0;
  79. wait1Msec(1000);
  80. nMotorEncoder[motorB] = 0;               
  81. nMotorEncoder[motorC] = 0;  
  82. // reset the Motor Encoder of Motor C
  83. nMotorEncoderTarget[motorB] = 300;        // set the  target for Motor Encoder of Motor B to 360
  84. nMotorEncoderTarget[motorC] = -300;        // set the  target for Motor Encoder of Motor C to 360
  85. motor[motorB] = 70;                       // motor B is run at a power level of 75
  86. motor[motorC] = -70;  
  87. // motor C is run at a power level of 75
  88.        
  89. while(nMotorRunState[motorB] != runStateIdle && nMotorRunState[motorC] != runStateIdle)
  90. wait1Msec(1000);
  91. {
  92.        
  93. motor[motorA]=25;
  94. wait1Msec(800);
  95. motor[motorB] = -50;                       // motor B is run at a power level of 75
  96. motor[motorC] = 50;
  97. wait1Msec(700);
  98. }
  99. }
  100. }
复制代码


上面这个代码加上寻线之后,小车只执行寻线的那部分,没办法超声波检测了,求解
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2015-2-11 13:02:40 | 显示全部楼层
你这么写 又不是 并行运算。。肯定跳不出循环啊
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2015-2-11 13:06:24 | 显示全部楼层
  1. #pragma config(Sensor, S4,     sonarSensor,         sensorSONAR)
  2. #pragma config(Sensor, S1,lightSensor,sensorLightActive)
  3. #pragma config(Sensor, S2,lightSensor,sensorLightActive)
  4. #pragma platform(NXT)          //???NXT???


  5. #define Kproportional 2         // Kp, ????
  6. #define Kintegral 0.001          // Ki,????
  7. #define Kderivative 10            // Kd,????
  8. #define dt 1                   // ????
  9. task main()
  10. {
  11.         for(;;){
  12.    do
  13.     {
  14.     int error = 0;
  15.     float previous_error = 0;
  16.     float setpoint = 0;
  17.     float actual_position = 0;
  18.     float proportional = 0;
  19.     int integral = 0;
  20.     float derivative = 0;
  21.     float output = 0;
  22.     float left = 0;
  23.     float right = 0;

  24.     // ????????
  25.     float speed=35;

  26.     // ????
  27.     //SetSensorColorFull(IN_3);

  28.     // ??????
  29.     setpoint=50;
  30.     nxtDisplayTextLine(1,"setpoint= %d",setpoint);
  31.     wait1Msec(20);

  32.     // ??
  33. while(1)
  34. {
  35.     while(SensorValue(sonarSensor)>8)
  36.     {
  37.         // ????????
  38.         actual_position = SensorValue[lightSensor];
  39.         nxtDisplayTextLine(3,"ac_pos= %d",actual_position);

  40.         // ????
  41.         error = setpoint - actual_position;
  42.         // ????... ??????
  43.         //if (error <> 0) PlayTone(TONE_B7, 1);

  44.         // ????: ???? x ????
  45.         proportional = Kproportional * error;

  46.         // ??: ????
  47.         integral = integral + error;

  48.         // ??: ?????
  49.         derivative = (error - previous_error) / dt;

  50.         // ?????????????
  51.         output = proportional + Kintegral * dt * integral + Kderivative * derivative;

  52.         // ??????,????????????
  53.         previous_error = error;

  54.         // ??????
  55.         left = speed - output;

  56.         // ??????
  57.         right = speed + output;

  58.         // ??????
  59.         if (left >   100) left  =  100;
  60.         if (left <  -100) left  = -100;
  61.         if (right >  100) right =  100;
  62.         if (right < -100) right = -100;

  63.         motor[motorB]=left;
  64.         motor[motorC]=right;
  65.         nxtDisplayTextLine(5,"motorB= %d",left);
  66.         nxtDisplayTextLine(7,"motorC= %d",right);

  67.         // ??????
  68.         wait1Msec(dt);
  69.       }
  70.         
  71.   }
  72.    
  73.     motor[motorB]=0;
  74.     motor[motorC]=0;
  75.     wait1Msec(1000);
  76.    
  77.     nMotorEncoderTarget[motorA] = 150;
  78. motor[motorA] = -20;
  79. wait1Msec(800);
  80. motor[motorA]=0;
  81. wait1Msec(1000);
  82. nMotorEncoder[motorB] = 0;               
  83. nMotorEncoder[motorC] = 0;  
  84. // reset the Motor Encoder of Motor C
  85. nMotorEncoderTarget[motorB] = 300;        // set the  target for Motor Encoder of Motor B to 360
  86. nMotorEncoderTarget[motorC] = -300;        // set the  target for Motor Encoder of Motor C to 360
  87. motor[motorB] = 70;                       // motor B is run at a power level of 75
  88. motor[motorC] = -70;  
  89. // motor C is run at a power level of 75
  90.         
  91. while(nMotorRunState[motorB] != runStateIdle && nMotorRunState[motorC] != runStateIdle)
  92. wait1Msec(1000);
  93. {
  94.         
  95. motor[motorA]=25;
  96. wait1Msec(800);
  97. motor[motorB] = -50;                       // motor B is run at a power level of 75
  98. motor[motorC] = 50;
  99. wait1Msec(700);
  100. }
  101. }
  102. }
  103. }
复制代码
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-4-19 03:02 , Processed in 0.095719 second(s), 19 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表