小车相关的

来源:互联网 发布:微信摇一摇抽奖软件 编辑:程序博客网 时间:2024/04/30 07:45

1.C相关的 

就是那serial1 改成serial2

还有一个就是serialEvent1 改成serialEvent2

dealy_time 调节速度的,越大越快


serial2表示新小车;

serial1表示旧小车


2.导航相关的

com.openrobot.app.navi.NagivatorChannelTask

public static NavigatorTask create(IRobot robot,IExecutor executor,NagivateDestination destination){if(destination == null)return null;NavigatorTask task = null;if(destination.navigatorMethod == null || destination.navigatorMethod.equals("")){task = new NagivatorGridTask(robot,executor,destination);}else if(destination.navigatorMethod.equalsIgnoreCase("grid")){task = new NagivatorGridTask(robot,executor,destination);}else if(destination.navigatorMethod.equalsIgnoreCase("channel")){task = new NagivatorChannelTask(robot,executor,destination);}else{//task = new NagivatorGridTask(robot,executor,destination);task = new NagivatorChannelTask(robot,executor,destination);}task.init();return task;}

3.关于Croass的加载

4.关于NagivatorChannelTask.java中的private Coordinate[] getRoadDirection(Road curRoad, Road nextRoad,boolean cur) 方法的修改

private Coordinate[] getRoadDirection(Road curRoad, Road nextRoad,boolean cur) {// TODO Auto-generated method stubCoordinate[] r1 = curRoad.getCenters().getCoordinates();Coordinate[] r2 = nextRoad.getCenters().getCoordinates();double mindis = -1;int r1Index = -1,r2Index = -1;//找到r1和r2距离最近的两个点for(int i=0;i<r1.length;i++){for(int j=0;j<r2.length;j++){if(i!=0 && i != r1.length-1 && j!=0 && j != r2.length-1)continue;double dx = r1[i].x - r2[j].x;double dy = r1[i].y - r2[j].y;double dis = Math.sqrt(dx*dx+dy*dy);if(mindis == -1){mindis = dis;r1Index = i;r2Index = j;}else if(mindis > dis){mindis = dis;r1Index = i;r2Index = j;}}}List<Coordinate> results = new ArrayList<Coordinate>(Arrays.asList(cur?r1:r2));if(cur && r1Index == 0){Collections.reverse(results);}else if(!cur && r2Index !=0){Collections.reverse(results);}return results.toArray(new Coordinate[results.size()]);}

1.假如当前道路R1的坐标序列是P1,P2,P3;下一条道路R2的坐标序列式P4,P5,P6
2.由于配置文件中记录的坐标点顺序是任意的,所以R1和R2两个道路相接的点有四种可能:P1和P4相接,P1和P6相接,P3和P4相接,P3和P6相接
getRoadDirection()函数的作用是先找到四种相接方式到底是哪一种:对于R1来说,如果P1是接头点,则返回P3,P2,P1,否则返回P1,P2,P3
这样返回的坐标序列能确保是行进方向一致
对于R2来说,如果P4是接头点,则返回P4,P5,P6,否则将坐标序列颠倒下 

5.关于X轴Y轴方向的确定

if(mainDirection == 0 || mainDirection == 1 || mainDirection == 2){//X为主方向 


6.坐标轴方向的确定

目前这块总是假设Road是平行坐标轴的,且车子总是在Road附近

private int getMainDirectoin(){//将道路方向简单规划为与坐标轴平行的方向(只有室内,且障碍物比较规则才可能)//1 x轴正向,2 x轴反向,3 y轴正向,y 轴反向int mainDirection = 0;if(curRoadAngle <= Math.PI/4 && curRoadAngle >= -1*Math.PI/4){//X正向mainDirection = 1;}else if(curRoadAngle > Math.PI/4 && curRoadAngle <= 3*Math.PI/4){//y轴正向mainDirection = 3;}else if(curRoadAngle > 3*Math.PI/4 && 3*Math.PI/4 <= Math.PI){//X反向mainDirection = 2;}else if(curRoadAngle > 3*Math.PI/4 ||  curRoadAngle <= -1*3*Math.PI/4){//x轴反向mainDirection = 2;}else{//y 轴反向mainDirection = 4;}return mainDirection;}

7.是否到达目的点的判断

public boolean isArrive(Polygon destinationRange) {if(destinationRange == null)return false;StatePosition curPos = robot.getStateCollection().getValue(StateCollection.POSITION);//Point pt = GeometryUtil.createPoint(curPos.getCoord());//判断当前点和目的点的距离,距离小于10cm,就认为到达目的点了boolean isArriveDestination = false;//目的点的坐标点Coordinate[] coordinates = destinationRange.getCoordinates();for (int i = 0; i < coordinates.length; i++) {if( twoCoordinatesIsAlike(curPos.getCoord(),coordinates[i]) ){isArriveDestination = true;break;}}return isArriveDestination;}/** * 判断两个点,是不是相似。 * 两个点的距离在15cm之内,就认为到达目的点了 * @param a * @param b * @return */private boolean twoCoordinatesIsAlike(Coordinate a,Coordinate b){double juli = Math.sqrt( Math.pow((a.x - b.x), 2) + Math.pow((a.y - b.y), 2) );return juli > 25 ? false : true;}


8.旋转之前,睡眠一会

//进行旋转if(rotateAction!=null && rotateAction.angle>=10 && rotateAction.direction!=WalkCode.STOP){//旋转之前先睡眠一会Common.sleep(2000);rotateAction.execute();//旋转完成也睡眠一会Common.sleep(2000);}

for(int i=0;i<actionQueue.size();i++){IAction action = actionQueue.get(i);RetCode retCode = null;//旋转的话,先睡眠一会if(action.getClass().isAssignableFrom(RotateAction.class)){Common.sleep(2000);retCode = action.execute();Common.sleep(2000);}else{ //不是旋转动作,直接执行retCode = action.execute();}}


9.通过道路的时候,前进一半的距离,这样可以进行角度的修正

//移动,这个应该就是避障逻辑的修改了(注意是前进一半的距离)

MoveAction moveAction = new MoveAction(robot,WalkCode.FORWARD,mainDistance);

前进一半距离的时候,可能会造成前进的距离越来越短。所以进行简单的判断

要是前进的距离小于60cm,就直接前进60cm。不要前进一半的距离了。



StatePosition curPosition = robot.getStateCollection().getValue(StateCollection.POSITION);//当前位置信息double curAngle = curPosition.getAngle(); //当前角度信息//将道路方向简单规划为与坐标轴平行的方向(只有室内,且障碍物比较规则才可能)//1 x轴正向,2 x轴反向,3 y轴正向,4 y轴反向 ,这个地方不是很理解int mainDirection = this.getMainDirectoin(); //得到当前小车的坐标轴方向RotateAction rotateAction = computeRotateAction(mainDirection,curAngle); //根据当前角度和mainDirection,确定需要旋转的角度//计算该方向上当前点到当前道路终点的距离double mainDistance  = 0;if(mainDirection == 0 || mainDirection == 1 || mainDirection == 2){//X为主方向 mainDistance = Math.abs(curPosition.getCoord().x-curRoadPoints[curRoadPoints.length-1].x);}else{mainDistance = Math.abs(curPosition.getCoord().y-curRoadPoints[curRoadPoints.length-1].y);}//尝试通过该条道路的条件//当前目标点的坐标距离道路最后一个坐标点的距离小于5cm,就认为通过这条路径了if(mainDistance <= 10){ //小于5厘米认为已经到了return RetCode.COMPLETED;}//进行旋转if(rotateAction!=null && rotateAction.angle>=10 && rotateAction.direction!=WalkCode.STOP){//旋转之前先睡眠一会Common.sleep(2000);rotateAction.execute();//旋转完成也睡眠一会Common.sleep(2000);}//移动,这个应该就是避障逻辑的修改了MoveAction moveAction = new MoveAction(robot,WalkCode.FORWARD,mainDistance/2);RetCode retCode = moveAction.execute();

10.旋转角度

旋转角度的实现,跟电量和地面有很大的关系。这个只能依靠通过,提前确定好参数,然后通过配置文件来写入到C端的代码里面。

提前确定,旋转角度的C参数。


原创粉丝点击