#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;
时间: 2024-04-20 10:22:55 浏览: 40
这段代码是一个足球机器人控制程序的一部分。它定义了一个名为`player_plan`的函数,该函数接收一个`WorldModel`指针和一个机器人ID作为参数,并返回一个`PlayerTask`结构体。
函数中使用了一些变量来存储球场上的位置和角度信息,如球的位置、对方球门的位置、机器人的位置和朝向等。根据这些信息,函数根据球与机器人之间的距离和角度关系,确定机器人的动作。
在`outOfOrbit`情况下,机器人将目标位置设置为球与机器人之间的圆上的一个点,并将朝向设置为指向对方球门的方向。
在`onOrbit`情况下,根据球与机器人之间的角度关系,确定机器人应该朝哪个方向移动。如果球在机器人的右侧,则机器人向右移动一定角度;如果球在机器人的左侧,则机器人向左移动一定角度。目标位置也设置为球与机器人之间的圆上的一个点,并将朝向设置为指向对方球门的方向。
在`shoot`情况下,机器人将目标位置设置为球与对方球门之间的一个点,并将朝向设置为指向对方球门的方向。同时,设置`needKick`为真表示需要踢球,并设置`flag`为1表示需要执行踢球动作。
最后,根据距离和角度的阈值条件,确定机器人的踢球力量。
以上是这段代码的主要逻辑和功能。
相关问题
home/ros/catkin_ctr/src/precise_land/src/traj_pub.cpp:3:10: fatal error: ../Utils/quadrotor_msgs/PositionCommand.h: 没有那个文件或目录 3 | #include "../Utils/quadrotor_msgs/PositionCommand.h"
这个错误提示显示编译器找不到`../Utils/quadrotor_msgs/PositionCommand.h`头文件,这可能是因为路径设置不正确导致的。
一种可能的原因是,`PositionCommand.h`文件不在指定的路径下。可以使用以下命令来确认该文件是否存在:
```
ls /home/ros/catkin_ctr/src/ego-planner-swarm/src/uav_simulator/Utils/quadrotor_msgs/PositionCommand.h
```
如果该命令返回“文件不存在”或类似的错误信息,则需要确认该文件是否存在于指定的路径下。如果该文件存在,可以尝试使用以下方法来解决该问题:
1. 设置正确的路径:
在头文件中使用正确的相对路径来引用`PositionCommand.h`文件。可以尝试使用以下代码来引用该头文件:
```
#include "../Utils/quadrotor_msgs/PositionCommand.h"
```
这个路径是相对于当前文件的路径。需要确认当前文件和`PositionCommand.h`文件的路径关系。
2. 添加路径到CMakeLists.txt:
可以在`CMakeLists.txt`中添加以下代码,将`quadrotor_msgs`包的路径添加到头文件搜索路径中:
```
include_directories(${catkin_INCLUDE_DIRS}
${PROJECT_SOURCE_DIR}/Utils
/home/ros/catkin_ctr/src/ego-planner-swarm/src/uav_simulator/Utils/quadrotor_msgs)
```
这个方式可以将指定路径添加到头文件搜索路径中,使编译器能够找到该头文件。需要将路径修改为`PositionCommand.h`文件所在的路径。
需要注意的是,如果使用了第二种方法,需要重新执行`catkin_make`命令来编译整个工作空间。
/home/ros/catkin_ctr/src/precise_land/src/traj_pub.cpp:3:10: fatal error: ../Utils/quadrotor_msgs/PositionCommand.h: 没有那个文件或目录 3 | #include "../Utils/quadrotor_msgs/PositionCommand.h"
这个错误提示是说在编译 `traj_pub.cpp` 文件时,找不到 `../Utils/quadrotor_msgs/PositionCommand.h` 文件。这很可能是因为编译器无法找到该文件所在的路径。
要解决这个问题,你可以尝试以下几个方法:
1. 确认 `../Utils/quadrotor_msgs/PositionCommand.h` 文件是否存在,以及其路径是否正确。如果该文件不存在或者路径不正确,需要将其放到正确的位置。
2. 确认 `quadrotor_msgs` 包是否已经被编译。如果该包还没有被编译,需要先编译该包。
3. 确认 `quadrotor_msgs` 包是否已经被包含在你的ROS工作空间中。如果该包没有被包含在你的ROS工作空间中,需要将其添加到ROS工作空间中。
4. 确认 `CMakeLists.txt` 文件中是否正确地添加了 `quadrotor_msgs` 包的依赖关系。你需要在 `CMakeLists.txt` 文件中添加以下内容:
```
find_package(catkin REQUIRED COMPONENTS quadrotor_msgs)
include_directories(${catkin_INCLUDE_DIRS})
target_link_libraries(<your_target_name> ${catkin_LIBRARIES})
```
其中,`<your_target_name>` 是指你要编译的目标程序的名称。这些命令将告诉编译器在编译时需要链接 `quadrotor_msgs` 包。
如果你按照以上步骤仍然无法解决问题,可以尝试在ROS官方论坛或者ROS Answers上发帖求助,以获取更多的帮助。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)