蓝牙对象推送协议规格书 v1.2.1

需积分: 8 2 下载量 189 浏览量 更新于2024-07-15 收藏 541KB PDF 举报
"OPP_v1.2.1.pdf 是一份蓝牙联盟官方的协议文档,主要涉及对象推送(Object Push)应用 profile。这份文档在2015年12月15日被采纳,修订版本为v1.2.1,由OBEX 工作组(OBEXWG)准备,并通过obex-feedback@bluetooth.org邮箱接收反馈。" **蓝牙对象推送(Object Push)应用 Profile** 对象推送应用 Profile 定义了蓝牙设备支持对象推送使用模型所需的应用需求。这些需求是根据终端用户服务来表述的,并定义了在对象推送使用模型中蓝牙设备之间实现互操作性所需的特征和流程。此文档适用于那些希望在蓝牙设备之间进行文件或数据推送的场景。 **蓝牙规范** 对象推送 Profile(OPP)是蓝牙规范的一部分,最初在2001年2月22日随着蓝牙核心规范V1.1版本发布。随着时间的推移,该文档经历了多次修订,以满足编辑更新和改进的需求。例如,文档编号在2005年8月15日按照蓝牙文档命名程序V10r00进行了调整,后续版本也持续进行了编辑更新,以确保准确性和一致性。 **修订历史** - **版本1.1**: 发布于2001年2月22日,与蓝牙核心规范V1.1一同推出。 - **D12r00**: 2005年8月15日,调整文档编号以符合蓝牙文档命名规则。 - **D12r01**: 2005年9月14日,进行编辑更新。 - **D12r02**: 2005年10月31日,进行编辑更新。 - **D12r03**: 2005年11月15日,进行编辑更新。 - **D12r04**: 2006年12月15日,进行编辑更新。 - **D12r05**: 2006年7月14日,基于LLO的编辑。 - **D12r06**: 2007年3月1日,基于L的编辑。 **关键知识点** 1. **蓝牙协议栈**: 对象推送Profile是蓝牙协议栈的一个组成部分,它建立在蓝牙核心规范之上,用于设备间的数据交换。 2. **对象推送模型**: 描述了如何在蓝牙设备间推送文件或对象,比如图片、联系人信息等。 3. **互操作性**: OPP定义了蓝牙设备间必须遵循的特性和服务,以确保不同制造商的设备能顺利通信。 4. **服务需求**: 针对终端用户的服务需求,如文件传输的便捷性和速度,是定义OPP时的重要考虑因素。 5. **编辑更新**: 文档经过多轮修订,以解决错误、增强可读性和适应技术进步。 OPP_v1.2.1.pdf 是蓝牙设备进行对象推送服务的重要技术文档,它不仅规定了对象推送的基本流程,还反映了蓝牙技术的演进和标准的完善。对于开发蓝牙应用的工程师、产品经理以及需要理解蓝牙设备间数据传输机制的人员来说,这份文档具有极高的参考价值。

const ServerParam & SP = ServerParam::i(); const int self_min = wm.interceptTable()->selfReachCycle(); const int mate_min = wm.interceptTable()->teammateReachCycle(); int opp_min = wm.interceptTable()->opponentReachCycle(); const PlayerObject * opp_fastest = wm.interceptTable()->fastestOpponent(); if ( opp_fastest && opp_fastest->goalie() && wm.gameMode().isPenaltyKickMode() && opp_fastest->pos().dist( wm.ball().pos() ) >= 3.0 ) // MAGIC NUMBER { M_tackle_situation = false; M_opponent_ball = false; dlog.addText( Logger::TEAM, __FILE__":(update) penalty shootouts. not a tackle situation" ); return; } if ( opp_fastest && wm.gameMode().isPenaltyKickMode() && ! opp_fastest->goalie() ) { const AbstractPlayerObject * opponent_goalie = wm.getTheirGoalie(); if ( opponent_goalie ) { /* //yz del std::map< const AbstractPlayerObject*, int >::const_iterator player_map_it = wm.interceptTable()->playerMap().find( opponent_goalie ); if ( player_map_it != wm.interceptTable()->playerMap().end() ) { // considering only opponent goalie in penalty-kick mode opp_min = player_map_it->second; dlog.addText( Logger::TEAM, __FILE__":(update) replaced min_opp with goalie's reach cycle (%d).", opp_min ); } else { opp_min = 1000000; // practically canceling the fastest non-goalie opponent player dlog.addText( Logger::TEAM, __FILE__":%d: (update) set opp_min as 1000000 so as not to consider the fastest opponent.", __LINE__ ); } */ } else { opp_min = 1000000; // practically canceling the fastest non-goalie opponent player dlog.addText( Logger::TEAM, __FILE__":%d (update) set opp_min as 1000000 so as not to consider the fastest opponent.", __LINE__); } }

2023-07-25 上传

#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;

2023-07-12 上传