if (toBallDist < 10 && fabs(model->get_our_player_dir(robot_id) - task.orientate) < 0.15){ task.kickPower = 60;
时间: 2024-04-20 17:22:51 浏览: 24
这段代码的作用是判断机器人与球的距离是否小于10,并且机器人的朝向与目标朝向之间的差值是否小于0.15。如果满足这两个条件,就将`task.kickPower`设置为60,表示机器人踢球的力量为60。
这段代码的目的是控制机器人在合适的位置和朝向时进行踢球动作。距离小于10表示机器人已经接近球,而朝向差值小于0.15表示机器人的朝向与目标朝向相差不大,可以精确地对准球门进行射门。
根据具体的需求和场景,可以调整距离和朝向的阈值条件,以及踢球力量的大小。
相关问题
#include "def.h" #include "utils/maths.h" //用户注意;接口需要如下声明 extern "C"_declspec(dllexport) PlayerTask player_plan(const WorldModel* model, int robot_id); enum ball_near //PenaltyArea { outOfOrbit, onOrbit, shoot }; PlayerTask player_plan(const WorldModel* model, int robot_id){ PlayerTask task; const point2f& opp_goal = model->get_place_pos(); const float pi = 3.1415926; const float& circleR = 30; const float& DetAngle = 0.6; const point2f& goal = FieldPoint::Goal_Center_Point; const point2f& ball = model->get_ball_pos(); const point2f& kicker = model->get_our_player_pos(robot_id); const float& dir = model->get_our_player_dir(robot_id); ball_near orbit; point2f shootPosOnOrbit = ball + Maths::vector2polar(circleR, (ball - opp_goal).angle()); float toShootDir = fabs((kicker - ball).angle() - (ball - opp_goal).angle()); //(kicker - shootPosOnOrbit).length(); float toBallDist = (kicker - ball).length(); float toOppGoalDir = (opp_goal - kicker).angle(); float toBallDir = (ball - kicker).angle(); point2f robotBallAcrossCirclePoint = ball + Maths::vector2polar(circleR, (kicker - ball).angle()); point2f AntishootPosOnOrbit = ball + Maths::vector2polar(circleR, (opp_goal - ball).angle()); point2f BallToRobot = kicker - ball; if (toBallDist >circleR + 10) orbit = outOfOrbit; else if (toShootDir > 1) orbit = onOrbit; else orbit = shoot; bool getBall = toBallDist < 10; float diffdir_onorbit = 0; float b2r = BallToRobot.angle(); float o2b = (ball - opp_goal).angle(); bool add; switch (orbit) { case outOfOrbit: task.target_pos = robotBallAcrossCirclePoint; task.orientate = toOppGoalDir; break; case onOrbit: if (b2r * o2b >0){ if (b2r > 0){ if (b2r > o2b) add = false; else add = true; } else{ if (b2r > o2b) add = false; else add = true; } } else{ if (b2r > 0) add = true; else add = false; } if (add) { //+ task.target_pos = ball + Maths::vector2polar(circleR, BallToRobot.angle() + DetAngle); task.orientate = toOppGoalDir; } else { //- task.target_pos = ball + Maths::vector2polar(circleR, BallToRobot.angle() - DetAngle); task.orientate = toOppGoalDir; } break; case shoot: task.target_pos = ball + Maths::vector2polar(5, (ball - opp_goal).angle()); task.orientate = toOppGoalDir; task.needKick = true; task.flag = 1; if (toBallDist < 10 && fabs(model->get_our_player_dir(robot_id) - task.orientate) < 0.15){ task.kickPower = 60; } break;
这段代码是一个足球机器人控制程序的一部分。它定义了一个名为`player_plan`的函数,该函数接收一个`WorldModel`指针和一个机器人ID作为参数,并返回一个`PlayerTask`结构体。
函数中使用了一些变量来存储球场上的位置和角度信息,如球的位置、对方球门的位置、机器人的位置和朝向等。根据这些信息,函数根据球与机器人之间的距离和角度关系,确定机器人的动作。
在`outOfOrbit`情况下,机器人将目标位置设置为球与机器人之间的圆上的一个点,并将朝向设置为指向对方球门的方向。
在`onOrbit`情况下,根据球与机器人之间的角度关系,确定机器人应该朝哪个方向移动。如果球在机器人的右侧,则机器人向右移动一定角度;如果球在机器人的左侧,则机器人向左移动一定角度。目标位置也设置为球与机器人之间的圆上的一个点,并将朝向设置为指向对方球门的方向。
在`shoot`情况下,机器人将目标位置设置为球与对方球门之间的一个点,并将朝向设置为指向对方球门的方向。同时,设置`needKick`为真表示需要踢球,并设置`flag`为1表示需要执行踢球动作。
最后,根据距离和角度的阈值条件,确定机器人的踢球力量。
以上是这段代码的主要逻辑和功能。
解释这段代码static void chassis_control_loop(chassis_move_t *chassis_move_control_loop) { fp32 max_vector = 0.0f, vector_rate = 0.0f; fp32 temp = 0.0f; fp32 wheel_speed[4] = {0.0f, 0.0f, 0.0f, 0.0f}; uint8_t i = 0; float position_error, speed_error; float position_output, speed_output; float current_position, current_speed; float target_position, target_speed; chassis_move_control_loop->vx_set=vx_set; chassis_move_control_loop->vy_set=vy_set; chassis_move_control_loop->wz_set=angle_set; chassis_vector_to_mecanum_wheel_speed(chassis_move_control_loop->vx_set, chassis_move_control_loop->vy_set, chassis_move_control_loop->wz_set, wheel_speed); if (chassis_move_control_loop->chassis_mode == CHASSIS_VECTOR_RAW) { for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].give_current = (int16_t)(wheel_speed[i]); } } for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].speed_set = wheel_speed[i]; temp = fabs(chassis_move_control_loop->motor_chassis[i].speed_set); if (max_vector < temp) { max_vector = temp; } } if (max_vector > MAX_WHEEL_SPEED) { vector_rate = MAX_WHEEL_SPEED / max_vector; for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].speed_set *= vector_rate; } } for (i = 0; i < 4; i++) { PID_Calc(&chassis_move_control_loop->motor_speed_pid[i], chassis_move_control_loop->motor_chassis[i].speed, chassis_move_control_loop->motor_chassis[i].speed_set); } for (i = 0; i < 4; i++) { chassis_move_control_loop->motor_chassis[i].give_current = (int16_t)(chassis_move_control_loop->motor_speed_pid[i].out); } }
chassis_move_control_loop->motor_chassis[i].position_pid, chassis_move_control_loop->motor_chassis[i].speed_pid, chassis_move_control_loop->motor_chassis[i].position_get, chassis_move_control_loop->motor_chassis[i].speed_get, chassis_move_control_loop->motor_chassis[i].speed_set, &position_error, &speed_error, &position_output, &speed_output); current_position = chassis_move_control_loop->motor_chassis[i].position_get; current_speed = chassis_move_control_loop->motor_chassis[i].speed_get; target_position = chassis_move_control_loop->motor_chassis[i].position_set; target_speed = speed_output; if(chassis_move_control_loop->motor_chassis[i].position_pid.enable == 1) //PID启动 { chassis_move_control_loop->motor_chassis[i].give_current = PID_Calc(&chassis_move_control_loop->motor_chassis[i].position_pid, current_position, target_position); } else { chassis_move_control_loop->motor_chassis[i].give_current = PID_Calc(&chassis_move_control_loop->motor_chassis[i].speed_pid, current_speed, target_speed); } } }
该函数为底盘控制代码,主要实现底盘的位置和速度控制。
具体实现方法为:
1.根据控制指令,将底盘的速度向量转换为各个驱动电机的速度。
2.根据底盘模式选择不同的控制方式:
如果模式为 CHASSIS_VECTOR_RAW,直接将每个驱动电机的输出电流设置为对应速度。
3.根据电机的最大速度设置,对转换后的速度进行限制。
4.对每个驱动电机进行PID控制,计算出目标位置和目标速度,并根据位置控制或速度控制模式下达电机电流控制指令。
5.将目标速度和目标位置在PID计算中使用,并将计算出的电流控制指令转换为电机的输出电流。