sunny 发表于 2017-4-17 10:34:00

转向角度控制问题

发送命令G,C能控制左右转向,但是如何能控制转动的幅度能,如向右转45度,手动控制好办,但是想用应用来控制。

admin 发表于 2017-4-17 13:37:53

修改参数调节界面的,第二个参数

sunny 发表于 2017-4-17 14:19:17

admin 发表于 2017-4-17 13:37
修改参数调节界面的,第二个参数

第2个参数为RC_Position,从代码看是一次控制的偏移量。且之后在位置模式下才有效。如果是在速度模式下,我需要让车旋转45度,从代码看,貌似控制为 Move_Z+=step 。这是一个固定值 float step=0.5;//设置速度控制步进值。不知我理解是否正确。
另外这个0.5单位是什么,如果执行一次右自转,大约是转了多少角度? 如果知道这些,上层应用才好控制旋转的幅度
void Get_RC(u8 mode)
{

        float step=0.5;//设置速度控制步进值。
        u8 Flag_Move=1;
          if(mode==0)//速度
                {       
                               switch(Flag_Direction)   //方向控制
                               {
                               case 1:Move_X=0;         Move_Y+=step;Flag_Move=1;               break;
                               case 2:Move_X+=step;       Move_Y+=step;Flag_Move=1;               break;
                               case 3:Move_X+=step;       Move_Y=0;      Flag_Move=1;               break;
                               case 4:Move_X+=step;       Move_Y-=step;Flag_Move=1;               break;
                               case 5:Move_X=0;         Move_Y-=step;Flag_Move=1;               break;
                               case 6:Move_X-=step;       Move_Y-=step;Flag_Move=1;               break;
                               case 7:Move_X-=step;       Move_Y=0;      Flag_Move=1;               break;
                               case 8:Move_X-=step;       Move_Y+=step;Flag_Move=1;               break;
                               default: Flag_Move=0;               break;       
                       }
                               
                        if(Flag_Move==0)                //如果无方向控制指令       ,检查转向控制状态
                        {       
                                if(Flag_Left==1)       Move_X=0,Move_Y=0,Move_Z-=step,Gyro_K=0;    //左自旋   
                                else if(Flag_Right==1) Move_X=0,Move_Y=0,Move_Z+=step,Gyro_K=0;    //右自旋               
                                else                                Move_X=0,Move_Y=0,Move_Z=0,Gyro_K=0.004;    //停止
                        }       
                                if(Flag_Move==1)        Flag_Left=0,Flag_Right=0,Move_Z=0;
                                if(Move_X<-RC_Velocity) Move_X=-RC_Velocity;           //速度控制限幅
                                if(Move_X>RC_Velocity)Move_X=RC_Velocity;             
                                if(Move_Y<-RC_Velocity) Move_Y=-RC_Velocity;       
                                if(Move_Y>RC_Velocity)Move_Y=RC_Velocity;       
                                if(Move_Z<-RC_Velocity) Move_Z=-RC_Velocity;       
                                if(Move_Z>RC_Velocity)Move_Z=RC_Velocity;       
                       
       }
               else if(mode==1)//位置模式
                {       
                               switch(Flag_Direction)   //方向控制
                               {
                               case 1:Move_Y+=RC_Position; Flag_Change=1;break;
                               case 2:Move_X+=RC_Position; Flag_Change=2; Move_Y+=RC_Position; break;
                               case 3:Move_X+=RC_Position; Flag_Change=3;break;
                               case 4:Move_X+=RC_Position; Flag_Change=4;Move_Y-=RC_Position;break;
                               case 5:Move_Y-=RC_Position; Flag_Change=5;break;
                               case 6:Move_X-=RC_Position; Flag_Change=6;Move_Y-=RC_Position; break;
                               case 7:Move_X-=RC_Position; Flag_Change=7; break;
                               case 8:Move_X-=RC_Position; Flag_Change=8;Move_Y+=RC_Position;break;                       
                               case 9:Move_Z-=RC_Position; Flag_Change=9; break;
                               case 10: Move_Z+=RC_Position; Flag_Change=10;break;                       
                               default: break;       
                       }
       }
               Kinematic_Analysis(Move_X,Move_Y,Move_Z);//得到控制目标值,进行运动学分析
}

admin 发表于 2017-4-17 17:37:19

速度增加的步进值,您要控制具体的角位移量,就使用位置模式哈,可以通过串口直接输入指令的

sunny 发表于 2017-4-19 10:02:19

admin 发表于 2017-4-17 17:37
速度增加的步进值,您要控制具体的角位移量,就使用位置模式哈,可以通过串口直接输入指令的

你好,通过输入指令测试和看代码的效果,在位置模式下,并不能实现原地转向的功能。
    else if(mode==1)//位置模式
                {      
                               case 1:Move_Y+=RC_Position; Flag_Change=1;break; // A向前
                                 case 2:Move_X+=RC_Position; Flag_Change=2; Move_Y+=RC_Position; break; //B 右前方45度角
                               case 3:Move_X+=RC_Position; Flag_Change=3;break; //C 向右
                               case 4:Move_X+=RC_Position; Flag_Change=4;Move_Y-=RC_Position;break; //D 右后方45度角
                               case 5:Move_Y-=RC_Position; Flag_Change=5;break;//E 向后
                               case 6:Move_X-=RC_Position; Flag_Change=6;Move_Y-=RC_Position; break;//F 左后方45度角
                               case 7:Move_X-=RC_Position; Flag_Change=7; break;//G 向左
                               case 8:Move_X-=RC_Position; Flag_Change=8;Move_Y+=RC_Position;break;//H 向左前方45度角
                               case 9:Move_Z-=RC_Position; Flag_Change=9; break;//I不运动
                               case 10: Move_Z+=RC_Position; Flag_Change=10;break;//J       不运动                        
                                 default: break;         
                         }
我们其实就是想实现 小车运行到一个确定位置后,然后在原地转动方向(转动的角度我们可计算控制),然后继续向前,或向向后运动。在现在测试条件是,在速度模式下 ,就是对转向(向左,向右)的角度实现可控,如何实现呢

admin 发表于 2017-4-19 22:43:29

sunny 发表于 2017-4-19 10:02
你好,通过输入指令测试和看代码的效果,在位置模式下,并不能实现原地转向的功能。
    else if(mode== ...

这是APP遥控的,通过CAN接口输入控制指令即可完成您的功能
页: [1]
查看完整版本: 转向角度控制问题