找回密码
 立即注册
搜索
查看: 12891|回复: 6

转向角度控制问题

[复制链接]

3

主题

8

帖子

21

积分

新手上路

Rank: 1

积分
21
发表于 2017-4-17 10:34:00 | 显示全部楼层 |阅读模式
发送命令G,C能控制左右转向,但是如何能控制转动的幅度能,如向右转45度,手动控制好办,但是想用应用来控制。
回复

使用道具 举报

5

主题

231

帖子

1516

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1516
发表于 2017-4-17 13:37:53 | 显示全部楼层
修改参数调节界面的,第二个参数
回复

使用道具 举报

3

主题

8

帖子

21

积分

新手上路

Rank: 1

积分
21
 楼主| 发表于 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);//得到控制目标值,进行运动学分析
}
回复

使用道具 举报

5

主题

231

帖子

1516

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1516
发表于 2017-4-17 17:37:19 | 显示全部楼层
速度增加的步进值,您要控制具体的角位移量,就使用位置模式哈,可以通过串口直接输入指令的
回复

使用道具 举报

3

主题

8

帖子

21

积分

新手上路

Rank: 1

积分
21
 楼主| 发表于 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;         
                         }
我们其实就是想实现 小车运行到一个确定位置后,然后在原地转动方向(转动的角度我们可计算控制),然后继续向前,或向向后运动。在现在测试条件是,在速度模式下 ,就是对转向(向左,向右)的角度实现可控,如何实现呢
回复

使用道具 举报

5

主题

231

帖子

1516

积分

管理员

Rank: 9Rank: 9Rank: 9

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

这是APP遥控的,通过CAN接口输入控制指令即可完成您的功能
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

粤ICP备20017043号|小黑屋|手机版|Archiver|轮趣科技(东莞)有限公司  

GMT+8, 2024-11-22 21:23 , Processed in 0.054909 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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