From 8aca8a4d24efe2392d7fd3f5eae5fc4cd6e562f9 Mon Sep 17 00:00:00 2001 From: liuyunhua Date: Tue, 27 Jun 2023 08:33:52 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=86=97=E4=BD=99=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modules/common/CMakeLists.txt | 1 - .../Modules/common/include/geometry_utils.h | 248 - .../Modules/common/include/math_utils.h | 127 - .../Modules/common/include/printf_utils.h | 132 - .../common/prometheus_msgs/CMakeLists.txt | 92 - .../action/CheckForObjects.action | 13 - .../common/prometheus_msgs/msg/ArucoInfo.msg | 17 - .../prometheus_msgs/msg/BoundingBox.msg | 8 - .../prometheus_msgs/msg/BoundingBoxes.msg | 3 - .../prometheus_msgs/msg/DetectionInfo.msg | 33 - .../prometheus_msgs/msg/DetectionInfoSub.msg | 9 - .../prometheus_msgs/msg/FormationAssign.msg | 5 - .../common/prometheus_msgs/msg/GPSData.msg | 3 - .../prometheus_msgs/msg/GimbalControl.msg | 33 - .../prometheus_msgs/msg/GimbalState.msg | 40 - .../prometheus_msgs/msg/GlobalAruco.msg | 12 - .../prometheus_msgs/msg/MultiArucoInfo.msg | 7 - .../msg/MultiDetectionInfo.msg | 10 - .../msg/MultiDetectionInfoSub.msg | 10 - .../prometheus_msgs/msg/MultiUAVState.msg | 7 - .../common/prometheus_msgs/msg/OffsetPose.msg | 3 - .../prometheus_msgs/msg/RheaCommunication.msg | 18 - .../common/prometheus_msgs/msg/RheaGPS.msg | 3 - .../common/prometheus_msgs/msg/RheaState.msg | 19 - .../prometheus_msgs/msg/SwarmCommand.msg | 51 - .../common/prometheus_msgs/msg/TextInfo.msg | 12 - .../common/prometheus_msgs/msg/UAVCommand.msg | 38 - .../prometheus_msgs/msg/UAVControlState.msg | 23 - .../common/prometheus_msgs/msg/UAVSetup.msg | 17 - .../common/prometheus_msgs/msg/UAVState.msg | 59 - .../common/prometheus_msgs/msg/VisionDiff.msg | 28 - .../prometheus_msgs/msg/WindowPosition.msg | 20 - .../common/prometheus_msgs/package.xml | 30 - .../common/quadrotor_msgs/CMakeLists.txt | 50 - .../common/quadrotor_msgs/msg/AuxCommand.msg | 5 - .../common/quadrotor_msgs/msg/Corrections.msg | 2 - .../common/quadrotor_msgs/msg/Gains.msg | 4 - .../quadrotor_msgs/msg/LQRTrajectory.msg | 30 - .../common/quadrotor_msgs/msg/Odometry.msg | 8 - .../common/quadrotor_msgs/msg/OutputData.msg | 12 - .../quadrotor_msgs/msg/PPROutputData.msg | 16 - .../msg/PolynomialTrajectory.msg | 28 - .../quadrotor_msgs/msg/PositionCommand.msg | 22 - .../quadrotor_msgs/msg/Px4ctrlDebug.msg | 37 - .../common/quadrotor_msgs/msg/SO3Command.msg | 6 - .../common/quadrotor_msgs/msg/Serial.msg | 13 - .../common/quadrotor_msgs/msg/StatusData.msg | 4 - .../common/quadrotor_msgs/msg/TRPYCommand.msg | 6 - .../Modules/common/quadrotor_msgs/package.xml | 20 - .../Modules/communication/CMakeLists.txt | 63 - .../include/autonomous_landing_topic.hpp | 50 - .../include/communication_bridge.hpp | 93 - .../include/gimbal_basic_topic.hpp | 39 - .../include/object_tracking_topic.hpp | 26 - .../include/swarm_control_topic.hpp | 90 - .../communication/include/uav_basic_topic.hpp | 75 - .../communication/include/ugv_basic_topic.hpp | 63 - .../communication/launch/bridge.launch | 25 - .../Modules/communication/package.xml | 34 - .../Modules/communication/shard/include/CRC.h | 2066 ----- .../communication/shard/include/Struct.hpp | 900 -- .../shard/include/communication.hpp | 98 - .../shard/libs/libcommunication.so | Bin 1479848 -> 0 bytes .../src/autonomous_landing_topic.cpp | 76 - .../src/communication_bridge.cpp | 843 -- .../communication/src/gimbal_basic_topic.cpp | 93 - .../Modules/communication/src/main.cpp | 15 - .../src/object_tracking_topic.cpp | 30 - .../communication/src/swarm_control_topic.cpp | 214 - .../communication/src/uav_basic_topic.cpp | 147 - .../communication/src/ugv_basic_topic.cpp | 118 - .../Modules/ego_planner_swarm/CMakeLists.txt | 1 - .../bspline_opt/CMakeLists.txt | 45 - .../include/bspline_opt/bspline_optimizer.h | 213 - .../bspline_opt/gradient_descent_optimizer.h | 52 - .../bspline_opt/include/bspline_opt/lbfgs.hpp | 1451 ---- .../include/bspline_opt/uniform_bspline.h | 80 - .../ego_planner_swarm/bspline_opt/package.xml | 77 - .../bspline_opt/src/bspline_optimizer.cpp | 1735 ---- .../src/gradient_descent_optimizer.cpp | 94 - .../bspline_opt/src/uniform_bspline.cpp | 377 - .../drone_detect/CMakeLists.txt | 130 - .../ego_planner_swarm/drone_detect/LICENSE | 29 - .../ego_planner_swarm/drone_detect/README.md | 97 - .../drone_detect/config/camera.yaml | 7 - .../drone_detect/config/default.yaml | 5 - .../drone_detect/doc/demo.jpg | Bin 372872 -> 0 bytes .../drone_detect/doc/example.jpg | Bin 105226 -> 0 bytes .../include/drone_detector/drone_detector.h | 156 - .../drone_detect/launch/drone_detect.launch | 24 - ...s_package_template_overlying_params.launch | 27 - .../drone_detect/package.xml | 20 - .../drone_detect/src/drone_detect_node.cpp | 14 - .../drone_detect/src/drone_detector.cpp | 423 - .../drone_detect/test/test_drone_detector.cpp | 10 - .../Modules/ego_planner_swarm/ego_planner.md | 24 - .../path_searching/CMakeLists.txt | 42 - .../include/path_searching/dyn_a_star.h | 115 - .../path_searching/package.xml | 71 - .../path_searching/src/dyn_a_star.cpp | 260 - .../ego_planner_swarm/plan_env/CMakeLists.txt | 59 - .../plan_env/include/plan_env/grid_map.h | 804 -- .../include/plan_env/linear_obj_model.hpp | 267 - .../plan_env/include/plan_env/obj_predictor.h | 176 - .../plan_env/include/plan_env/raycast.h | 63 - .../ego_planner_swarm/plan_env/package.xml | 68 - .../plan_env/src/grid_map.cpp | 1109 --- .../plan_env/src/obj_generator.cpp | 238 - .../plan_env/src/obj_predictor.cpp | 289 - .../plan_env/src/raycast.cpp | 321 - .../plan_manage/CMakeLists.txt | 63 - .../include/plan_manage/ego_replan_fsm.h | 133 - .../include/plan_manage/planner_manager.h | 85 - .../plan_manage/launch/advanced_param.xml | 160 - .../plan_manage/launch/default.rviz | 3055 ------- .../plan_manage/launch/run_in_sim.launch | 135 - .../plan_manage/launch/rviz.launch | 3 - .../plan_manage/launch/simple_run.launch | 4 - .../plan_manage/launch/simulator.xml | 141 - .../launch/single_run_in_sim.launch | 117 - .../plan_manage/launch/swarm.launch | 205 - .../plan_manage/launch/swarm_large.launch | 412 - .../launch_ego_planner/advanced_param.xml | 156 - .../plan_manage/launch_ego_planner/ego.rviz | 608 -- .../ego_control_config.yaml | 40 - .../real_ego_planner_basic.launch | 55 - .../launch_ego_planner/rviz_cxy_case2.rviz | 7575 ----------------- .../sitl_ego_planner_4uav.launch | 79 - .../sitl_ego_planner_basic.launch | 69 - .../sitl_ego_planner_pub_goal.launch | 33 - .../ego_planner_swarm/plan_manage/package.xml | 82 - .../plan_manage/src/ego_planner_node.cpp | 56 - .../plan_manage/src/ego_replan_fsm.cpp | 955 --- .../plan_manage/src/ego_traj_to_cmd.cpp | 103 - .../plan_manage/src/planner_manager.cpp | 600 -- .../plan_manage/src/traj_server.cpp | 264 - .../src_for_prometheus/ego_goal_pub.cpp | 59 - .../traj_server_for_prometheus.cpp | 310 - .../rosmsg_tcp_bridge/CMakeLists.txt | 35 - .../rosmsg_tcp_bridge/launch/bridge.launch | 18 - .../rosmsg_tcp_bridge/package.xml | 67 - .../rosmsg_tcp_bridge/src/bridge_node.cpp | 828 -- .../traj_utils/CMakeLists.txt | 59 - .../include/traj_utils/plan_container.hpp | 233 - .../traj_utils/planning_visualization.h | 55 - .../include/traj_utils/polynomial_traj.h | 336 - .../traj_utils/msg/Bspline.msg | 12 - .../traj_utils/msg/DataDisp.msg | 7 - .../traj_utils/msg/MultiBsplines.msg | 4 - .../ego_planner_swarm/traj_utils/package.xml | 77 - .../traj_utils/src/planning_visualization.cpp | 265 - .../traj_utils/src/polynomial_traj.cpp | 224 - .../Modules/tutorial_demo/CMakeLists.txt | 162 - .../include/mission_utils.h | 184 - .../launch/autonomous_landing_all.launch | 41 - .../src/autonomous_landing.cpp | 313 - .../launch/find_aruco_marker_all.launch | 27 - .../src/find_aruco_marker.cpp | 272 - .../launch/formation_control.launch | 8 - .../src/formation_control.cpp | 184 - .../launch/siamrpn_track_all.launch | 38 - .../siamrpn_track/src/siamrpn_track.cpp | 176 - .../launch/yolov5_track_all.launch | 43 - .../launch/body_xyz_pos_control.launch | 7 - .../scripts/body_xyz_pos_control.py | 118 - .../src/body_xyz_pos_control.cpp | 173 - .../launch/circular_trajectory_control.launch | 7 - .../scripts/circular_trajectory_control.py | 152 - .../src/circular_trajectory_control.cpp | 247 - .../launch/enu_xyz_pos_control.launch | 7 - .../scripts/enu_xyz_pos_control.py | 117 - .../src/enu_xyz_pos_control.cpp | 168 - .../launch/global_pos_control.launch | 7 - .../src/global_pos_control.cpp | 164 - .../takeoff_land/launch/takeoff_land.launch | 7 - .../launch/takeoff_land_liu.launch | 7 - .../takeoff_land/scripts/takeoff_land.py | 99 - .../basic/takeoff_land/src/CMakeLists.txt | 1 - .../basic/takeoff_land/src/takeoff_land.cpp | 151 - .../takeoff_land/src/takeoff_land_liu.cpp | 255 - .../takeoff_land/src/takeoff_land_no_rc.cpp | 170 - .../Modules/tutorial_demo/package.xml | 21 - 182 files changed, 36628 deletions(-) delete mode 100644 src/无人机端代码/Modules/common/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/common/include/geometry_utils.h delete mode 100644 src/无人机端代码/Modules/common/include/math_utils.h delete mode 100644 src/无人机端代码/Modules/common/include/printf_utils.h delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/action/CheckForObjects.action delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/ArucoInfo.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/BoundingBox.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/BoundingBoxes.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/DetectionInfo.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/DetectionInfoSub.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/FormationAssign.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/GPSData.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/GimbalControl.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/GimbalState.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/GlobalAruco.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiArucoInfo.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiDetectionInfo.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiDetectionInfoSub.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiUAVState.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/OffsetPose.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaCommunication.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaGPS.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaState.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/SwarmCommand.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/TextInfo.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVCommand.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVControlState.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVSetup.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVState.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/VisionDiff.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/msg/WindowPosition.msg delete mode 100644 src/无人机端代码/Modules/common/prometheus_msgs/package.xml delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/AuxCommand.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/Corrections.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/Gains.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/LQRTrajectory.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/Odometry.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/OutputData.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/PPROutputData.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/PolynomialTrajectory.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/PositionCommand.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/Px4ctrlDebug.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/SO3Command.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/Serial.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/StatusData.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/msg/TRPYCommand.msg delete mode 100644 src/无人机端代码/Modules/common/quadrotor_msgs/package.xml delete mode 100644 src/无人机端代码/Modules/communication/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/communication/include/autonomous_landing_topic.hpp delete mode 100644 src/无人机端代码/Modules/communication/include/communication_bridge.hpp delete mode 100644 src/无人机端代码/Modules/communication/include/gimbal_basic_topic.hpp delete mode 100644 src/无人机端代码/Modules/communication/include/object_tracking_topic.hpp delete mode 100644 src/无人机端代码/Modules/communication/include/swarm_control_topic.hpp delete mode 100644 src/无人机端代码/Modules/communication/include/uav_basic_topic.hpp delete mode 100644 src/无人机端代码/Modules/communication/include/ugv_basic_topic.hpp delete mode 100644 src/无人机端代码/Modules/communication/launch/bridge.launch delete mode 100644 src/无人机端代码/Modules/communication/package.xml delete mode 100644 src/无人机端代码/Modules/communication/shard/include/CRC.h delete mode 100644 src/无人机端代码/Modules/communication/shard/include/Struct.hpp delete mode 100644 src/无人机端代码/Modules/communication/shard/include/communication.hpp delete mode 100644 src/无人机端代码/Modules/communication/shard/libs/libcommunication.so delete mode 100644 src/无人机端代码/Modules/communication/src/autonomous_landing_topic.cpp delete mode 100644 src/无人机端代码/Modules/communication/src/communication_bridge.cpp delete mode 100644 src/无人机端代码/Modules/communication/src/gimbal_basic_topic.cpp delete mode 100644 src/无人机端代码/Modules/communication/src/main.cpp delete mode 100644 src/无人机端代码/Modules/communication/src/object_tracking_topic.cpp delete mode 100644 src/无人机端代码/Modules/communication/src/swarm_control_topic.cpp delete mode 100644 src/无人机端代码/Modules/communication/src/uav_basic_topic.cpp delete mode 100644 src/无人机端代码/Modules/communication/src/ugv_basic_topic.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/bspline_opt/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/bspline_opt/include/bspline_opt/bspline_optimizer.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/bspline_opt/include/bspline_opt/gradient_descent_optimizer.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/bspline_opt/include/bspline_opt/lbfgs.hpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/bspline_opt/include/bspline_opt/uniform_bspline.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/bspline_opt/package.xml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/bspline_opt/src/bspline_optimizer.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/bspline_opt/src/gradient_descent_optimizer.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/bspline_opt/src/uniform_bspline.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/LICENSE delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/README.md delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/config/camera.yaml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/config/default.yaml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/doc/demo.jpg delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/doc/example.jpg delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/include/drone_detector/drone_detector.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/launch/drone_detect.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/launch/ros_package_template_overlying_params.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/package.xml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/src/drone_detect_node.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/src/drone_detector.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/drone_detect/test/test_drone_detector.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/ego_planner.md delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/path_searching/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/path_searching/include/path_searching/dyn_a_star.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/path_searching/package.xml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/path_searching/src/dyn_a_star.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_env/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_env/include/plan_env/grid_map.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_env/include/plan_env/linear_obj_model.hpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_env/include/plan_env/obj_predictor.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_env/include/plan_env/raycast.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_env/package.xml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_env/src/grid_map.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_env/src/obj_generator.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_env/src/obj_predictor.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_env/src/raycast.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/include/plan_manage/ego_replan_fsm.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/include/plan_manage/planner_manager.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch/advanced_param.xml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch/default.rviz delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch/run_in_sim.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch/rviz.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch/simple_run.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch/simulator.xml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch/single_run_in_sim.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch/swarm.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch/swarm_large.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch_ego_planner/advanced_param.xml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch_ego_planner/ego.rviz delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch_ego_planner/ego_control_config.yaml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch_ego_planner/real_ego_planner_basic.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch_ego_planner/rviz_cxy_case2.rviz delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch_ego_planner/sitl_ego_planner_4uav.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch_ego_planner/sitl_ego_planner_basic.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/launch_ego_planner/sitl_ego_planner_pub_goal.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/package.xml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/src/ego_planner_node.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/src/ego_replan_fsm.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/src/ego_traj_to_cmd.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/src/planner_manager.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/src/traj_server.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/src_for_prometheus/ego_goal_pub.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/plan_manage/src_for_prometheus/traj_server_for_prometheus.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/rosmsg_tcp_bridge/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/rosmsg_tcp_bridge/launch/bridge.launch delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/rosmsg_tcp_bridge/package.xml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/rosmsg_tcp_bridge/src/bridge_node.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/traj_utils/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/traj_utils/include/traj_utils/plan_container.hpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/traj_utils/include/traj_utils/planning_visualization.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/traj_utils/include/traj_utils/polynomial_traj.h delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/traj_utils/msg/Bspline.msg delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/traj_utils/msg/DataDisp.msg delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/traj_utils/msg/MultiBsplines.msg delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/traj_utils/package.xml delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/traj_utils/src/planning_visualization.cpp delete mode 100644 src/无人机端代码/Modules/ego_planner_swarm/traj_utils/src/polynomial_traj.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/tutorial_demo/advanced/autonomous_landing/include/mission_utils.h delete mode 100644 src/无人机端代码/Modules/tutorial_demo/advanced/autonomous_landing/launch/autonomous_landing_all.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/advanced/autonomous_landing/src/autonomous_landing.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/advanced/find_aruco_marker/launch/find_aruco_marker_all.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/advanced/find_aruco_marker/src/find_aruco_marker.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/advanced/formation_control/launch/formation_control.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/advanced/formation_control/src/formation_control.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/advanced/siamrpn_track/launch/siamrpn_track_all.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/advanced/siamrpn_track/src/siamrpn_track.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/advanced/yolov5_track/launch/yolov5_track_all.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/body_xyz_pos_control/launch/body_xyz_pos_control.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/body_xyz_pos_control/scripts/body_xyz_pos_control.py delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/body_xyz_pos_control/src/body_xyz_pos_control.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/circular_trajectory_control/launch/circular_trajectory_control.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/circular_trajectory_control/scripts/circular_trajectory_control.py delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/circular_trajectory_control/src/circular_trajectory_control.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/enu_xyz_pos_control/launch/enu_xyz_pos_control.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/enu_xyz_pos_control/scripts/enu_xyz_pos_control.py delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/enu_xyz_pos_control/src/enu_xyz_pos_control.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/global_pos_control/launch/global_pos_control.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/global_pos_control/src/global_pos_control.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/takeoff_land/launch/takeoff_land.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/takeoff_land/launch/takeoff_land_liu.launch delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/takeoff_land/scripts/takeoff_land.py delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/takeoff_land/src/CMakeLists.txt delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/takeoff_land/src/takeoff_land.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/takeoff_land/src/takeoff_land_liu.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/basic/takeoff_land/src/takeoff_land_no_rc.cpp delete mode 100644 src/无人机端代码/Modules/tutorial_demo/package.xml diff --git a/src/无人机端代码/Modules/common/CMakeLists.txt b/src/无人机端代码/Modules/common/CMakeLists.txt deleted file mode 100644 index 66dd650a..00000000 --- a/src/无人机端代码/Modules/common/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -/opt/ros/melodic/share/catkin/cmake/toplevel.cmake \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/include/geometry_utils.h b/src/无人机端代码/Modules/common/include/geometry_utils.h deleted file mode 100644 index a9b77726..00000000 --- a/src/无人机端代码/Modules/common/include/geometry_utils.h +++ /dev/null @@ -1,248 +0,0 @@ -#ifndef __GEOMETRY_UTILS_H -#define __GEOMETRY_UTILS_H - -#include - -/* clang-format off */ -namespace geometry_utils { - -template -Scalar_t toRad(const Scalar_t& x) { - return x / 180.0 * M_PI; -} - -template -Scalar_t toDeg(const Scalar_t& x) { - return x * 180.0 / M_PI; -} - -template -Eigen::Matrix rotx(Scalar_t t) { - Eigen::Matrix R; - R(0, 0) = 1.0; - R(0, 1) = 0.0; - R(0, 2) = 0.0; - R(1, 0) = 0.0; - R(1, 1) = std::cos(t); - R(1, 2) = -std::sin(t); - R(2, 0) = 0.0; - R(2, 1) = std::sin(t); - R(2, 2) = std::cos(t); - - return R; -} - -template -Eigen::Matrix roty(Scalar_t t) { - Eigen::Matrix R; - R(0, 0) = std::cos(t); - R(0, 1) = 0.0; - R(0, 2) = std::sin(t); - R(1, 0) = 0.0; - R(1, 1) = 1.0; - R(1, 2) = 0; - R(2, 0) = -std::sin(t); - R(2, 1) = 0.0; - R(2, 2) = std::cos(t); - - return R; -} - -template -Eigen::Matrix rotz(Scalar_t t) { - Eigen::Matrix R; - R(0, 0) = std::cos(t); - R(0, 1) = -std::sin(t); - R(0, 2) = 0.0; - R(1, 0) = std::sin(t); - R(1, 1) = std::cos(t); - R(1, 2) = 0.0; - R(2, 0) = 0.0; - R(2, 1) = 0.0; - R(2, 2) = 1.0; - - return R; -} - -template -Eigen::Matrix ypr_to_R(const Eigen::DenseBase& ypr) { - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived); - EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime == 3, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE); - EIGEN_STATIC_ASSERT(Derived::ColsAtCompileTime == 1, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE); - - typename Derived::Scalar c, s; - - Eigen::Matrix Rz = Eigen::Matrix::Zero(); - typename Derived::Scalar y = ypr(0); - c = cos(y); - s = sin(y); - Rz(0, 0) = c; - Rz(1, 0) = s; - Rz(0, 1) = -s; - Rz(1, 1) = c; - Rz(2, 2) = 1; - - Eigen::Matrix Ry = Eigen::Matrix::Zero(); - typename Derived::Scalar p = ypr(1); - c = cos(p); - s = sin(p); - Ry(0, 0) = c; - Ry(2, 0) = -s; - Ry(0, 2) = s; - Ry(2, 2) = c; - Ry(1, 1) = 1; - - Eigen::Matrix Rx = Eigen::Matrix::Zero(); - typename Derived::Scalar r = ypr(2); - c = cos(r); - s = sin(r); - Rx(1, 1) = c; - Rx(2, 1) = s; - Rx(1, 2) = -s; - Rx(2, 2) = c; - Rx(0, 0) = 1; - - Eigen::Matrix R = Rz * Ry * Rx; - return R; -} - -template -Eigen::Matrix R_to_ypr(const Eigen::DenseBase& R) { - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived); - EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime == 3, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE); - EIGEN_STATIC_ASSERT(Derived::ColsAtCompileTime == 3, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE); - - Eigen::Matrix n = R.col(0); - Eigen::Matrix o = R.col(1); - Eigen::Matrix a = R.col(2); - - Eigen::Matrix ypr(3); - typename Derived::Scalar y = atan2(n(1), n(0)); - typename Derived::Scalar p = atan2(-n(2), n(0) * cos(y) + n(1) * sin(y)); - typename Derived::Scalar r = - atan2(a(0) * sin(y) - a(1) * cos(y), -o(0) * sin(y) + o(1) * cos(y)); - ypr(0) = y; - ypr(1) = p; - ypr(2) = r; - - return ypr; -} - -template -Eigen::Quaternion ypr_to_quaternion(const Eigen::DenseBase& ypr) { - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived); - EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime == 3, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE); - EIGEN_STATIC_ASSERT(Derived::ColsAtCompileTime == 1, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE); - - const typename Derived::Scalar cy = cos(ypr(0) / 2.0); - const typename Derived::Scalar sy = sin(ypr(0) / 2.0); - const typename Derived::Scalar cp = cos(ypr(1) / 2.0); - const typename Derived::Scalar sp = sin(ypr(1) / 2.0); - const typename Derived::Scalar cr = cos(ypr(2) / 2.0); - const typename Derived::Scalar sr = sin(ypr(2) / 2.0); - - Eigen::Quaternion q; - - q.w() = cr * cp * cy + sr * sp * sy; - q.x() = sr * cp * cy - cr * sp * sy; - q.y() = cr * sp * cy + sr * cp * sy; - q.z() = cr * cp * sy - sr * sp * cy; - - return q; -} - -template -Eigen::Matrix quaternion_to_ypr(const Eigen::Quaternion& q_) { - Eigen::Quaternion q = q_.normalized(); - - Eigen::Matrix ypr; - ypr(2) = atan2(2 * (q.w() * q.x() + q.y() * q.z()), 1 - 2 * (q.x() * q.x() + q.y() * q.y())); - ypr(1) = asin(2 * (q.w() * q.y() - q.z() * q.x())); - ypr(0) = atan2(2 * (q.w() * q.z() + q.x() * q.y()), 1 - 2 * (q.y() * q.y() + q.z() * q.z())); - - return ypr; -} - -template -Scalar_t get_yaw_from_quaternion(const Eigen::Quaternion& q) { - return quaternion_to_ypr(q)(0); -} - -template -Eigen::Quaternion yaw_to_quaternion(Scalar_t yaw) { - return Eigen::Quaternion(rotz(yaw)); -} - -template -Scalar_t normalize_angle(Scalar_t a) { - int cnt = 0; - while (true) { - cnt++; - - if (a < -M_PI) { - a += M_PI * 2.0; - } else if (a > M_PI) { - a -= M_PI * 2.0; - } - - if (-M_PI <= a && a <= M_PI) { - break; - }; - - assert(cnt < 10 && "[geometry_utils/geometry_msgs] INVALID INPUT ANGLE"); - } - - return a; -} - -template -Scalar_t angle_add(Scalar_t a, Scalar_t b) { - Scalar_t c = a + b; - c = normalize_angle(c); - assert(-M_PI <= c && c <= M_PI); - return c; -} - -template -Scalar_t yaw_add(Scalar_t a, Scalar_t b) { - return angle_add(a, b); -} - -template -Eigen::Matrix get_skew_symmetric(const Eigen::DenseBase& v) { - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived); - EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime == 3, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE); - EIGEN_STATIC_ASSERT(Derived::ColsAtCompileTime == 1, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE); - - Eigen::Matrix M; - M.setZero(); - M(0, 1) = -v(2); - M(0, 2) = v(1); - M(1, 0) = v(2); - M(1, 2) = -v(0); - M(2, 0) = -v(1); - M(2, 1) = v(0); - return M; -} - -template -Eigen::Matrix from_skew_symmetric(const Eigen::DenseBase& M) { - EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived); - EIGEN_STATIC_ASSERT(Derived::RowsAtCompileTime == 3, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE); - EIGEN_STATIC_ASSERT(Derived::ColsAtCompileTime == 3, THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE); - - Eigen::Matrix v; - v(0) = M(2, 1); - v(1) = -M(2, 0); - v(2) = M(1, 0); - - assert(v.isApprox(Eigen::Matrix(-M(1, 2), M(0, 2), -M(0, 1)))); - - return v; -} - - -} // end of namespace geometry_utils -/* clang-format on */ - -#endif diff --git a/src/无人机端代码/Modules/common/include/math_utils.h b/src/无人机端代码/Modules/common/include/math_utils.h deleted file mode 100644 index d46a57ed..00000000 --- a/src/无人机端代码/Modules/common/include/math_utils.h +++ /dev/null @@ -1,127 +0,0 @@ -#ifndef MATH_UTILS_H -#define MATH_UTILS_H - -#include -#include - -using namespace std; - -// 四元数转欧拉角 -Eigen::Vector3d quaternion_to_rpy2(const Eigen::Quaterniond &q) -{ - // YPR - ZYX - return q.toRotationMatrix().eulerAngles(2, 1, 0).reverse(); -} - -// 从(roll,pitch,yaw)创建四元数 by a 3-2-1 intrinsic Tait-Bryan rotation sequence -Eigen::Quaterniond quaternion_from_rpy(const Eigen::Vector3d &rpy) -{ - // YPR - ZYX - return Eigen::Quaterniond( - Eigen::AngleAxisd(rpy.z(), Eigen::Vector3d::UnitZ()) * - Eigen::AngleAxisd(rpy.y(), Eigen::Vector3d::UnitY()) * - Eigen::AngleAxisd(rpy.x(), Eigen::Vector3d::UnitX()) - ); -} - -// 将四元数转换至(roll,pitch,yaw) by a 3-2-1 intrinsic Tait-Bryan rotation sequence -// https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles -// q0 q1 q2 q3 -// w x y z -Eigen::Vector3d quaternion_to_euler(const Eigen::Quaterniond &q) -{ - float quat[4]; - quat[0] = q.w(); - quat[1] = q.x(); - quat[2] = q.y(); - quat[3] = q.z(); - - Eigen::Vector3d ans; - ans[0] = atan2(2.0 * (quat[3] * quat[2] + quat[0] * quat[1]), 1.0 - 2.0 * (quat[1] * quat[1] + quat[2] * quat[2])); - ans[1] = asin(2.0 * (quat[2] * quat[0] - quat[3] * quat[1])); - ans[2] = atan2(2.0 * (quat[3] * quat[0] + quat[1] * quat[2]), 1.0 - 2.0 * (quat[2] * quat[2] + quat[3] * quat[3])); - return ans; -} - -//旋转矩阵转欧拉角 -void rotation_to_euler(const Eigen::Matrix3d& dcm, Eigen::Vector3d& euler_angle) -{ - double phi_val = atan2(dcm(2, 1), dcm(2, 2)); - double theta_val = asin(-dcm(2, 0)); - double psi_val = atan2(dcm(1, 0), dcm(0, 0)); - double pi = M_PI; - - if (fabs(theta_val - pi / 2.0) < 1.0e-3) { - phi_val = 0.0; - psi_val = atan2(dcm(1, 2), dcm(0, 2)); - - } else if (fabs(theta_val + pi / 2.0) < 1.0e-3) { - phi_val = 0.0; - psi_val = atan2(-dcm(1, 2), -dcm(0, 2)); - } - - euler_angle(0) = phi_val; - euler_angle(1) = theta_val; - euler_angle(2) = psi_val; -} - -//constrain_function -float constrain_function(float data, float Max) -{ - if(abs(data)>Max) - { - return (data > 0) ? Max : -Max; - } - else - { - return data; - } -} - -//constrain_function2 -float constrain_function2(float data, float Min,float Max) -{ - if(data > Max) - { - return Max; - } - else if (data < Min) - { - return Min; - }else - { - return data; - } -} - -//sign_function -float sign_function(float data) -{ - if(data>0) - { - return 1.0; - } - else if(data<0) - { - return -1.0; - } - else if(data == 0) - { - return 0.0; - } -} - -// min function -float min(float data1,float data2) -{ - if(data1>=data2) - { - return data2; - } - else - { - return data1; - } -} - -#endif \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/include/printf_utils.h b/src/无人机端代码/Modules/common/include/printf_utils.h deleted file mode 100644 index 941fbf68..00000000 --- a/src/无人机端代码/Modules/common/include/printf_utils.h +++ /dev/null @@ -1,132 +0,0 @@ -#ifndef PRINTF_UTILS_H -#define PRINTF_UTILS_H - -#include -#include -#include -#include -#include -using namespace std; - -#define NUM_POINT 2 // 打印小数点 - -#define RED "\033[0;1;31m" -#define GREEN "\033[0;1;32m" -#define YELLOW "\033[0;1;33m" -#define BLUE "\033[0;1;34m" -#define PURPLE "\033[0;1;35m" -#define DEEPGREEN "\033[0;1;36m" -#define WHITE "\033[0;1;37m" - -#define RED_IN_WHITE "\033[0;47;31m" -#define GREEN_IN_WHITE "\033[0;47;32m" -#define YELLOW_IN_WHITE "\033[0;47;33m" - -#define TAIL "\033[0m" - -class Print -{ -public: - Print(float interval = 0, std::string color = TAIL) - : interval(interval), past_ts(std::chrono::system_clock::now()), color(color) - { - //固定的浮点显示 - std::cout.setf(ios::fixed); - // setprecision(n) 设显示小数精度为n位 - std::cout << std::setprecision(2); - //左对齐 - std::cout.setf(ios::left); - // 强制显示小数点 - std::cout.setf(ios::showpoint); - // 强制显示符号 - std::cout.setf(ios::showpos); - }; - - template - void operator()(T &&msg) - { - std::chrono::system_clock::time_point now_ts = std::chrono::system_clock::now(); - auto dt = std::chrono::duration_cast(now_ts - past_ts).count(); - - if (this != s_object_name) - { - std::cout << std::endl; - s_object_name = this; - } - - if (interval >= 0) - { - // std::cout << this->interval << std::endl; - if (dt < this->interval * 1000) - return; - std::cout << color << msg << TAIL << std::endl; - } - else - { - if (dt < 0.1 * 1000) - return; - char now_char; - switch (times) - { - case 0: - now_char = '\\'; - break; - case 1: - now_char = '|'; - break; - case 2: - now_char = '/'; - break; - case 3: - now_char = '-'; - break; - } - times = ++times % 4; - std::cout << color << "\r " << now_char << " " << msg << TAIL << std::flush; - } - this->past_ts = now_ts; - }; - - float interval; - -private: - std::chrono::system_clock::time_point past_ts; - std::string color; - static void *s_object_name; - unsigned int times = 0; -}; - -void *Print::s_object_name = nullptr; - -#define PRINTF_UTILS_CONCAT_(x, y) x##y -#define PRINTF_UTILS_CONCAT(x, y) PRINTF_UTILS_CONCAT_(x, y) - -#define PRINTF_UTILS_PCOUT_(interval, color, msg, sign) \ - static Print PRINTF_UTILS_CONCAT(print, sign)(interval, color); \ - PRINTF_UTILS_CONCAT(print, sign) \ - (msg) - -#define PCOUT(interval, color, msg) PRINTF_UTILS_PCOUT_(interval, color, msg, __LINE__) - -// Example: -// cout << GREEN << "Test for Green text." << TAIL < Hightlight color.\033[0m"); -// 其中41的位置代表字的背景色, 30的位置是代表字的颜色,0 是字的一些特殊属性,0代表默认关闭,一些其他属性如闪烁、下划线等。 - -// ROS_INFO_STREAM_ONCE ("\033[1;32m---->Setting to OFFBOARD Mode....\033[0m");//绿色只打印一次 - -#endif diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/CMakeLists.txt b/src/无人机端代码/Modules/common/prometheus_msgs/CMakeLists.txt deleted file mode 100644 index 3c852583..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/CMakeLists.txt +++ /dev/null @@ -1,92 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(prometheus_msgs) - -find_package(catkin REQUIRED COMPONENTS - message_generation - roscpp - geometry_msgs - actionlib_msgs - sensor_msgs - nav_msgs - std_msgs - std_srvs - tf2_ros - tf2_eigen - mavros_msgs -) - -find_package(Boost REQUIRED COMPONENTS system) - -add_message_files( - DIRECTORY msg - FILES - UAVState.msg - MultiUAVState.msg - UAVCommand.msg - UAVControlState.msg - UAVSetup.msg - TextInfo.msg - GlobalAruco.msg - - ArucoInfo.msg - MultiArucoInfo.msg - DetectionInfo.msg - MultiDetectionInfo.msg - BoundingBox.msg - BoundingBoxes.msg - - SwarmCommand.msg - FormationAssign.msg - OffsetPose.msg - GPSData.msg - -#communication - DetectionInfoSub.msg - GimbalControl.msg - GimbalState.msg - MultiDetectionInfoSub.msg - RheaCommunication.msg - RheaGPS.msg - RheaState.msg - VisionDiff.msg - WindowPosition.msg -) - -add_action_files( - DIRECTORY action - FILES - CheckForObjects.action -) - -generate_messages( - DEPENDENCIES - actionlib_msgs - geometry_msgs - sensor_msgs - std_msgs -) - -catkin_package( - CATKIN_DEPENDS - message_runtime - actionlib_msgs - geometry_msgs - sensor_msgs - message_runtime - std_msgs -) - -include_directories( - include - ${catkin_INCLUDE_DIRS} -) - - -install(DIRECTORY include/${PROJECT_NAME}/ - DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} - FILES_MATCHING PATTERN "*.h" -) - -install(DIRECTORY launch/ - DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch -) diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/action/CheckForObjects.action b/src/无人机端代码/Modules/common/prometheus_msgs/action/CheckForObjects.action deleted file mode 100644 index ab6b2b6a..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/action/CheckForObjects.action +++ /dev/null @@ -1,13 +0,0 @@ -# Check if objects in image - -# Goal definition -int16 id -sensor_msgs/Image image - ---- -# Result definition -int16 id -prometheus_msgs/BoundingBoxes bounding_boxes - ---- -# Feedback definition diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/ArucoInfo.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/ArucoInfo.msg deleted file mode 100644 index afd65e01..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/ArucoInfo.msg +++ /dev/null @@ -1,17 +0,0 @@ -std_msgs/Header header - -## aruco编码 -int32 aruco_num - -## 是否检测到目标 -bool detected - -## 目标位置-相机坐标系-(x,y,z) -## 从相机往前看,物体在相机右方x为正,下方y为正,前方z为正 -float32[3] position - -## 目标姿态-四元数-(qx,qy,qz,qw) -float32[4] orientation - -## 视线角度-相机系下-(右方x角度为正,下方y角度为正) -float32[2] sight_angle diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/BoundingBox.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/BoundingBox.msg deleted file mode 100644 index 9b738721..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/BoundingBox.msg +++ /dev/null @@ -1,8 +0,0 @@ -# 目标框相关信息 -string Class # 类别 -float64 probability # 置信度 -int64 xmin # 右上角 -int64 ymin -int64 xmax # 坐下角 -int64 ymax - diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/BoundingBoxes.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/BoundingBoxes.msg deleted file mode 100644 index 3ec3fe82..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/BoundingBoxes.msg +++ /dev/null @@ -1,3 +0,0 @@ -Header header -Header image_header -BoundingBox[] bounding_boxes diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/DetectionInfo.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/DetectionInfo.msg deleted file mode 100644 index 452abd6a..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/DetectionInfo.msg +++ /dev/null @@ -1,33 +0,0 @@ -# 目标信息 - -std_msgs/Header header - -## 目标类别名称 -string object_name - -## 是否检测到目标 -bool detected - -## 0表示相机坐标系, 1表示机体坐标系, 2表示惯性坐标系 -int32 frame - -## 目标位置[相机系下:右方x为正,下方y为正,前方z为正] -float32[3] position - -## 目标姿态-欧拉角-(z,y,x) -float32[3] attitude - -## 目标姿态-四元数-(qx,qy,qz,qw) -float32[4] attitude_q - -## 视线角度[相机系下:右方x角度为正,下方y角度为正] -float32[2] sight_angle - -## 像素位置[相机系下:右方x为正,下方y为正] -int32[2] pixel_position - -## 偏航角误差 -float32 yaw_error - -## 类别 -int32 category diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/DetectionInfoSub.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/DetectionInfoSub.msg deleted file mode 100644 index 779a4bcd..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/DetectionInfoSub.msg +++ /dev/null @@ -1,9 +0,0 @@ -#目标框的位置(主要斜对角两个点) -float32 left -float32 top -float32 bot -float32 right - - -## TRACK TARGET(目标框ID) -int32 trackIds diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/FormationAssign.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/FormationAssign.msg deleted file mode 100644 index 64f7ccd3..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/FormationAssign.msg +++ /dev/null @@ -1,5 +0,0 @@ -#队形位置 -geometry_msgs/Point[] formation_poses - -#位置点是否选取 -bool[] assigned \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/GPSData.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/GPSData.msg deleted file mode 100644 index 48cba1d6..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/GPSData.msg +++ /dev/null @@ -1,3 +0,0 @@ -float64 latitude -float64 longitude -float64 altitude \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/GimbalControl.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/GimbalControl.msg deleted file mode 100644 index 0b32855a..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/GimbalControl.msg +++ /dev/null @@ -1,33 +0,0 @@ -Header header -uint8 Id -#control mode 0:nothong 1:angle 2:speed 3:home postion -uint8 rpyMode -uint8 manual = 1 -uint8 home = 2 -uint8 hold = 3 # 不控制 -uint8 fellow = 4 #fellow吊舱跟随无人机移动 - -uint8 roll -uint8 yaw -uint8 pitch - -uint8 noCtl = 0 -uint8 velocityCtl = 1 -uint8 angleCtl = 2 - -float32 rValue # deg 单位 -float32 yValue # deg -float32 pValue # deg - - -# focus -uint8 focusMode # 默认值 -uint8 focusStop = 1 -uint8 focusOut = 2 -uint8 focusIn = 3 - -# zoom -uint8 zoomMode # 默认值 -uint8 zoomStop = 1 -uint8 zoomOut = 2 -uint8 zoomIn = 3 \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/GimbalState.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/GimbalState.msg deleted file mode 100644 index 1a579d2f..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/GimbalState.msg +++ /dev/null @@ -1,40 +0,0 @@ -Header header -uint8 Id - -# 0: 发一句,回一句: 此状态下,相机倍数zoomVal有效,imuAngleVel为估算直 -# 1: 发一句,一直回复: 此状态下,相机倍数zoomVal失效,imuAngleVel为真直 -uint8 feedbackMode - -#mode -# 0: 手动控制 -# 1: home -# 2: tracking -# 3: yaw follow 吊舱跟随无人机移动 -# 4: hold 吊舱不跟随无人机 -# 5: search 自动移动旋转 -uint8 mode - -# 是否视频录制 -bool isRecording - -# 是否开启自动缩放(VisionDiff需要指定面积才能生效) -# 0: 保持 -# 1: 放大 -# 2: 缩小 -# 3: 自动 -uint8 zoomState - -# 当前所处倍数 -float32 zoomVal - -#roll,pitch,yaw -float32[3] imuAngle - -#Current gimbal joint angles(roll,pitch,yaw), published at 30 Hz. -float32[3] rotorAngle - -# rpy_vel 角速度 -float32[3] imuAngleVel - -# rpy_tgt 目标角度 -float32[3] rotorAngleTarget \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/GlobalAruco.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/GlobalAruco.msg deleted file mode 100644 index 328af1b1..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/GlobalAruco.msg +++ /dev/null @@ -1,12 +0,0 @@ - -std_msgs/Header header - -ArucoInfo Aruco1 -ArucoInfo Aruco2 -ArucoInfo Aruco3 -ArucoInfo Aruco4 -ArucoInfo Aruco5 -ArucoInfo Aruco6 -ArucoInfo Aruco7 -ArucoInfo Aruco8 -ArucoInfo Aruco9 diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiArucoInfo.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiArucoInfo.msg deleted file mode 100644 index 47310801..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiArucoInfo.msg +++ /dev/null @@ -1,7 +0,0 @@ -std_msgs/Header header - -## 检测到的aruco码数量 -int32 num_arucos - -## 每个aruco码的检测结果 -ArucoInfo[] aruco_infos diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiDetectionInfo.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiDetectionInfo.msg deleted file mode 100644 index 640d91f2..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiDetectionInfo.msg +++ /dev/null @@ -1,10 +0,0 @@ -Header header - -## 检测到的目标数量 -int32 num_objs - -## Detecting or Tracking (0:detect, 1:track) -int32 detect_or_track - -## 每个目标的检测结果 -DetectionInfo[] detection_infos diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiDetectionInfoSub.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiDetectionInfoSub.msg deleted file mode 100644 index bc9cd466..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiDetectionInfoSub.msg +++ /dev/null @@ -1,10 +0,0 @@ -std_msgs/Header header - -#模式:0:空闲 2.simaRPN 3.deepsort/sort -uint8 mode - -## 检测到的目标数量 -int32 num_objs - -## 每个目标的检测结果 -DetectionInfoSub[] detection_infos diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiUAVState.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiUAVState.msg deleted file mode 100644 index 81b2762e..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/MultiUAVState.msg +++ /dev/null @@ -1,7 +0,0 @@ -std_msgs/Header header - -## -int32 uav_num - -## 从1开始 -UAVState[] uav_state_all diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/OffsetPose.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/OffsetPose.msg deleted file mode 100644 index 776467e3..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/OffsetPose.msg +++ /dev/null @@ -1,3 +0,0 @@ -uint8 uav_id -float32 x -float32 y \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaCommunication.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaCommunication.msg deleted file mode 100644 index dff2f07e..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaCommunication.msg +++ /dev/null @@ -1,18 +0,0 @@ -std_msgs/Header header - -uint8 Mode #控制模式 - -##控制模式类型枚举 -uint8 Stop=0 -uint8 Forward=1 -uint8 Left=2 -uint8 Right=3 -uint8 Back=4 -uint8 CMD=5 -uint8 Waypoint=6 - -float64 linear -float64 angular - -## 航点 -RheaGPS[] waypoint diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaGPS.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaGPS.msg deleted file mode 100644 index 48cba1d6..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaGPS.msg +++ /dev/null @@ -1,3 +0,0 @@ -float64 latitude -float64 longitude -float64 altitude \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaState.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaState.msg deleted file mode 100644 index 26cf3bb5..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/RheaState.msg +++ /dev/null @@ -1,19 +0,0 @@ -std_msgs/Header header -uint8 rhea_id - -## 速度 -float64 linear -float64 angular - -## 航向角 -float64 yaw - -## GPS -float32 latitude #纬度 -float32 longitude #经度 -float32 altitude #高度 - -float32[3] position - -## Status -float32 battery_voltage \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/SwarmCommand.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/SwarmCommand.msg deleted file mode 100644 index 0182f750..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/SwarmCommand.msg +++ /dev/null @@ -1,51 +0,0 @@ -std_msgs/Header header - -## 消息来源 -string source - -## 编队套件数量 -uint8 swarm_num - -uint8 swarm_location_source - -# enum loc 定位来源枚举 -uint8 mocap = 0 -uint8 gps = 4 -uint8 rtk = 5 -uint8 uwb = 6 - -## 命令 -uint8 Swarm_CMD -# enum CMD 控制模式枚举 -uint8 Ready=0 -uint8 Init=1 -uint8 Start=2 -uint8 Hold=3 -uint8 Stop=4 -uint8 Formation=5 - -uint8 Follow=11 -uint8 Search=12 -uint8 Attack=13 - -## 编队控制参考量 -float32[3] leader_pos -float32[2] leader_vel -float32 swarm_size -uint8 swarm_shape -uint8 One_column=0 -uint8 Triangle=1 -uint8 Square=2 -uint8 Circular=3 - -## 搜索控制参考量 -float32 target_area_x_min ## [m] -float32 target_area_y_min ## [m] -float32 target_area_x_max ## [m] -float32 target_area_y_max ## [m] - -## 攻击控制参考量 -float32[3] attack_target_pos ## [m] - -#队形位置 -geometry_msgs/Point[] formation_poses diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/TextInfo.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/TextInfo.msg deleted file mode 100644 index 25035901..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/TextInfo.msg +++ /dev/null @@ -1,12 +0,0 @@ -#INFO:正常运行状况下反馈给地面站的信息,例如程序正常启动,状态切换的提示信息等. -uint8 INFO=0 -#WARN:无人机或软件程序出现意外情况,依然能正常启动或继续执行任务,小概率会出现危险状况,例如无人机RTK无法维持退出到GPS,视觉跟踪目标突然丢失重新搜寻目标等. -uint8 WARN=1 -#ERROR:无人机或软件程序出现重大意外情况,无法正常启动或继续执行任务,极有可能会出现危险状况,需要中断任务以及人为接管控制无人机,例如通信中断,无人机定位发散,ROS节点无法正常启动等. -uint8 ERROR=2 -#FATAL:任务执行过程中,软件崩溃或无人机飞控崩溃导致无人机完全失控,需要迅速人为接管控制无人机降落减少炸机损失. -uint8 FATAL=3 - -std_msgs/Header header -uint8 MessageType -string Message \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVCommand.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVCommand.msg deleted file mode 100644 index 7bc358ca..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVCommand.msg +++ /dev/null @@ -1,38 +0,0 @@ -std_msgs/Header header - -## 控制命令的模式 -uint8 Agent_CMD -# Agent_CMD 枚举 -uint8 Init_Pos_Hover=1 # home点上方悬停 -uint8 Current_Pos_Hover=2 # 当前位置上方悬停 -uint8 Land=3 -uint8 Move=4 -uint8 User_Mode1=5 - -## 移动命令下的子模式 -uint8 Move_mode -## 移动命令下的子模式枚举 -uint8 XYZ_POS = 0 ### 惯性系定点控制 -uint8 XY_VEL_Z_POS = 1 ### 惯性系定高速度控制 -uint8 XYZ_VEL = 2 ### 惯性系速度控制 -uint8 XYZ_POS_BODY = 3 ### 机体系位置控制 -uint8 XYZ_VEL_BODY = 4 ### 机体系速度控制 -uint8 XY_VEL_Z_POS_BODY = 5 ### 机体系定高速度控制 -uint8 TRAJECTORY = 6 ### 轨迹追踪控制 -uint8 XYZ_ATT = 7 ### 姿态控制(来自外部控制器) -uint8 LAT_LON_ALT = 8 ### 绝对坐标系下的经纬度 - -## 控制参考量 -float32[3] position_ref ## [m] -float32[3] velocity_ref ## [m/s] -float32[3] acceleration_ref ## [m/s^2] -float32 yaw_ref ## [rad] -bool Yaw_Rate_Mode ## True 代表控制偏航角速率 -float32 yaw_rate_ref ## [rad/s] -float32[4] att_ref ## [rad] + [0-1] -float64 latitude ## 无人机经度、纬度、高度 -float64 longitude ## 无人机经度、纬度、高度 -float64 altitude ## 无人机经度、纬度、高度 - -## 控制命令的编号 防止接收到错误命令, 编号应该逐次递加 -uint32 Command_ID \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVControlState.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVControlState.msg deleted file mode 100644 index 02b0a369..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVControlState.msg +++ /dev/null @@ -1,23 +0,0 @@ -std_msgs/Header header - -## 无人机编号 -uint8 uav_id - -## 无人机控制状态 -uint8 control_state -## 状态枚举 -uint8 INIT=0 -uint8 RC_POS_CONTROL=1 -uint8 COMMAND_CONTROL=2 -uint8 LAND_CONTROL=3 - -## 无人机控制器标志量 -uint8 pos_controller -## 状态枚举 -uint8 PX4_ORIGIN=0 -uint8 PID=1 -uint8 UDE=2 -uint8 NE=3 - -# 无人机安全保护触发标志量 -bool failsafe diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVSetup.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVSetup.msg deleted file mode 100644 index 982d6fd0..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVSetup.msg +++ /dev/null @@ -1,17 +0,0 @@ -std_msgs/Header header - -## 无人机Setup类型(可用于模拟遥控器) -uint8 cmd -uint8 ARMING = 0 -uint8 SET_PX4_MODE = 1 -uint8 REBOOT_PX4 = 2 -uint8 SET_CONTROL_MODE = 3 - -bool arming - -## PX4模式名查询:http://wiki.ros.org/mavros/CustomModes -## 常用模式名:OFFBOARD,AUTO.LAND,AUTO.RTL,POSCTL -string px4_mode - -## INIT,MANUAL_CONTROL,HOVER_CONTROL,COMMAND_CONTROL,LAND_CONTROL -string control_state diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVState.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVState.msg deleted file mode 100644 index 1974c4f1..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/UAVState.msg +++ /dev/null @@ -1,59 +0,0 @@ -std_msgs/Header header - -## 无人机编号 -uint8 uav_id - -## 机载电脑是否连接上飞控,true已连接,false则不是 -bool connected -## 是否解锁,true为已解锁,false则不是 -bool armed -## PX4飞控当前飞行模式 int8 -string mode -## 无人机定位来源 -uint8 location_source -## 定位来源枚举 -uint8 MOCAP=0 -uint8 T265=1 -uint8 GAZEBO=2 -uint8 FAKE_ODOM=3 -uint8 GPS = 4 -uint8 RTK = 5 -uint8 UWB = 6 - -## odom标志位 -bool odom_valid - -## GPS状态,变量对应状态可参考mavros_msgs/GPSRAW中的fix_type -uint8 gps_status -## GPS状态枚举 -uint8 GPS_FIX_TYPE_NO_GPS=0 -uint8 GPS_FIX_TYPE_NO_FIX=1 -uint8 GPS_FIX_TYPE_2D_FIX=2 -uint8 GPS_FIX_TYPE_3D_FIX=3 -uint8 GPS_FIX_TYPE_DGPS=4 -uint8 GPS_FIX_TYPE_RTK_FLOATR=5 -uint8 GPS_FIX_TYPE_RTK_FIXEDR=6 -uint8 GPS_FIX_TYPE_STATIC=7 -uint8 GPS_FIX_TYPE_PPP=8 - -## 无人机位置、速度、姿态 -float32[3] position ## [m] -## 无人机经度、纬度、高度 -float32 latitude -float32 longitude -float32 altitude -## 无人机速度、姿态 -float32[3] velocity ## [m/s] -## 无人机姿态(欧拉角、四元数) -float32[3] attitude ## [rad] -geometry_msgs/Quaternion attitude_q ## 四元数 -## 无人机姿态角速度 -float32[3] attitude_rate ## [rad/s] -## 无人机电池状态 -float32 battery_state ## [V] -float32 battery_percetage ## [0-1] - - - - - \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/VisionDiff.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/VisionDiff.msg deleted file mode 100644 index d47e1aca..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/VisionDiff.msg +++ /dev/null @@ -1,28 +0,0 @@ -uint8 Id -uint8 detect - -uint16 objectX # 左上角 -uint16 objectY # 左上角 -uint16 objectWidth -uint16 objectHeight - -uint16 frameWidth -uint16 frameHeight - -# Gimbal 跟踪pid -float32 kp -float32 ki -float32 kd - -int8 ctlMode # 0: yaw+pitch, 1: roll+pitch 3:混合(未实现) -int8 yawPitch = 0 -int8 rollPitch = 1 -int8 mix=3 - -# 用于自动缩放 -float32 currSize #框选近大远小 -float32 maxSize -float32 minSize #框选大小 - -float32 trackIgnoreError -bool autoZoom \ No newline at end of file diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/msg/WindowPosition.msg b/src/无人机端代码/Modules/common/prometheus_msgs/msg/WindowPosition.msg deleted file mode 100644 index 8b4bcb4b..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/msg/WindowPosition.msg +++ /dev/null @@ -1,20 +0,0 @@ -std_msgs/Header header - -#模式:0:空闲 1.kcf 3.deepsort/sort(点击的id) -uint8 mode - - -#波门位置X,#波门位置Y(kcf,点击画面的功能的时候使用),左上角为(0,0) -int16 origin_x -int16 origin_y -int16 width -int16 height - -#波门位置X,#波门位置Y -#int16 window_position_x = origin_x + width/2 -#int16 window_position_y = origin_y + height/2 -int16 window_position_x -int16 window_position_y - -#算法检测结果的ID -int32 track_id diff --git a/src/无人机端代码/Modules/common/prometheus_msgs/package.xml b/src/无人机端代码/Modules/common/prometheus_msgs/package.xml deleted file mode 100644 index d9695c65..00000000 --- a/src/无人机端代码/Modules/common/prometheus_msgs/package.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - prometheus_msgs - 0.0.0 - The prometheus_msgs package - - Yuhua Qi - - TODO - - message_generation - message_runtime - catkin - std_msgs - actionlib_msgs - std_msgs - actionlib_msgs - std_msgs - actionlib_msgs - geometry_msgs - geometry_msgs - geometry_msgs - sensor_msgs - sensor_msgs - sensor_msgs - - - - - diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/CMakeLists.txt b/src/无人机端代码/Modules/common/quadrotor_msgs/CMakeLists.txt deleted file mode 100644 index f82385d3..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/CMakeLists.txt +++ /dev/null @@ -1,50 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(quadrotor_msgs) - -find_package(catkin REQUIRED COMPONENTS - roscpp - nav_msgs - geometry_msgs - message_generation -) - -set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) - -include_directories( - ${catkin_INCLUDE_DIRS} - include - ) - - -add_message_files( - FILES - AuxCommand.msg - Corrections.msg - Gains.msg - OutputData.msg - PositionCommand.msg - PPROutputData.msg - Serial.msg - SO3Command.msg - StatusData.msg - TRPYCommand.msg - Odometry.msg - PolynomialTrajectory.msg - LQRTrajectory.msg - Px4ctrlDebug.msg -) - -generate_messages( - DEPENDENCIES - geometry_msgs - nav_msgs -) - -catkin_package( - CATKIN_DEPENDS message_runtime -) - -find_package(Eigen3 REQUIRED) -include_directories(${EIGEN3_INCLUDE_DIR}) - - diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/AuxCommand.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/AuxCommand.msg deleted file mode 100644 index f59bf356..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/AuxCommand.msg +++ /dev/null @@ -1,5 +0,0 @@ -float64 current_yaw -float64 kf_correction -float64[2] angle_corrections# Trims for roll, pitch -bool enable_motors -bool use_external_yaw diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Corrections.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Corrections.msg deleted file mode 100644 index e0f4e888..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Corrections.msg +++ /dev/null @@ -1,2 +0,0 @@ -float64 kf_correction -float64[2] angle_corrections diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Gains.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Gains.msg deleted file mode 100644 index f5d10a33..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Gains.msg +++ /dev/null @@ -1,4 +0,0 @@ -float64 Kp -float64 Kd -float64 Kp_yaw -float64 Kd_yaw diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/LQRTrajectory.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/LQRTrajectory.msg deleted file mode 100644 index 0a34e9b6..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/LQRTrajectory.msg +++ /dev/null @@ -1,30 +0,0 @@ -Header header - -# the trajectory id, starts from "1". -uint32 trajectory_id - -# the action command for trajectory server. -uint32 ACTION_ADD = 1 -uint32 ACTION_ABORT = 2 -uint32 ACTION_WARN_START = 3 -uint32 ACTION_WARN_FINAL = 4 -uint32 ACTION_WARN_IMPOSSIBLE = 5 -uint32 action - -# the weight coefficient of the control effort -float64 r - -# the yaw command -float64 start_yaw -float64 final_yaw - -# the initial and final state -float64[6] s0 -float64[3] ut - -float64[6] sf - -# the optimal arrival time -float64 t_f - -string debug_info diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Odometry.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Odometry.msg deleted file mode 100644 index 3272d71a..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Odometry.msg +++ /dev/null @@ -1,8 +0,0 @@ -uint8 STATUS_ODOM_VALID=0 -uint8 STATUS_ODOM_INVALID=1 -uint8 STATUS_ODOM_LOOPCLOSURE=2 - -nav_msgs/Odometry curodom -nav_msgs/Odometry kfodom -uint32 kfid -uint8 status diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/OutputData.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/OutputData.msg deleted file mode 100644 index ac958880..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/OutputData.msg +++ /dev/null @@ -1,12 +0,0 @@ -Header header -uint16 loop_rate -float64 voltage -geometry_msgs/Quaternion orientation -geometry_msgs/Vector3 angular_velocity -geometry_msgs/Vector3 linear_acceleration -float64 pressure_dheight -float64 pressure_height -geometry_msgs/Vector3 magnetic_field -uint8[8] radio_channel -#uint8[4] motor_rpm -uint8 seq diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/PPROutputData.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/PPROutputData.msg deleted file mode 100644 index 70434a02..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/PPROutputData.msg +++ /dev/null @@ -1,16 +0,0 @@ -Header header -uint16 quad_time -float64 des_thrust -float64 des_roll -float64 des_pitch -float64 des_yaw -float64 est_roll -float64 est_pitch -float64 est_yaw -float64 est_angvel_x -float64 est_angvel_y -float64 est_angvel_z -float64 est_acc_x -float64 est_acc_y -float64 est_acc_z -uint16[4] pwm diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/PolynomialTrajectory.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/PolynomialTrajectory.msg deleted file mode 100644 index 0aab297a..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/PolynomialTrajectory.msg +++ /dev/null @@ -1,28 +0,0 @@ -Header header - -# the trajectory id, starts from "1". -uint32 trajectory_id - -# the action command for trajectory server. -uint32 ACTION_ADD = 1 -uint32 ACTION_ABORT = 2 -uint32 ACTION_WARN_START = 3 -uint32 ACTION_WARN_FINAL = 4 -uint32 ACTION_WARN_IMPOSSIBLE = 5 -uint32 action - -# the order of trajectory. -uint32 num_order -uint32 num_segment - -# the polynomial coecfficients of the trajectory. -float64 start_yaw -float64 final_yaw -float64[] coef_x -float64[] coef_y -float64[] coef_z -float64[] time -float64 mag_coeff -uint32[] order - -string debug_info diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/PositionCommand.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/PositionCommand.msg deleted file mode 100644 index 49c6fa1d..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/PositionCommand.msg +++ /dev/null @@ -1,22 +0,0 @@ -Header header -geometry_msgs/Point position -geometry_msgs/Vector3 velocity -geometry_msgs/Vector3 acceleration -geometry_msgs/Vector3 jerk -float64 yaw -float64 yaw_dot -float64[3] kx -float64[3] kv - -uint32 trajectory_id - -uint8 TRAJECTORY_STATUS_EMPTY = 0 -uint8 TRAJECTORY_STATUS_READY = 1 -uint8 TRAJECTORY_STATUS_COMPLETED = 3 -uint8 TRAJECTROY_STATUS_ABORT = 4 -uint8 TRAJECTORY_STATUS_ILLEGAL_START = 5 -uint8 TRAJECTORY_STATUS_ILLEGAL_FINAL = 6 -uint8 TRAJECTORY_STATUS_IMPOSSIBLE = 7 - -# Its ID number will start from 1, allowing you comparing it with 0. -uint8 trajectory_flag diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Px4ctrlDebug.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Px4ctrlDebug.msg deleted file mode 100644 index f28ba2c3..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Px4ctrlDebug.msg +++ /dev/null @@ -1,37 +0,0 @@ -Header header - -float64 des_p_x -float64 des_p_y -float64 des_p_z - -float64 des_v_x -float64 des_v_y -float64 des_v_z - -float64 fb_a_x -float64 fb_a_y -float64 fb_a_z - -float64 des_a_x -float64 des_a_y -float64 des_a_z - -float64 des_q_x -float64 des_q_y -float64 des_q_z -float64 des_q_w - -float64 des_thr -float64 thr2acc -float64 thr_scale_compensate -float64 voltage - -float64 err_axisang_x -float64 err_axisang_y -float64 err_axisang_z -float64 err_axisang_ang - -float64 fb_rate_x -float64 fb_rate_y -float64 fb_rate_z - diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/SO3Command.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/SO3Command.msg deleted file mode 100644 index d3868efb..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/SO3Command.msg +++ /dev/null @@ -1,6 +0,0 @@ -Header header -geometry_msgs/Vector3 force -geometry_msgs/Quaternion orientation -float64[3] kR -float64[3] kOm -quadrotor_msgs/AuxCommand aux diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Serial.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Serial.msg deleted file mode 100644 index 5a54cce3..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/Serial.msg +++ /dev/null @@ -1,13 +0,0 @@ -# Note: These constants need to be kept in sync with the types -# defined in include/quadrotor_msgs/comm_types.h -uint8 SO3_CMD = 115 # 's' in base 10 -uint8 TRPY_CMD = 112 # 'p' in base 10 -uint8 STATUS_DATA = 99 # 'c' in base 10 -uint8 OUTPUT_DATA = 100 # 'd' in base 10 -uint8 PPR_OUTPUT_DATA = 116 # 't' in base 10 -uint8 PPR_GAINS = 103 # 'g' - -Header header -uint8 channel -uint8 type # One of the types listed above -uint8[] data diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/StatusData.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/StatusData.msg deleted file mode 100644 index d176e4f0..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/StatusData.msg +++ /dev/null @@ -1,4 +0,0 @@ -Header header -uint16 loop_rate -float64 voltage -uint8 seq diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/TRPYCommand.msg b/src/无人机端代码/Modules/common/quadrotor_msgs/msg/TRPYCommand.msg deleted file mode 100644 index 0d471a62..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/msg/TRPYCommand.msg +++ /dev/null @@ -1,6 +0,0 @@ -Header header -float32 thrust -float32 roll -float32 pitch -float32 yaw -quadrotor_msgs/AuxCommand aux diff --git a/src/无人机端代码/Modules/common/quadrotor_msgs/package.xml b/src/无人机端代码/Modules/common/quadrotor_msgs/package.xml deleted file mode 100644 index 42e9f76e..00000000 --- a/src/无人机端代码/Modules/common/quadrotor_msgs/package.xml +++ /dev/null @@ -1,20 +0,0 @@ - - quadrotor_msgs - 0.0.0 - quadrotor_msgs - Kartik Mohta - http://ros.org/wiki/quadrotor_msgs - BSD - catkin - geometry_msgs - nav_msgs - message_generation - geometry_msgs - nav_msgs - message_runtime - - - - - diff --git a/src/无人机端代码/Modules/communication/CMakeLists.txt b/src/无人机端代码/Modules/communication/CMakeLists.txt deleted file mode 100644 index e702198b..00000000 --- a/src/无人机端代码/Modules/communication/CMakeLists.txt +++ /dev/null @@ -1,63 +0,0 @@ -cmake_minimum_required(VERSION 3.0.2) -project(prometheus_communication_bridge) - -## Compile as C++11, supported in ROS Kinetic and newer -add_compile_options(-std=c++11) - -## Find catkin macros and libraries -## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) -## is used, also find other catkin packages -find_package(catkin REQUIRED COMPONENTS - roscpp - std_msgs - std_srvs - geometry_msgs - sensor_msgs - message_generation - tf2_msgs - visualization_msgs - mavros - mavros_msgs - prometheus_msgs -) - - -generate_messages( - DEPENDENCIES - std_msgs - std_srvs - geometry_msgs - sensor_msgs - tf2_msgs - visualization_msgs - mavros_msgs -) - -catkin_package( - INCLUDE_DIRS include - ##CATKIN_DEPENDS roscpp std_msgs sensor_msgs - CATKIN_DEPENDS - message_runtime - std_msgs - std_srvs - geometry_msgs - mavros_msgs -) - -## Specify additional locations of header files -## Your package locations should be listed before other locations -include_directories( - include ${catkin_INCLUDE_DIRS} - include - ${catkin_INCLUDE_DIRS} - ${PROJECT_SOURCE_DIR}/shard/include -) - -file(GLOB_RECURSE CURRENT_INCLUDE include/*.hpp include/*.h) -file(GLOB_RECURSE CURRENT_SOURCE src/*.cpp) - -## Specify libraries to link a library or executable target against -add_executable(communication_bridge ${CURRENT_SOURCE} ${CURRENT_INCLUDE}) -add_dependencies(communication_bridge ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) -target_link_libraries(communication_bridge ${catkin_LIBRARIES} ${PROJECT_SOURCE_DIR}/shard/libs/libcommunication.so boost_serialization) - diff --git a/src/无人机端代码/Modules/communication/include/autonomous_landing_topic.hpp b/src/无人机端代码/Modules/communication/include/autonomous_landing_topic.hpp deleted file mode 100644 index cd7934ec..00000000 --- a/src/无人机端代码/Modules/communication/include/autonomous_landing_topic.hpp +++ /dev/null @@ -1,50 +0,0 @@ -#ifndef AUTONOMOUS_LANDING_TOPIC_HPP -#define AUTONOMOUS_LANDING_TOPIC_HPP - -#include -#include "communication.hpp" - -#include "gimbal_basic_topic.hpp" - -#include "std_srvs/SetBool.h" -#include "mavros_msgs/ParamSet.h" -#include "prometheus_msgs/RheaState.h" - - -class AutonomousLanding -{ -public: - AutonomousLanding(ros::NodeHandle &nh,Communication *communication); - - ~AutonomousLanding(); - - - void gimbalSearchServer(bool is); - - void gimbalRecordVideoServer(bool is); - - void gimbalTrackModeServer(bool is); - - void gimbalParamSetServer(struct GimbalParamSet param_set); - - void rheaStatePub(struct RheaState rhea_state); - -private: - - ros::Publisher ugv_state_pub_; - - ros::ServiceClient gimbal_search_client_; - ros::ServiceClient gimbal_record_video_client_; - ros::ServiceClient gimbal_track_mode_client_; - ros::ServiceClient param_set_client_; - - struct GimbalState gimbal_state_; - struct VisionDiff vision_diff_; - - int robot_id; - - Communication* communication_ = NULL; - std::string multicast_udp_ip; -}; - -#endif \ No newline at end of file diff --git a/src/无人机端代码/Modules/communication/include/communication_bridge.hpp b/src/无人机端代码/Modules/communication/include/communication_bridge.hpp deleted file mode 100644 index fcf56d1b..00000000 --- a/src/无人机端代码/Modules/communication/include/communication_bridge.hpp +++ /dev/null @@ -1,93 +0,0 @@ -#ifndef COMUNICATION_BRIDGE_HPP -#define COMUNICATION_BRIDGE_HPP - -#include -#include "communication.hpp" - -#include - -#include -#include "Struct.hpp" - -#include "uav_basic_topic.hpp" -#include "ugv_basic_topic.hpp" -#include "swarm_control_topic.hpp" -#include "autonomous_landing_topic.hpp" -#include "gimbal_basic_topic.hpp" -#include "object_tracking_topic.hpp" - -#include -#include - -enum UserType -{ - UAV = 1, - UGV = 2 -}; - -class CommunicationBridge : public Communication -{ -public: - CommunicationBridge(ros::NodeHandle &nh); - - ~CommunicationBridge(); - - void serverFun(); - - //根据协议中MSG_ID的值,将数据段数据转化为正确的结构体 - void pubMsg(int msg_id); - - void recvData(struct UAVState uav_state); - void recvData(struct UAVCommand uav_cmd); - void recvData(struct SwarmCommand swarm_command); - void recvData(struct ConnectState connect_state); - void recvData(struct GimbalControl gimbal_control); - void recvData(struct GimbalService gimbal_service); - void recvData(struct GimbalParamSet param_set); - void recvData(struct WindowPosition window_position); - void recvData(struct RheaControl rhea_control); - void recvData(struct RheaState rhea_state); - void recvData(struct ImageData image_data); - void recvData(struct UAVSetup uav_setup); - void recvData(struct ModeSelection mode_selection); - - void modeSwitch(struct ModeSelection mode_selection); - - //接收组播地址的数据 - void multicastUdpFun(); - - //给地面站发送心跳包 - void toGroundStationFun(); - - void init(); - //ros::NodeHandle nh; - - void createImage(struct ImageData image_data); - - bool createMode(struct ModeSelection mode_selection); - - bool deleteMode(struct ModeSelection mode_selection); - -private: - //std::shared_ptr swarm_control_ ; - SwarmControl *swarm_control_ = NULL; - UGVBasic *ugv_basic_ = NULL; - UAVBasic *uav_basic_ = NULL; - //std::vector swarm_control_simulation_; - std::map swarm_control_simulation_; - AutonomousLanding *autonomous_landing_ = NULL; - GimbalBasic *gimbal_basic_ = NULL; - ObjectTracking *object_tracking_ = NULL; - - int current_mode_ = 0; - - int is_simulation_, swarm_num_, swarm_data_update_timeout_; - ros::NodeHandle nh_; - - bool is_heartbeat_ready_ = false; - - int user_type_; - -}; - -#endif \ No newline at end of file diff --git a/src/无人机端代码/Modules/communication/include/gimbal_basic_topic.hpp b/src/无人机端代码/Modules/communication/include/gimbal_basic_topic.hpp deleted file mode 100644 index cf7b835d..00000000 --- a/src/无人机端代码/Modules/communication/include/gimbal_basic_topic.hpp +++ /dev/null @@ -1,39 +0,0 @@ -#ifndef GimbalBasic_HPP -#define GimbalBasic_HPP - -#include -#include "communication.hpp" - -#include "prometheus_msgs/GimbalState.h" -#include "prometheus_msgs/VisionDiff.h" -#include "prometheus_msgs/WindowPosition.h" -#include "prometheus_msgs/GimbalControl.h" - -class GimbalBasic -{ -public: - GimbalBasic(ros::NodeHandle &nh,Communication *communication); - ~GimbalBasic(); - - void stateCb(const prometheus_msgs::GimbalState::ConstPtr &msg); - - void trackCb(const prometheus_msgs::VisionDiff::ConstPtr &msg); - - void gimbalWindowPositionPub(struct WindowPosition window_position); - - void gimbalControlPub(struct GimbalControl gimbal_control); - -protected: - ros::Subscriber gimbal_state_sub_; - ros::Subscriber vision_diff_sub_; - ros::Publisher window_position_pub_; - ros::Publisher gimbal_control_pub_; - - struct GimbalState gimbal_state_; - struct VisionDiff vision_diff_; - - Communication* communication_ = NULL; - std::string multicast_udp_ip; -}; - -#endif \ No newline at end of file diff --git a/src/无人机端代码/Modules/communication/include/object_tracking_topic.hpp b/src/无人机端代码/Modules/communication/include/object_tracking_topic.hpp deleted file mode 100644 index 901c911e..00000000 --- a/src/无人机端代码/Modules/communication/include/object_tracking_topic.hpp +++ /dev/null @@ -1,26 +0,0 @@ -#ifndef OBJECT_TRACKING_TOPIC_HPP -#define OBJECT_TRACKING_TOPIC_HPP - -#include -#include "communication.hpp" -#include "prometheus_msgs/MultiDetectionInfoSub.h" -#include "prometheus_msgs/DetectionInfoSub.h" - -class ObjectTracking -{ -public: - ObjectTracking(ros::NodeHandle &nh,Communication *communication); - ~ObjectTracking(); - - void multiDetectionInfoCb(const prometheus_msgs::MultiDetectionInfoSub::ConstPtr &msg); - - -private: - Communication* communication_ = NULL; - - std::string multicast_udp_ip; - - ros::Subscriber multi_detection_info_sub_; -}; - -#endif diff --git a/src/无人机端代码/Modules/communication/include/swarm_control_topic.hpp b/src/无人机端代码/Modules/communication/include/swarm_control_topic.hpp deleted file mode 100644 index 04ba9960..00000000 --- a/src/无人机端代码/Modules/communication/include/swarm_control_topic.hpp +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef SWARM_CONTROL_TOPIC_HPP -#define SWARM_CONTROL_TOPIC_HPP - -#include -#include "communication.hpp" -#include "uav_basic_topic.hpp" - -#include "std_msgs/Bool.h" - -#include "prometheus_msgs/MultiUAVState.h" -#include "prometheus_msgs/SwarmCommand.h" -#include "prometheus_msgs/UAVState.h" -#include "prometheus_msgs/OffsetPose.h" - -#include - -using namespace std; - -//订阅: /prometheus/formation_assign/result -//发布: /Prometheus/formation_assign/info - -struct MultiUAVState -{ - int uav_num; - std::vector uav_state_all; -}; - -class SwarmControl//: public UAVBasic -{ -public: - //真机构造 - SwarmControl(ros::NodeHandle &nh, int id, int swarm_num,Communication *communication); - - //仿真构造 - SwarmControl(ros::NodeHandle &nh, int swarm_num,Communication *communication); - - ~SwarmControl(); - - void init(ros::NodeHandle &nh, int swarm_num,int id = 1); - - //更新全部飞机数据 - void updateAllUAVState(struct UAVState uav_state); - - //【发布】集群控制指令 - void swarmCommandPub(struct SwarmCommand swarm_command); - - //【发布】连接是否失效 - void communicationStatePub(bool communication); - - void communicationStatePub(bool communication,int id); - - //【发布】所有无人机状态 - void allUAVStatePub(struct MultiUAVState m_multi_uav_state); - - - void closeTopic(); - - inline struct MultiUAVState getMultiUAVState(){return this->multi_uav_state_;}; - - inline prometheus_msgs::UAVState getUAVStateMsg(){return this->uav_state_msg_;}; - - -private: - - struct MultiUAVState multi_uav_state_; - - Communication *communication_ = NULL; - - prometheus_msgs::UAVState uav_state_msg_; - - - //集群全部uav 状态 - ros::Publisher all_uav_state_pub_; - //控制指令 - ros::Publisher swarm_command_pub_; - //连接是否失效 - ros::Publisher communication_state_pub_; - - - //仿真 - std::vector simulation_communication_state_pub; - - bool is_simulation_; - - std::string udp_ip, multicast_udp_ip; - - std::string user_type_ = ""; -}; - -#endif \ No newline at end of file diff --git a/src/无人机端代码/Modules/communication/include/uav_basic_topic.hpp b/src/无人机端代码/Modules/communication/include/uav_basic_topic.hpp deleted file mode 100644 index 203c4568..00000000 --- a/src/无人机端代码/Modules/communication/include/uav_basic_topic.hpp +++ /dev/null @@ -1,75 +0,0 @@ -#ifndef UAV_BASIC_TOPIC_HPP -#define UAV_BASIC_TOPIC_HPP - -#include -#include "communication.hpp" -#include "prometheus_msgs/UAVState.h" -#include "prometheus_msgs/TextInfo.h" -#include "prometheus_msgs/OffsetPose.h" -#include "prometheus_msgs/UAVCommand.h" -#include "prometheus_msgs/UAVSetup.h" -#include "prometheus_msgs/UAVControlState.h" - -class UAVBasic -{ -public: - UAVBasic(); - - UAVBasic(ros::NodeHandle &nh,int id,Communication *communication); - - ~UAVBasic(); - - inline int getRobotId(){return robot_id;}; - - void stateCb(const prometheus_msgs::UAVState::ConstPtr &msg); - - //【回调】uav反馈信息 - void textInfoCb(const prometheus_msgs::TextInfo::ConstPtr &msg); - - //【订阅】偏移量 - void offsetPoseCb(const prometheus_msgs::OffsetPose::ConstPtr &msg); - - void controlStateCb(const prometheus_msgs::UAVControlState::ConstPtr &msg); - - struct UAVState getUAVState(); - - void uavCmdPub(struct UAVCommand uav_cmd); - - void uavSetupPub(struct UAVSetup uav_setup); - - void setTimeStamp(uint time); - - uint getTimeStamp(); - -private: - ros::Subscriber uav_state_sub_; - - //反馈信息 - ros::Subscriber text_info_sub_; - //控制状态 - ros::Subscriber uav_control_state_sub_; - //偏移量订阅 - ros::Subscriber offset_pose_sub_; - - ros::Publisher uav_cmd_pub_; - - ros::Publisher uav_setup_pub_; - - int current_mode_; - - int robot_id; - - struct UAVState uav_state_; - struct TextInfo text_info_; - struct UAVControlState uav_control_state_; - - prometheus_msgs::OffsetPose offset_pose_; - - Communication *communication_ = NULL; - - std::string multicast_udp_ip; - - uint time_stamp_ = 0; -}; - -#endif \ No newline at end of file diff --git a/src/无人机端代码/Modules/communication/include/ugv_basic_topic.hpp b/src/无人机端代码/Modules/communication/include/ugv_basic_topic.hpp deleted file mode 100644 index 2a2fdf32..00000000 --- a/src/无人机端代码/Modules/communication/include/ugv_basic_topic.hpp +++ /dev/null @@ -1,63 +0,0 @@ -#ifndef UGV_BASIC_TOPIC_HPP -#define UGV_BASIC_TOPIC_HPP - -#include -#include "communication.hpp" -#include "prometheus_msgs/RheaCommunication.h" -#include "prometheus_msgs/RheaState.h" -#include "prometheus_msgs/RheaGPS.h" -using namespace std; - -class UGVBasic -{ -public: - UGVBasic(ros::NodeHandle &nh,Communication *communication); - - ~UGVBasic(); - - // void scanCb(const sensor_msgs::LaserScan::ConstPtr &msg); - - // void scanMatchedPoints2Cb(const sensor_msgs::PointCloud2::ConstPtr &msg); - - // void tfCb(const tf2_msgs::TFMessage::ConstPtr &msg); - - // void tfStaticCb(const tf2_msgs::TFMessage::ConstPtr &msg); - - // void constraintListCb(const visualization_msgs::MarkerArray::ConstPtr &msg); - - // void landmarkPosesListCb(const visualization_msgs::MarkerArray::ConstPtr &msg); - - // void trajectoryNodeListCb(const visualization_msgs::MarkerArray::ConstPtr &msg); - - void rheaControlPub(struct RheaControl rhea_control); - - void rheaStateCb(const prometheus_msgs::RheaState::ConstPtr &msg); - - void setTimeStamp(uint time); - - uint getTimeStamp(); - -private: - //rviz - ros::Subscriber scan_matched_points2_sub_; - ros::Subscriber scan_sub_; - ros::Subscriber tf_static_sub_; - ros::Subscriber tf_sub_; - ros::Subscriber constraint_list_sub_; - ros::Subscriber landmark_poses_list_sub_; - ros::Subscriber trajectory_node_list_sub_; - // - ros::Publisher rhea_control_pub_; - ros::Subscriber rhea_state_sub_; - - ros::Subscriber cmd_vel_sub_; - - Communication* communication_ = NULL; - - std::string udp_ip; - std::string multicast_udp_ip; - - uint time_stamp_ = 0; -}; - -#endif \ No newline at end of file diff --git a/src/无人机端代码/Modules/communication/launch/bridge.launch b/src/无人机端代码/Modules/communication/launch/bridge.launch deleted file mode 100644 index 574ef1ca..00000000 --- a/src/无人机端代码/Modules/communication/launch/bridge.launch +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/无人机端代码/Modules/communication/package.xml b/src/无人机端代码/Modules/communication/package.xml deleted file mode 100644 index 624633b5..00000000 --- a/src/无人机端代码/Modules/communication/package.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - prometheus_communication_bridge - 0.0.0 - The ground_station_bridge module - - Amov - Aomv - - catkin - roscpp - std_msgs - std_srvs - geometry_msgs - roscpp - std_msgs - std_srvs - geometry_msgs - roscpp - std_msgs - std_srvs - geometry_msgs - sensor_msgs - sensor_msgs - sensor_msgs - mavros_msgs - mavros_msgs - mavros_msgs - message_runtime - - - - - diff --git a/src/无人机端代码/Modules/communication/shard/include/CRC.h b/src/无人机端代码/Modules/communication/shard/include/CRC.h deleted file mode 100644 index e20db354..00000000 --- a/src/无人机端代码/Modules/communication/shard/include/CRC.h +++ /dev/null @@ -1,2066 +0,0 @@ -/** - @file CRC.h - @author Daniel Bahr - @version 1.1.0.0 - @copyright - @parblock - CRC++ - Copyright (c) 2021, Daniel Bahr - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - * Neither the name of CRC++ nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - @endparblock -*/ - -/* - CRC++ can be configured by setting various #defines before #including this header file: - - #define crcpp_uint8 - Specifies the type used to store CRCs that have a width of 8 bits or less. - This type is not used in CRC calculations. Defaults to ::std::uint8_t. - #define crcpp_uint16 - Specifies the type used to store CRCs that have a width between 9 and 16 bits (inclusive). - This type is not used in CRC calculations. Defaults to ::std::uint16_t. - #define crcpp_uint32 - Specifies the type used to store CRCs that have a width between 17 and 32 bits (inclusive). - This type is not used in CRC calculations. Defaults to ::std::uint32_t. - #define crcpp_uint64 - Specifies the type used to store CRCs that have a width between 33 and 64 bits (inclusive). - This type is not used in CRC calculations. Defaults to ::std::uint64_t. - #define crcpp_size - This type is used for loop iteration and function signatures only. Defaults to ::std::size_t. - #define CRCPP_USE_NAMESPACE - Define to place all CRC++ code within the ::CRCPP namespace. - #define CRCPP_BRANCHLESS - Define to enable a branchless CRC implementation. The branchless implementation uses a single integer - multiplication in the bit-by-bit calculation instead of a small conditional. The branchless implementation - may be faster on processor architectures which support single-instruction integer multiplication. - #define CRCPP_USE_CPP11 - Define to enables C++11 features (move semantics, constexpr, static_assert, etc.). - #define CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - Define to include definitions for little-used CRCs. -*/ - -#ifndef CRCPP_CRC_H_ -#define CRCPP_CRC_H_ - -#include // Includes CHAR_BIT -#ifdef CRCPP_USE_CPP11 -#include // Includes ::std::size_t -#include // Includes ::std::uint8_t, ::std::uint16_t, ::std::uint32_t, ::std::uint64_t -#else -#include // Includes size_t -#include // Includes uint8_t, uint16_t, uint32_t, uint64_t -#endif -#include // Includes ::std::numeric_limits -#include // Includes ::std::move - -#ifndef crcpp_uint8 -# ifdef CRCPP_USE_CPP11 - /// @brief Unsigned 8-bit integer definition, used primarily for parameter definitions. -# define crcpp_uint8 ::std::uint8_t -# else - /// @brief Unsigned 8-bit integer definition, used primarily for parameter definitions. -# define crcpp_uint8 uint8_t -# endif -#endif - -#ifndef crcpp_uint16 -# ifdef CRCPP_USE_CPP11 - /// @brief Unsigned 16-bit integer definition, used primarily for parameter definitions. -# define crcpp_uint16 ::std::uint16_t -# else - /// @brief Unsigned 16-bit integer definition, used primarily for parameter definitions. -# define crcpp_uint16 uint16_t -# endif -#endif - -#ifndef crcpp_uint32 -# ifdef CRCPP_USE_CPP11 - /// @brief Unsigned 32-bit integer definition, used primarily for parameter definitions. -# define crcpp_uint32 ::std::uint32_t -# else - /// @brief Unsigned 32-bit integer definition, used primarily for parameter definitions. -# define crcpp_uint32 uint32_t -# endif -#endif - -#ifndef crcpp_uint64 -# ifdef CRCPP_USE_CPP11 - /// @brief Unsigned 64-bit integer definition, used primarily for parameter definitions. -# define crcpp_uint64 ::std::uint64_t -# else - /// @brief Unsigned 64-bit integer definition, used primarily for parameter definitions. -# define crcpp_uint64 uint64_t -# endif -#endif - -#ifndef crcpp_size -# ifdef CRCPP_USE_CPP11 - /// @brief Unsigned size definition, used for specifying data sizes. -# define crcpp_size ::std::size_t -# else - /// @brief Unsigned size definition, used for specifying data sizes. -# define crcpp_size size_t -# endif -#endif - -#ifdef CRCPP_USE_CPP11 - /// @brief Compile-time expression definition. -# define crcpp_constexpr constexpr -#else - /// @brief Compile-time expression definition. -# define crcpp_constexpr const -#endif - -#ifdef CRCPP_USE_NAMESPACE -namespace CRCPP -{ -#endif - -/** - @brief Static class for computing CRCs. - @note This class supports computation of full and multi-part CRCs, using a bit-by-bit algorithm or a - byte-by-byte lookup table. The CRCs are calculated using as many optimizations as is reasonable. - If compiling with C++11, the constexpr keyword is used liberally so that many calculations are - performed at compile-time instead of at runtime. -*/ -class CRC -{ -public: - // Forward declaration - template - struct Table; - - /** - @brief CRC parameters. - */ - template - struct Parameters - { - CRCType polynomial; ///< CRC polynomial - CRCType initialValue; ///< Initial CRC value - CRCType finalXOR; ///< Value to XOR with the final CRC - bool reflectInput; ///< true to reflect all input bytes - bool reflectOutput; ///< true to reflect the output CRC (reflection occurs before the final XOR) - - Table MakeTable() const; - }; - - /** - @brief CRC lookup table. After construction, the CRC parameters are fixed. - @note A CRC table can be used for multiple CRC calculations. - */ - template - struct Table - { - // Constructors are intentionally NOT marked explicit. - Table(const Parameters & parameters); - -#ifdef CRCPP_USE_CPP11 - Table(Parameters && parameters); -#endif - - const Parameters & GetParameters() const; - - const CRCType * GetTable() const; - - CRCType operator[](unsigned char index) const; - - private: - void InitTable(); - - Parameters parameters; ///< CRC parameters used to construct the table - CRCType table[1 << CHAR_BIT]; ///< CRC lookup table - }; - - // The number of bits in CRCType must be at least as large as CRCWidth. - // CRCType must be an unsigned integer type or a custom type with operator overloads. - template - static CRCType Calculate(const void * data, crcpp_size size, const Parameters & parameters); - - template - static CRCType Calculate(const void * data, crcpp_size size, const Parameters & parameters, CRCType crc); - - template - static CRCType Calculate(const void * data, crcpp_size size, const Table & lookupTable); - - template - static CRCType Calculate(const void * data, crcpp_size size, const Table & lookupTable, CRCType crc); - - template - static CRCType CalculateBits(const void * data, crcpp_size size, const Parameters & parameters); - - template - static CRCType CalculateBits(const void * data, crcpp_size size, const Parameters & parameters, CRCType crc); - - template - static CRCType CalculateBits(const void * data, crcpp_size size, const Table & lookupTable); - - template - static CRCType CalculateBits(const void * data, crcpp_size size, const Table & lookupTable, CRCType crc); - - // Common CRCs up to 64 bits. - // Note: Check values are the computed CRCs when given an ASCII input of "123456789" (without null terminator) -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - static const Parameters< crcpp_uint8, 4> & CRC_4_ITU(); - static const Parameters< crcpp_uint8, 5> & CRC_5_EPC(); - static const Parameters< crcpp_uint8, 5> & CRC_5_ITU(); - static const Parameters< crcpp_uint8, 5> & CRC_5_USB(); - static const Parameters< crcpp_uint8, 6> & CRC_6_CDMA2000A(); - static const Parameters< crcpp_uint8, 6> & CRC_6_CDMA2000B(); - static const Parameters< crcpp_uint8, 6> & CRC_6_ITU(); - static const Parameters< crcpp_uint8, 6> & CRC_6_NR(); - static const Parameters< crcpp_uint8, 7> & CRC_7(); -#endif - static const Parameters< crcpp_uint8, 8> & CRC_8(); -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - static const Parameters< crcpp_uint8, 8> & CRC_8_EBU(); - static const Parameters< crcpp_uint8, 8> & CRC_8_MAXIM(); - static const Parameters< crcpp_uint8, 8> & CRC_8_WCDMA(); - static const Parameters< crcpp_uint8, 8> & CRC_8_LTE(); - static const Parameters & CRC_10(); - static const Parameters & CRC_10_CDMA2000(); - static const Parameters & CRC_11(); - static const Parameters & CRC_11_NR(); - static const Parameters & CRC_12_CDMA2000(); - static const Parameters & CRC_12_DECT(); - static const Parameters & CRC_12_UMTS(); - static const Parameters & CRC_13_BBC(); - static const Parameters & CRC_15(); - static const Parameters & CRC_15_MPT1327(); -#endif - static const Parameters & CRC_16_ARC(); - static const Parameters & CRC_16_BUYPASS(); - static const Parameters & CRC_16_CCITTFALSE(); -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - static const Parameters & CRC_16_CDMA2000(); - static const Parameters & CRC_16_CMS(); - static const Parameters & CRC_16_DECTR(); - static const Parameters & CRC_16_DECTX(); - static const Parameters & CRC_16_DNP(); -#endif - static const Parameters & CRC_16_GENIBUS(); - static const Parameters & CRC_16_KERMIT(); -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - static const Parameters & CRC_16_MAXIM(); - static const Parameters & CRC_16_MODBUS(); - static const Parameters & CRC_16_T10DIF(); - static const Parameters & CRC_16_USB(); -#endif - static const Parameters & CRC_16_X25(); - static const Parameters & CRC_16_XMODEM(); -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - static const Parameters & CRC_17_CAN(); - static const Parameters & CRC_21_CAN(); - static const Parameters & CRC_24(); - static const Parameters & CRC_24_FLEXRAYA(); - static const Parameters & CRC_24_FLEXRAYB(); - static const Parameters & CRC_24_LTEA(); - static const Parameters & CRC_24_LTEB(); - static const Parameters & CRC_24_NRC(); - static const Parameters & CRC_30(); -#endif - static const Parameters & CRC_32(); - static const Parameters & CRC_32_BZIP2(); -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - static const Parameters & CRC_32_C(); -#endif - static const Parameters & CRC_32_MPEG2(); - static const Parameters & CRC_32_POSIX(); -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - static const Parameters & CRC_32_Q(); - static const Parameters & CRC_40_GSM(); - static const Parameters & CRC_64(); -#endif - -#ifdef CRCPP_USE_CPP11 - CRC() = delete; - CRC(const CRC & other) = delete; - CRC & operator=(const CRC & other) = delete; - CRC(CRC && other) = delete; - CRC & operator=(CRC && other) = delete; -#endif - -private: -#ifndef CRCPP_USE_CPP11 - CRC(); - CRC(const CRC & other); - CRC & operator=(const CRC & other); -#endif - - template - static IntegerType Reflect(IntegerType value, crcpp_uint16 numBits); - - template - static CRCType Finalize(CRCType remainder, CRCType finalXOR, bool reflectOutput); - - template - static CRCType UndoFinalize(CRCType remainder, CRCType finalXOR, bool reflectOutput); - - template - static CRCType CalculateRemainder(const void * data, crcpp_size size, const Parameters & parameters, CRCType remainder); - - template - static CRCType CalculateRemainder(const void * data, crcpp_size size, const Table & lookupTable, CRCType remainder); - - template - static CRCType CalculateRemainderBits(unsigned char byte, crcpp_size numBits, const Parameters & parameters, CRCType remainder); -}; - -/** - @brief Returns a CRC lookup table construct using these CRC parameters. - @note This function primarily exists to allow use of the auto keyword instead of instantiating - a table directly, since template parameters are not inferred in constructors. - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC lookup table -*/ -template -inline CRC::Table CRC::Parameters::MakeTable() const -{ - // This should take advantage of RVO and optimize out the copy. - return CRC::Table(*this); -} - -/** - @brief Constructs a CRC table from a set of CRC parameters - @param[in] params CRC parameters - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC -*/ -template -inline CRC::Table::Table(const Parameters & params) : - parameters(params) -{ - InitTable(); -} - -#ifdef CRCPP_USE_CPP11 -/** - @brief Constructs a CRC table from a set of CRC parameters - @param[in] params CRC parameters - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC -*/ -template -inline CRC::Table::Table(Parameters && params) : - parameters(::std::move(params)) -{ - InitTable(); -} -#endif - -/** - @brief Gets the CRC parameters used to construct the CRC table - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC parameters -*/ -template -inline const CRC::Parameters & CRC::Table::GetParameters() const -{ - return parameters; -} - -/** - @brief Gets the CRC table - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC table -*/ -template -inline const CRCType * CRC::Table::GetTable() const -{ - return table; -} - -/** - @brief Gets an entry in the CRC table - @param[in] index Index into the CRC table - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC table entry -*/ -template -inline CRCType CRC::Table::operator[](unsigned char index) const -{ - return table[index]; -} - -/** - @brief Initializes a CRC table. - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC -*/ -template -inline void CRC::Table::InitTable() -{ - // For masking off the bits for the CRC (in the event that the number of bits in CRCType is larger than CRCWidth) - static crcpp_constexpr CRCType BIT_MASK((CRCType(1) << (CRCWidth - CRCType(1))) | - ((CRCType(1) << (CRCWidth - CRCType(1))) - CRCType(1))); - - // The conditional expression is used to avoid a -Wshift-count-overflow warning. - static crcpp_constexpr CRCType SHIFT((CHAR_BIT >= CRCWidth) ? static_cast(CHAR_BIT - CRCWidth) : 0); - - CRCType crc; - unsigned char byte = 0; - - // Loop over each dividend (each possible number storable in an unsigned char) - do - { - crc = CRC::CalculateRemainder(&byte, sizeof(byte), parameters, CRCType(0)); - - // This mask might not be necessary; all unit tests pass with this line commented out, - // but that might just be a coincidence based on the CRC parameters used for testing. - // In any case, this is harmless to leave in and only adds a single machine instruction per loop iteration. - crc &= BIT_MASK; - - if (!parameters.reflectInput && CRCWidth < CHAR_BIT) - { - // Undo the special operation at the end of the CalculateRemainder() - // function for non-reflected CRCs < CHAR_BIT. - crc = static_cast(crc << SHIFT); - } - - table[byte] = crc; - } - while (++byte); -} - -/** - @brief Computes a CRC. - @param[in] data Data over which CRC will be computed - @param[in] size Size of the data, in bytes - @param[in] parameters CRC parameters - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC -*/ -template -inline CRCType CRC::Calculate(const void * data, crcpp_size size, const Parameters & parameters) -{ - CRCType remainder = CalculateRemainder(data, size, parameters, parameters.initialValue); - - // No need to mask the remainder here; the mask will be applied in the Finalize() function. - - return Finalize(remainder, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); -} -/** - @brief Appends additional data to a previous CRC calculation. - @note This function can be used to compute multi-part CRCs. - @param[in] data Data over which CRC will be computed - @param[in] size Size of the data, in bytes - @param[in] parameters CRC parameters - @param[in] crc CRC from a previous calculation - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC -*/ -template -inline CRCType CRC::Calculate(const void * data, crcpp_size size, const Parameters & parameters, CRCType crc) -{ - CRCType remainder = UndoFinalize(crc, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); - - remainder = CalculateRemainder(data, size, parameters, remainder); - - // No need to mask the remainder here; the mask will be applied in the Finalize() function. - - return Finalize(remainder, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); -} - -/** - @brief Computes a CRC via a lookup table. - @param[in] data Data over which CRC will be computed - @param[in] size Size of the data, in bytes - @param[in] lookupTable CRC lookup table - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC -*/ -template -inline CRCType CRC::Calculate(const void * data, crcpp_size size, const Table & lookupTable) -{ - const Parameters & parameters = lookupTable.GetParameters(); - - CRCType remainder = CalculateRemainder(data, size, lookupTable, parameters.initialValue); - - // No need to mask the remainder here; the mask will be applied in the Finalize() function. - - return Finalize(remainder, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); -} - -/** - @brief Appends additional data to a previous CRC calculation using a lookup table. - @note This function can be used to compute multi-part CRCs. - @param[in] data Data over which CRC will be computed - @param[in] size Size of the data, in bytes - @param[in] lookupTable CRC lookup table - @param[in] crc CRC from a previous calculation - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC -*/ -template -inline CRCType CRC::Calculate(const void * data, crcpp_size size, const Table & lookupTable, CRCType crc) -{ - const Parameters & parameters = lookupTable.GetParameters(); - - CRCType remainder = UndoFinalize(crc, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); - - remainder = CalculateRemainder(data, size, lookupTable, remainder); - - // No need to mask the remainder here; the mask will be applied in the Finalize() function. - - return Finalize(remainder, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); -} - -/** - @brief Computes a CRC. - @param[in] data Data over which CRC will be computed - @param[in] size Size of the data, in bits - @param[in] parameters CRC parameters - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC -*/ -template -inline CRCType CRC::CalculateBits(const void * data, crcpp_size size, const Parameters & parameters) -{ - CRCType remainder = parameters.initialValue; - - // Calculate the remainder on a whole number of bytes first, then call - // a special-case function for the remaining bits. - crcpp_size wholeNumberOfBytes = size / CHAR_BIT; - if (wholeNumberOfBytes > 0) - { - remainder = CalculateRemainder(data, wholeNumberOfBytes, parameters, remainder); - } - - crcpp_size remainingNumberOfBits = size % CHAR_BIT; - if (remainingNumberOfBits != 0) - { - unsigned char lastByte = *(reinterpret_cast(data) + wholeNumberOfBytes); - remainder = CalculateRemainderBits(lastByte, remainingNumberOfBits, parameters, remainder); - } - - // No need to mask the remainder here; the mask will be applied in the Finalize() function. - - return Finalize(remainder, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); -} -/** - @brief Appends additional data to a previous CRC calculation. - @note This function can be used to compute multi-part CRCs. - @param[in] data Data over which CRC will be computed - @param[in] size Size of the data, in bits - @param[in] parameters CRC parameters - @param[in] crc CRC from a previous calculation - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC -*/ -template -inline CRCType CRC::CalculateBits(const void * data, crcpp_size size, const Parameters & parameters, CRCType crc) -{ - CRCType remainder = UndoFinalize(crc, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); - - // Calculate the remainder on a whole number of bytes first, then call - // a special-case function for the remaining bits. - crcpp_size wholeNumberOfBytes = size / CHAR_BIT; - if (wholeNumberOfBytes > 0) - { - remainder = CalculateRemainder(data, wholeNumberOfBytes, parameters, parameters.initialValue); - } - - crcpp_size remainingNumberOfBits = size % CHAR_BIT; - if (remainingNumberOfBits != 0) - { - unsigned char lastByte = *(reinterpret_cast(data) + wholeNumberOfBytes); - remainder = CalculateRemainderBits(lastByte, remainingNumberOfBits, parameters, remainder); - } - - // No need to mask the remainder here; the mask will be applied in the Finalize() function. - - return Finalize(remainder, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); -} - -/** - @brief Computes a CRC via a lookup table. - @param[in] data Data over which CRC will be computed - @param[in] size Size of the data, in bits - @param[in] lookupTable CRC lookup table - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC -*/ -template -inline CRCType CRC::CalculateBits(const void * data, crcpp_size size, const Table & lookupTable) -{ - const Parameters & parameters = lookupTable.GetParameters(); - - CRCType remainder = parameters.initialValue; - - // Calculate the remainder on a whole number of bytes first, then call - // a special-case function for the remaining bits. - crcpp_size wholeNumberOfBytes = size / CHAR_BIT; - if (wholeNumberOfBytes > 0) - { - remainder = CalculateRemainder(data, wholeNumberOfBytes, lookupTable, remainder); - } - - crcpp_size remainingNumberOfBits = size % CHAR_BIT; - if (remainingNumberOfBits != 0) - { - unsigned char lastByte = *(reinterpret_cast(data) + wholeNumberOfBytes); - remainder = CalculateRemainderBits(lastByte, remainingNumberOfBits, parameters, remainder); - } - - // No need to mask the remainder here; the mask will be applied in the Finalize() function. - - return Finalize(remainder, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); -} - -/** - @brief Appends additional data to a previous CRC calculation using a lookup table. - @note This function can be used to compute multi-part CRCs. - @param[in] data Data over which CRC will be computed - @param[in] size Size of the data, in bits - @param[in] lookupTable CRC lookup table - @param[in] crc CRC from a previous calculation - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC -*/ -template -inline CRCType CRC::CalculateBits(const void * data, crcpp_size size, const Table & lookupTable, CRCType crc) -{ - const Parameters & parameters = lookupTable.GetParameters(); - - CRCType remainder = UndoFinalize(crc, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); - - // Calculate the remainder on a whole number of bytes first, then call - // a special-case function for the remaining bits. - crcpp_size wholeNumberOfBytes = size / CHAR_BIT; - if (wholeNumberOfBytes > 0) - { - remainder = CalculateRemainder(data, wholeNumberOfBytes, lookupTable, parameters.initialValue); - } - - crcpp_size remainingNumberOfBits = size % CHAR_BIT; - if (remainingNumberOfBits > 0) - { - unsigned char lastByte = *(reinterpret_cast(data) + wholeNumberOfBytes); - remainder = CalculateRemainderBits(lastByte, remainingNumberOfBits, parameters, remainder); - } - - // No need to mask the remainder here; the mask will be applied in the Finalize() function. - - return Finalize(remainder, parameters.finalXOR, parameters.reflectInput != parameters.reflectOutput); -} - -/** - @brief Reflects (i.e. reverses the bits within) an integer value. - @param[in] value Value to reflect - @param[in] numBits Number of bits in the integer which will be reflected - @tparam IntegerType Integer type of the value being reflected - @return Reflected value -*/ -template -inline IntegerType CRC::Reflect(IntegerType value, crcpp_uint16 numBits) -{ - IntegerType reversedValue(0); - - for (crcpp_uint16 i = 0; i < numBits; ++i) - { - reversedValue = static_cast((reversedValue << 1) | (value & 1)); - value = static_cast(value >> 1); - } - - return reversedValue; -} - -/** - @brief Computes the final reflection and XOR of a CRC remainder. - @param[in] remainder CRC remainder to reflect and XOR - @param[in] finalXOR Final value to XOR with the remainder - @param[in] reflectOutput true to reflect each byte of the remainder before the XOR - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return Final CRC -*/ -template -inline CRCType CRC::Finalize(CRCType remainder, CRCType finalXOR, bool reflectOutput) -{ - // For masking off the bits for the CRC (in the event that the number of bits in CRCType is larger than CRCWidth) - static crcpp_constexpr CRCType BIT_MASK = (CRCType(1) << (CRCWidth - CRCType(1))) | - ((CRCType(1) << (CRCWidth - CRCType(1))) - CRCType(1)); - - if (reflectOutput) - { - remainder = Reflect(remainder, CRCWidth); - } - - return (remainder ^ finalXOR) & BIT_MASK; -} - -/** - @brief Undoes the process of computing the final reflection and XOR of a CRC remainder. - @note This function allows for computation of multi-part CRCs - @note Calling UndoFinalize() followed by Finalize() (or vice versa) will always return the original remainder value: - - CRCType x = ...; - CRCType y = Finalize(x, finalXOR, reflectOutput); - CRCType z = UndoFinalize(y, finalXOR, reflectOutput); - assert(x == z); - - @param[in] crc Reflected and XORed CRC - @param[in] finalXOR Final value XORed with the remainder - @param[in] reflectOutput true if the remainder is to be reflected - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return Un-finalized CRC remainder -*/ -template -inline CRCType CRC::UndoFinalize(CRCType crc, CRCType finalXOR, bool reflectOutput) -{ - // For masking off the bits for the CRC (in the event that the number of bits in CRCType is larger than CRCWidth) - static crcpp_constexpr CRCType BIT_MASK = (CRCType(1) << (CRCWidth - CRCType(1))) | - ((CRCType(1) << (CRCWidth - CRCType(1))) - CRCType(1)); - - crc = (crc & BIT_MASK) ^ finalXOR; - - if (reflectOutput) - { - crc = Reflect(crc, CRCWidth); - } - - return crc; -} - -/** - @brief Computes a CRC remainder. - @param[in] data Data over which the remainder will be computed - @param[in] size Size of the data, in bytes - @param[in] parameters CRC parameters - @param[in] remainder Running CRC remainder. Can be an initial value or the result of a previous CRC remainder calculation. - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC remainder -*/ -template -inline CRCType CRC::CalculateRemainder(const void * data, crcpp_size size, const Parameters & parameters, CRCType remainder) -{ -#ifdef CRCPP_USE_CPP11 - // This static_assert is put here because this function will always be compiled in no matter what - // the template parameters are and whether or not a table lookup or bit-by-bit algorithm is used. - static_assert(::std::numeric_limits::digits >= CRCWidth, "CRCType is too small to contain a CRC of width CRCWidth."); -#else - // Catching this compile-time error is very important. Sadly, the compiler error will be very cryptic, but it's - // better than nothing. - enum { static_assert_failed_CRCType_is_too_small_to_contain_a_CRC_of_width_CRCWidth = 1 / (::std::numeric_limits::digits >= CRCWidth ? 1 : 0) }; -#endif - - const unsigned char * current = reinterpret_cast(data); - - // Slightly different implementations based on the parameters. The current implementations try to eliminate as much - // computation from the inner loop (looping over each bit) as possible. - if (parameters.reflectInput) - { - CRCType polynomial = CRC::Reflect(parameters.polynomial, CRCWidth); - while (size--) - { - remainder = static_cast(remainder ^ *current++); - - // An optimizing compiler might choose to unroll this loop. - for (crcpp_size i = 0; i < CHAR_BIT; ++i) - { -#ifdef CRCPP_BRANCHLESS - // Clever way to avoid a branch at the expense of a multiplication. This code is equivalent to the following: - // if (remainder & 1) - // remainder = (remainder >> 1) ^ polynomial; - // else - // remainder >>= 1; - remainder = static_cast((remainder >> 1) ^ ((remainder & 1) * polynomial)); -#else - remainder = static_cast((remainder & 1) ? ((remainder >> 1) ^ polynomial) : (remainder >> 1)); -#endif - } - } - } - else if (CRCWidth >= CHAR_BIT) - { - static crcpp_constexpr CRCType CRC_WIDTH_MINUS_ONE(CRCWidth - CRCType(1)); -#ifndef CRCPP_BRANCHLESS - static crcpp_constexpr CRCType CRC_HIGHEST_BIT_MASK(CRCType(1) << CRC_WIDTH_MINUS_ONE); -#endif - // The conditional expression is used to avoid a -Wshift-count-overflow warning. - static crcpp_constexpr CRCType SHIFT((CRCWidth >= CHAR_BIT) ? static_cast(CRCWidth - CHAR_BIT) : 0); - - while (size--) - { - remainder = static_cast(remainder ^ (static_cast(*current++) << SHIFT)); - - // An optimizing compiler might choose to unroll this loop. - for (crcpp_size i = 0; i < CHAR_BIT; ++i) - { -#ifdef CRCPP_BRANCHLESS - // Clever way to avoid a branch at the expense of a multiplication. This code is equivalent to the following: - // if (remainder & CRC_HIGHEST_BIT_MASK) - // remainder = (remainder << 1) ^ parameters.polynomial; - // else - // remainder <<= 1; - remainder = static_cast((remainder << 1) ^ (((remainder >> CRC_WIDTH_MINUS_ONE) & 1) * parameters.polynomial)); -#else - remainder = static_cast((remainder & CRC_HIGHEST_BIT_MASK) ? ((remainder << 1) ^ parameters.polynomial) : (remainder << 1)); -#endif - } - } - } - else - { - static crcpp_constexpr CRCType CHAR_BIT_MINUS_ONE(CHAR_BIT - 1); -#ifndef CRCPP_BRANCHLESS - static crcpp_constexpr CRCType CHAR_BIT_HIGHEST_BIT_MASK(CRCType(1) << CHAR_BIT_MINUS_ONE); -#endif - // The conditional expression is used to avoid a -Wshift-count-overflow warning. - static crcpp_constexpr CRCType SHIFT((CHAR_BIT >= CRCWidth) ? static_cast(CHAR_BIT - CRCWidth) : 0); - - CRCType polynomial = static_cast(parameters.polynomial << SHIFT); - remainder = static_cast(remainder << SHIFT); - - while (size--) - { - remainder = static_cast(remainder ^ *current++); - - // An optimizing compiler might choose to unroll this loop. - for (crcpp_size i = 0; i < CHAR_BIT; ++i) - { -#ifdef CRCPP_BRANCHLESS - // Clever way to avoid a branch at the expense of a multiplication. This code is equivalent to the following: - // if (remainder & CHAR_BIT_HIGHEST_BIT_MASK) - // remainder = (remainder << 1) ^ polynomial; - // else - // remainder <<= 1; - remainder = static_cast((remainder << 1) ^ (((remainder >> CHAR_BIT_MINUS_ONE) & 1) * polynomial)); -#else - remainder = static_cast((remainder & CHAR_BIT_HIGHEST_BIT_MASK) ? ((remainder << 1) ^ polynomial) : (remainder << 1)); -#endif - } - } - - remainder = static_cast(remainder >> SHIFT); - } - - return remainder; -} - -/** - @brief Computes a CRC remainder using lookup table. - @param[in] data Data over which the remainder will be computed - @param[in] size Size of the data, in bytes - @param[in] lookupTable CRC lookup table - @param[in] remainder Running CRC remainder. Can be an initial value or the result of a previous CRC remainder calculation. - @tparam CRCType Integer type for storing the CRC result - @tparam CRCWidth Number of bits in the CRC - @return CRC remainder -*/ -template -inline CRCType CRC::CalculateRemainder(const void * data, crcpp_size size, const Table & lookupTable, CRCType remainder) -{ - const unsigned char * current = reinterpret_cast(data); - - if (lookupTable.GetParameters().reflectInput) - { - while (size--) - { -#if defined(WIN32) || defined(_WIN32) || defined(WINCE) - // Disable warning about data loss when doing (remainder >> CHAR_BIT) when - // remainder is one byte long. The algorithm is still correct in this case, - // though it's possible that one additional machine instruction will be executed. -# pragma warning (push) -# pragma warning (disable : 4333) -#endif - remainder = static_cast((remainder >> CHAR_BIT) ^ lookupTable[static_cast(remainder ^ *current++)]); -#if defined(WIN32) || defined(_WIN32) || defined(WINCE) -# pragma warning (pop) -#endif - } - } - else if (CRCWidth >= CHAR_BIT) - { - // The conditional expression is used to avoid a -Wshift-count-overflow warning. - static crcpp_constexpr CRCType SHIFT((CRCWidth >= CHAR_BIT) ? static_cast(CRCWidth - CHAR_BIT) : 0); - - while (size--) - { - remainder = static_cast((remainder << CHAR_BIT) ^ lookupTable[static_cast((remainder >> SHIFT) ^ *current++)]); - } - } - else - { - // The conditional expression is used to avoid a -Wshift-count-overflow warning. - static crcpp_constexpr CRCType SHIFT((CHAR_BIT >= CRCWidth) ? static_cast(CHAR_BIT - CRCWidth) : 0); - - remainder = static_cast(remainder << SHIFT); - - while (size--) - { - // Note: no need to mask here since remainder is guaranteed to fit in a single byte. - remainder = lookupTable[static_cast(remainder ^ *current++)]; - } - - remainder = static_cast(remainder >> SHIFT); - } - - return remainder; -} - -template -inline CRCType CRC::CalculateRemainderBits(unsigned char byte, crcpp_size numBits, const Parameters & parameters, CRCType remainder) -{ - // Slightly different implementations based on the parameters. The current implementations try to eliminate as much - // computation from the inner loop (looping over each bit) as possible. - if (parameters.reflectInput) - { - CRCType polynomial = CRC::Reflect(parameters.polynomial, CRCWidth); - remainder = static_cast(remainder ^ byte); - - // An optimizing compiler might choose to unroll this loop. - for (crcpp_size i = 0; i < numBits; ++i) - { -#ifdef CRCPP_BRANCHLESS - // Clever way to avoid a branch at the expense of a multiplication. This code is equivalent to the following: - // if (remainder & 1) - // remainder = (remainder >> 1) ^ polynomial; - // else - // remainder >>= 1; - remainder = static_cast((remainder >> 1) ^ ((remainder & 1) * polynomial)); -#else - remainder = static_cast((remainder & 1) ? ((remainder >> 1) ^ polynomial) : (remainder >> 1)); -#endif - } - } - else if (CRCWidth >= CHAR_BIT) - { - static crcpp_constexpr CRCType CRC_WIDTH_MINUS_ONE(CRCWidth - CRCType(1)); -#ifndef CRCPP_BRANCHLESS - static crcpp_constexpr CRCType CRC_HIGHEST_BIT_MASK(CRCType(1) << CRC_WIDTH_MINUS_ONE); -#endif - // The conditional expression is used to avoid a -Wshift-count-overflow warning. - static crcpp_constexpr CRCType SHIFT((CRCWidth >= CHAR_BIT) ? static_cast(CRCWidth - CHAR_BIT) : 0); - - remainder = static_cast(remainder ^ (static_cast(byte) << SHIFT)); - - // An optimizing compiler might choose to unroll this loop. - for (crcpp_size i = 0; i < numBits; ++i) - { -#ifdef CRCPP_BRANCHLESS - // Clever way to avoid a branch at the expense of a multiplication. This code is equivalent to the following: - // if (remainder & CRC_HIGHEST_BIT_MASK) - // remainder = (remainder << 1) ^ parameters.polynomial; - // else - // remainder <<= 1; - remainder = static_cast((remainder << 1) ^ (((remainder >> CRC_WIDTH_MINUS_ONE) & 1) * parameters.polynomial)); -#else - remainder = static_cast((remainder & CRC_HIGHEST_BIT_MASK) ? ((remainder << 1) ^ parameters.polynomial) : (remainder << 1)); -#endif - } - } - else - { - static crcpp_constexpr CRCType CHAR_BIT_MINUS_ONE(CHAR_BIT - 1); -#ifndef CRCPP_BRANCHLESS - static crcpp_constexpr CRCType CHAR_BIT_HIGHEST_BIT_MASK(CRCType(1) << CHAR_BIT_MINUS_ONE); -#endif - // The conditional expression is used to avoid a -Wshift-count-overflow warning. - static crcpp_constexpr CRCType SHIFT((CHAR_BIT >= CRCWidth) ? static_cast(CHAR_BIT - CRCWidth) : 0); - - CRCType polynomial = static_cast(parameters.polynomial << SHIFT); - remainder = static_cast((remainder << SHIFT) ^ byte); - - // An optimizing compiler might choose to unroll this loop. - for (crcpp_size i = 0; i < numBits; ++i) - { -#ifdef CRCPP_BRANCHLESS - // Clever way to avoid a branch at the expense of a multiplication. This code is equivalent to the following: - // if (remainder & CHAR_BIT_HIGHEST_BIT_MASK) - // remainder = (remainder << 1) ^ polynomial; - // else - // remainder <<= 1; - remainder = static_cast((remainder << 1) ^ (((remainder >> CHAR_BIT_MINUS_ONE) & 1) * polynomial)); -#else - remainder = static_cast((remainder & CHAR_BIT_HIGHEST_BIT_MASK) ? ((remainder << 1) ^ polynomial) : (remainder << 1)); -#endif - } - - remainder = static_cast(remainder >> SHIFT); - } - - return remainder; -} - -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS -/** - @brief Returns a set of parameters for CRC-4 ITU. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-4 ITU has the following parameters and check value: - - polynomial = 0x3 - - initial value = 0x0 - - final XOR = 0x0 - - reflect input = true - - reflect output = true - - check value = 0x7 - @return CRC-4 ITU parameters -*/ -inline const CRC::Parameters & CRC::CRC_4_ITU() -{ - static const Parameters parameters = { 0x3, 0x0, 0x0, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-5 EPC. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-5 EPC has the following parameters and check value: - - polynomial = 0x09 - - initial value = 0x09 - - final XOR = 0x00 - - reflect input = false - - reflect output = false - - check value = 0x00 - @return CRC-5 EPC parameters -*/ -inline const CRC::Parameters & CRC::CRC_5_EPC() -{ - static const Parameters parameters = { 0x09, 0x09, 0x00, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-5 ITU. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-5 ITU has the following parameters and check value: - - polynomial = 0x15 - - initial value = 0x00 - - final XOR = 0x00 - - reflect input = true - - reflect output = true - - check value = 0x07 - @return CRC-5 ITU parameters -*/ -inline const CRC::Parameters & CRC::CRC_5_ITU() -{ - static const Parameters parameters = { 0x15, 0x00, 0x00, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-5 USB. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-5 USB has the following parameters and check value: - - polynomial = 0x05 - - initial value = 0x1F - - final XOR = 0x1F - - reflect input = true - - reflect output = true - - check value = 0x19 - @return CRC-5 USB parameters -*/ -inline const CRC::Parameters & CRC::CRC_5_USB() -{ - static const Parameters parameters = { 0x05, 0x1F, 0x1F, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-6 CDMA2000-A. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-6 CDMA2000-A has the following parameters and check value: - - polynomial = 0x27 - - initial value = 0x3F - - final XOR = 0x00 - - reflect input = false - - reflect output = false - - check value = 0x0D - @return CRC-6 CDMA2000-A parameters -*/ -inline const CRC::Parameters & CRC::CRC_6_CDMA2000A() -{ - static const Parameters parameters = { 0x27, 0x3F, 0x00, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-6 CDMA2000-B. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-6 CDMA2000-A has the following parameters and check value: - - polynomial = 0x07 - - initial value = 0x3F - - final XOR = 0x00 - - reflect input = false - - reflect output = false - - check value = 0x3B - @return CRC-6 CDMA2000-B parameters -*/ -inline const CRC::Parameters & CRC::CRC_6_CDMA2000B() -{ - static const Parameters parameters = { 0x07, 0x3F, 0x00, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-6 ITU. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-6 ITU has the following parameters and check value: - - polynomial = 0x03 - - initial value = 0x00 - - final XOR = 0x00 - - reflect input = true - - reflect output = true - - check value = 0x06 - @return CRC-6 ITU parameters -*/ -inline const CRC::Parameters & CRC::CRC_6_ITU() -{ - static const Parameters parameters = { 0x03, 0x00, 0x00, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-6 NR. - @note The parameters are static and are delayed-constructed to reduce memory - footprint. - @note CRC-6 NR has the following parameters and check value: - - polynomial = 0x21 - - initial value = 0x00 - - final XOR = 0x00 - - reflect input = false - - reflect output = false - - check value = 0x15 - @return CRC-6 NR parameters -*/ -inline const CRC::Parameters & CRC::CRC_6_NR() -{ - static const Parameters parameters = { 0x21, 0x00, 0x00, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-7 JEDEC. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-7 JEDEC has the following parameters and check value: - - polynomial = 0x09 - - initial value = 0x00 - - final XOR = 0x00 - - reflect input = false - - reflect output = false - - check value = 0x75 - @return CRC-7 JEDEC parameters -*/ -inline const CRC::Parameters & CRC::CRC_7() -{ - static const Parameters parameters = { 0x09, 0x00, 0x00, false, false }; - return parameters; -} -#endif // CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - -/** - @brief Returns a set of parameters for CRC-8 SMBus. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-8 SMBus has the following parameters and check value: - - polynomial = 0x07 - - initial value = 0x00 - - final XOR = 0x00 - - reflect input = false - - reflect output = false - - check value = 0xF4 - @return CRC-8 SMBus parameters -*/ -inline const CRC::Parameters & CRC::CRC_8() -{ - static const Parameters parameters = { 0x07, 0x00, 0x00, false, false }; - return parameters; -} - -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS -/** - @brief Returns a set of parameters for CRC-8 EBU (aka CRC-8 AES). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-8 EBU has the following parameters and check value: - - polynomial = 0x1D - - initial value = 0xFF - - final XOR = 0x00 - - reflect input = true - - reflect output = true - - check value = 0x97 - @return CRC-8 EBU parameters -*/ -inline const CRC::Parameters & CRC::CRC_8_EBU() -{ - static const Parameters parameters = { 0x1D, 0xFF, 0x00, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-8 MAXIM (aka CRC-8 DOW-CRC). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-8 MAXIM has the following parameters and check value: - - polynomial = 0x31 - - initial value = 0x00 - - final XOR = 0x00 - - reflect input = true - - reflect output = true - - check value = 0xA1 - @return CRC-8 MAXIM parameters -*/ -inline const CRC::Parameters & CRC::CRC_8_MAXIM() -{ - static const Parameters parameters = { 0x31, 0x00, 0x00, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-8 WCDMA. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-8 WCDMA has the following parameters and check value: - - polynomial = 0x9B - - initial value = 0x00 - - final XOR = 0x00 - - reflect input = true - - reflect output = true - - check value = 0x25 - @return CRC-8 WCDMA parameters -*/ -inline const CRC::Parameters & CRC::CRC_8_WCDMA() -{ - static const Parameters parameters = { 0x9B, 0x00, 0x00, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-8 LTE. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-8 LTE has the following parameters and check value: - - polynomial = 0x9B - - initial value = 0x00 - - final XOR = 0x00 - - reflect input = false - - reflect output = false - - check value = 0xEA - @return CRC-8 LTE parameters -*/ -inline const CRC::Parameters & CRC::CRC_8_LTE() -{ - static const Parameters parameters = { 0x9B, 0x00, 0x00, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-10 ITU. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-10 ITU has the following parameters and check value: - - polynomial = 0x233 - - initial value = 0x000 - - final XOR = 0x000 - - reflect input = false - - reflect output = false - - check value = 0x199 - @return CRC-10 ITU parameters -*/ -inline const CRC::Parameters & CRC::CRC_10() -{ - static const Parameters parameters = { 0x233, 0x000, 0x000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-10 CDMA2000. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-10 CDMA2000 has the following parameters and check value: - - polynomial = 0x3D9 - - initial value = 0x3FF - - final XOR = 0x000 - - reflect input = false - - reflect output = false - - check value = 0x233 - @return CRC-10 CDMA2000 parameters -*/ -inline const CRC::Parameters & CRC::CRC_10_CDMA2000() -{ - static const Parameters parameters = { 0x3D9, 0x3FF, 0x000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-11 FlexRay. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-11 FlexRay has the following parameters and check value: - - polynomial = 0x385 - - initial value = 0x01A - - final XOR = 0x000 - - reflect input = false - - reflect output = false - - check value = 0x5A3 - @return CRC-11 FlexRay parameters -*/ -inline const CRC::Parameters & CRC::CRC_11() -{ - static const Parameters parameters = { 0x385, 0x01A, 0x000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-11 NR. - @note The parameters are static and are delayed-constructed to reduce memory - footprint. - @note CRC-11 NR has the following parameters and check value: - - polynomial = 0x621 - - initial value = 0x000 - - final XOR = 0x000 - - reflect input = false - - reflect output = false - - check value = 0x5CA - @return CRC-11 NR parameters -*/ -inline const CRC::Parameters & CRC::CRC_11_NR() -{ - static const Parameters parameters = { 0x621, 0x000, 0x000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-12 CDMA2000. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-12 CDMA2000 has the following parameters and check value: - - polynomial = 0xF13 - - initial value = 0xFFF - - final XOR = 0x000 - - reflect input = false - - reflect output = false - - check value = 0xD4D - @return CRC-12 CDMA2000 parameters -*/ -inline const CRC::Parameters & CRC::CRC_12_CDMA2000() -{ - static const Parameters parameters = { 0xF13, 0xFFF, 0x000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-12 DECT (aka CRC-12 X-CRC). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-12 DECT has the following parameters and check value: - - polynomial = 0x80F - - initial value = 0x000 - - final XOR = 0x000 - - reflect input = false - - reflect output = false - - check value = 0xF5B - @return CRC-12 DECT parameters -*/ -inline const CRC::Parameters & CRC::CRC_12_DECT() -{ - static const Parameters parameters = { 0x80F, 0x000, 0x000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-12 UMTS (aka CRC-12 3GPP). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-12 UMTS has the following parameters and check value: - - polynomial = 0x80F - - initial value = 0x000 - - final XOR = 0x000 - - reflect input = false - - reflect output = true - - check value = 0xDAF - @return CRC-12 UMTS parameters -*/ -inline const CRC::Parameters & CRC::CRC_12_UMTS() -{ - static const Parameters parameters = { 0x80F, 0x000, 0x000, false, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-13 BBC. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-13 BBC has the following parameters and check value: - - polynomial = 0x1CF5 - - initial value = 0x0000 - - final XOR = 0x0000 - - reflect input = false - - reflect output = false - - check value = 0x04FA - @return CRC-13 BBC parameters -*/ -inline const CRC::Parameters & CRC::CRC_13_BBC() -{ - static const Parameters parameters = { 0x1CF5, 0x0000, 0x0000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-15 CAN. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-15 CAN has the following parameters and check value: - - polynomial = 0x4599 - - initial value = 0x0000 - - final XOR = 0x0000 - - reflect input = false - - reflect output = false - - check value = 0x059E - @return CRC-15 CAN parameters -*/ -inline const CRC::Parameters & CRC::CRC_15() -{ - static const Parameters parameters = { 0x4599, 0x0000, 0x0000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-15 MPT1327. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-15 MPT1327 has the following parameters and check value: - - polynomial = 0x6815 - - initial value = 0x0000 - - final XOR = 0x0001 - - reflect input = false - - reflect output = false - - check value = 0x2566 - @return CRC-15 MPT1327 parameters -*/ -inline const CRC::Parameters & CRC::CRC_15_MPT1327() -{ - static const Parameters parameters = { 0x6815, 0x0000, 0x0001, false, false }; - return parameters; -} -#endif // CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - -/** - @brief Returns a set of parameters for CRC-16 ARC (aka CRC-16 IBM, CRC-16 LHA). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 ARC has the following parameters and check value: - - polynomial = 0x8005 - - initial value = 0x0000 - - final XOR = 0x0000 - - reflect input = true - - reflect output = true - - check value = 0xBB3D - @return CRC-16 ARC parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_ARC() -{ - static const Parameters parameters = { 0x8005, 0x0000, 0x0000, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 BUYPASS (aka CRC-16 VERIFONE, CRC-16 UMTS). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 BUYPASS has the following parameters and check value: - - polynomial = 0x8005 - - initial value = 0x0000 - - final XOR = 0x0000 - - reflect input = false - - reflect output = false - - check value = 0xFEE8 - @return CRC-16 BUYPASS parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_BUYPASS() -{ - static const Parameters parameters = { 0x8005, 0x0000, 0x0000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 CCITT FALSE. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 CCITT FALSE has the following parameters and check value: - - polynomial = 0x1021 - - initial value = 0xFFFF - - final XOR = 0x0000 - - reflect input = false - - reflect output = false - - check value = 0x29B1 - @return CRC-16 CCITT FALSE parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_CCITTFALSE() -{ - static const Parameters parameters = { 0x1021, 0xFFFF, 0x0000, false, false }; - return parameters; -} - -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS -/** - @brief Returns a set of parameters for CRC-16 CDMA2000. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 CDMA2000 has the following parameters and check value: - - polynomial = 0xC867 - - initial value = 0xFFFF - - final XOR = 0x0000 - - reflect input = false - - reflect output = false - - check value = 0x4C06 - @return CRC-16 CDMA2000 parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_CDMA2000() -{ - static const Parameters parameters = { 0xC867, 0xFFFF, 0x0000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 CMS. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 CMS has the following parameters and check value: - - polynomial = 0x8005 - - initial value = 0xFFFF - - final XOR = 0x0000 - - reflect input = false - - reflect output = false - - check value = 0xAEE7 - @return CRC-16 CMS parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_CMS() -{ - static const Parameters parameters = { 0x8005, 0xFFFF, 0x0000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 DECT-R (aka CRC-16 R-CRC). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 DECT-R has the following parameters and check value: - - polynomial = 0x0589 - - initial value = 0x0000 - - final XOR = 0x0001 - - reflect input = false - - reflect output = false - - check value = 0x007E - @return CRC-16 DECT-R parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_DECTR() -{ - static const Parameters parameters = { 0x0589, 0x0000, 0x0001, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 DECT-X (aka CRC-16 X-CRC). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 DECT-X has the following parameters and check value: - - polynomial = 0x0589 - - initial value = 0x0000 - - final XOR = 0x0000 - - reflect input = false - - reflect output = false - - check value = 0x007F - @return CRC-16 DECT-X parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_DECTX() -{ - static const Parameters parameters = { 0x0589, 0x0000, 0x0000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 DNP. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 DNP has the following parameters and check value: - - polynomial = 0x3D65 - - initial value = 0x0000 - - final XOR = 0xFFFF - - reflect input = true - - reflect output = true - - check value = 0xEA82 - @return CRC-16 DNP parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_DNP() -{ - static const Parameters parameters = { 0x3D65, 0x0000, 0xFFFF, true, true }; - return parameters; -} -#endif // CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - -/** - @brief Returns a set of parameters for CRC-16 GENIBUS (aka CRC-16 EPC, CRC-16 I-CODE, CRC-16 DARC). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 GENIBUS has the following parameters and check value: - - polynomial = 0x1021 - - initial value = 0xFFFF - - final XOR = 0xFFFF - - reflect input = false - - reflect output = false - - check value = 0xD64E - @return CRC-16 GENIBUS parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_GENIBUS() -{ - static const Parameters parameters = { 0x1021, 0xFFFF, 0xFFFF, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 KERMIT (aka CRC-16 CCITT, CRC-16 CCITT-TRUE). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 KERMIT has the following parameters and check value: - - polynomial = 0x1021 - - initial value = 0x0000 - - final XOR = 0x0000 - - reflect input = true - - reflect output = true - - check value = 0x2189 - @return CRC-16 KERMIT parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_KERMIT() -{ - static const Parameters parameters = { 0x1021, 0x0000, 0x0000, true, true }; - return parameters; -} - -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS -/** - @brief Returns a set of parameters for CRC-16 MAXIM. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 MAXIM has the following parameters and check value: - - polynomial = 0x8005 - - initial value = 0x0000 - - final XOR = 0xFFFF - - reflect input = true - - reflect output = true - - check value = 0x44C2 - @return CRC-16 MAXIM parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_MAXIM() -{ - static const Parameters parameters = { 0x8005, 0x0000, 0xFFFF, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 MODBUS. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 MODBUS has the following parameters and check value: - - polynomial = 0x8005 - - initial value = 0xFFFF - - final XOR = 0x0000 - - reflect input = true - - reflect output = true - - check value = 0x4B37 - @return CRC-16 MODBUS parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_MODBUS() -{ - static const Parameters parameters = { 0x8005, 0xFFFF, 0x0000, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 T10-DIF. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 T10-DIF has the following parameters and check value: - - polynomial = 0x8BB7 - - initial value = 0x0000 - - final XOR = 0x0000 - - reflect input = false - - reflect output = false - - check value = 0xD0DB - @return CRC-16 T10-DIF parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_T10DIF() -{ - static const Parameters parameters = { 0x8BB7, 0x0000, 0x0000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 USB. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 USB has the following parameters and check value: - - polynomial = 0x8005 - - initial value = 0xFFFF - - final XOR = 0xFFFF - - reflect input = true - - reflect output = true - - check value = 0xB4C8 - @return CRC-16 USB parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_USB() -{ - static const Parameters parameters = { 0x8005, 0xFFFF, 0xFFFF, true, true }; - return parameters; -} - -#endif // CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - -/** - @brief Returns a set of parameters for CRC-16 X-25 (aka CRC-16 IBM-SDLC, CRC-16 ISO-HDLC, CRC-16 B). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 X-25 has the following parameters and check value: - - polynomial = 0x1021 - - initial value = 0xFFFF - - final XOR = 0xFFFF - - reflect input = true - - reflect output = true - - check value = 0x906E - @return CRC-16 X-25 parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_X25() -{ - static const Parameters parameters = { 0x1021, 0xFFFF, 0xFFFF, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-16 XMODEM (aka CRC-16 ZMODEM, CRC-16 ACORN, CRC-16 LTE). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-16 XMODEM has the following parameters and check value: - - polynomial = 0x1021 - - initial value = 0x0000 - - final XOR = 0x0000 - - reflect input = false - - reflect output = false - - check value = 0x31C3 - @return CRC-16 XMODEM parameters -*/ -inline const CRC::Parameters & CRC::CRC_16_XMODEM() -{ - static const Parameters parameters = { 0x1021, 0x0000, 0x0000, false, false }; - return parameters; -} - -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS -/** - @brief Returns a set of parameters for CRC-17 CAN. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-17 CAN has the following parameters and check value: - - polynomial = 0x1685B - - initial value = 0x00000 - - final XOR = 0x00000 - - reflect input = false - - reflect output = false - - check value = 0x04F03 - @return CRC-17 CAN parameters -*/ -inline const CRC::Parameters & CRC::CRC_17_CAN() -{ - static const Parameters parameters = { 0x1685B, 0x00000, 0x00000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-21 CAN. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-21 CAN has the following parameters and check value: - - polynomial = 0x102899 - - initial value = 0x000000 - - final XOR = 0x000000 - - reflect input = false - - reflect output = false - - check value = 0x0ED841 - @return CRC-21 CAN parameters -*/ -inline const CRC::Parameters & CRC::CRC_21_CAN() -{ - static const Parameters parameters = { 0x102899, 0x000000, 0x000000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-24 OPENPGP. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-24 OPENPGP has the following parameters and check value: - - polynomial = 0x864CFB - - initial value = 0xB704CE - - final XOR = 0x000000 - - reflect input = false - - reflect output = false - - check value = 0x21CF02 - @return CRC-24 OPENPGP parameters -*/ -inline const CRC::Parameters & CRC::CRC_24() -{ - static const Parameters parameters = { 0x864CFB, 0xB704CE, 0x000000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-24 FlexRay-A. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-24 FlexRay-A has the following parameters and check value: - - polynomial = 0x5D6DCB - - initial value = 0xFEDCBA - - final XOR = 0x000000 - - reflect input = false - - reflect output = false - - check value = 0x7979BD - @return CRC-24 FlexRay-A parameters -*/ -inline const CRC::Parameters & CRC::CRC_24_FLEXRAYA() -{ - static const Parameters parameters = { 0x5D6DCB, 0xFEDCBA, 0x000000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-24 FlexRay-B. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-24 FlexRay-B has the following parameters and check value: - - polynomial = 0x5D6DCB - - initial value = 0xABCDEF - - final XOR = 0x000000 - - reflect input = false - - reflect output = false - - check value = 0x1F23B8 - @return CRC-24 FlexRay-B parameters -*/ -inline const CRC::Parameters & CRC::CRC_24_FLEXRAYB() -{ - static const Parameters parameters = { 0x5D6DCB, 0xABCDEF, 0x000000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-24 LTE-A/NR-A. - @note The parameters are static and are delayed-constructed to reduce memory - footprint. - @note CRC-24 LTE-A has the following parameters and check value: - - polynomial = 0x864CFB - - initial value = 0x000000 - - final XOR = 0x000000 - - reflect input = false - - reflect output = false - - check value = 0xCDE703 - @return CRC-24 LTE-A parameters -*/ -inline const CRC::Parameters & CRC::CRC_24_LTEA() -{ - static const Parameters parameters = { 0x864CFB, 0x000000, 0x000000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-24 LTE-B/NR-B. - @note The parameters are static and are delayed-constructed to reduce memory - footprint. - @note CRC-24 LTE-B has the following parameters and check value: - - polynomial = 0x800063 - - initial value = 0x000000 - - final XOR = 0x000000 - - reflect input = false - - reflect output = false - - check value = 0x23EF52 - @return CRC-24 LTE-B parameters -*/ -inline const CRC::Parameters & CRC::CRC_24_LTEB() -{ - static const Parameters parameters = { 0x800063, 0x000000, 0x000000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-24 NR-C. - @note The parameters are static and are delayed-constructed to reduce memory - footprint. - @note CRC-24 NR-C has the following parameters and check value: - - polynomial = 0xB2B117 - - initial value = 0x000000 - - final XOR = 0x000000 - - reflect input = false - - reflect output = false - - check value = 0xF48279 - @return CRC-24 NR-C parameters -*/ -inline const CRC::Parameters & CRC::CRC_24_NRC() -{ - static const Parameters parameters = { 0xB2B117, 0x000000, 0x000000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-30 CDMA. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-30 CDMA has the following parameters and check value: - - polynomial = 0x2030B9C7 - - initial value = 0x3FFFFFFF - - final XOR = 0x00000000 - - reflect input = false - - reflect output = false - - check value = 0x3B3CB540 - @return CRC-30 CDMA parameters -*/ -inline const CRC::Parameters & CRC::CRC_30() -{ - static const Parameters parameters = { 0x2030B9C7, 0x3FFFFFFF, 0x00000000, false, false }; - return parameters; -} -#endif // CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - -/** - @brief Returns a set of parameters for CRC-32 (aka CRC-32 ADCCP, CRC-32 PKZip). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-32 has the following parameters and check value: - - polynomial = 0x04C11DB7 - - initial value = 0xFFFFFFFF - - final XOR = 0xFFFFFFFF - - reflect input = true - - reflect output = true - - check value = 0xCBF43926 - @return CRC-32 parameters -*/ -inline const CRC::Parameters & CRC::CRC_32() -{ - static const Parameters parameters = { 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, true, true }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-32 BZIP2 (aka CRC-32 AAL5, CRC-32 DECT-B, CRC-32 B-CRC). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-32 BZIP2 has the following parameters and check value: - - polynomial = 0x04C11DB7 - - initial value = 0xFFFFFFFF - - final XOR = 0xFFFFFFFF - - reflect input = false - - reflect output = false - - check value = 0xFC891918 - @return CRC-32 BZIP2 parameters -*/ -inline const CRC::Parameters & CRC::CRC_32_BZIP2() -{ - static const Parameters parameters = { 0x04C11DB7, 0xFFFFFFFF, 0xFFFFFFFF, false, false }; - return parameters; -} - -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS -/** - @brief Returns a set of parameters for CRC-32 C (aka CRC-32 ISCSI, CRC-32 Castagnoli, CRC-32 Interlaken). - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-32 C has the following parameters and check value: - - polynomial = 0x1EDC6F41 - - initial value = 0xFFFFFFFF - - final XOR = 0xFFFFFFFF - - reflect input = true - - reflect output = true - - check value = 0xE3069283 - @return CRC-32 C parameters -*/ -inline const CRC::Parameters & CRC::CRC_32_C() -{ - static const Parameters parameters = { 0x1EDC6F41, 0xFFFFFFFF, 0xFFFFFFFF, true, true }; - return parameters; -} -#endif - -/** - @brief Returns a set of parameters for CRC-32 MPEG-2. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-32 MPEG-2 has the following parameters and check value: - - polynomial = 0x04C11DB7 - - initial value = 0xFFFFFFFF - - final XOR = 0x00000000 - - reflect input = false - - reflect output = false - - check value = 0x0376E6E7 - @return CRC-32 MPEG-2 parameters -*/ -inline const CRC::Parameters & CRC::CRC_32_MPEG2() -{ - static const Parameters parameters = { 0x04C11DB7, 0xFFFFFFFF, 0x00000000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-32 POSIX. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-32 POSIX has the following parameters and check value: - - polynomial = 0x04C11DB7 - - initial value = 0x00000000 - - final XOR = 0xFFFFFFFF - - reflect input = false - - reflect output = false - - check value = 0x765E7680 - @return CRC-32 POSIX parameters -*/ -inline const CRC::Parameters & CRC::CRC_32_POSIX() -{ - static const Parameters parameters = { 0x04C11DB7, 0x00000000, 0xFFFFFFFF, false, false }; - return parameters; -} - -#ifdef CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS -/** - @brief Returns a set of parameters for CRC-32 Q. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-32 Q has the following parameters and check value: - - polynomial = 0x814141AB - - initial value = 0x00000000 - - final XOR = 0x00000000 - - reflect input = false - - reflect output = false - - check value = 0x3010BF7F - @return CRC-32 Q parameters -*/ -inline const CRC::Parameters & CRC::CRC_32_Q() -{ - static const Parameters parameters = { 0x814141AB, 0x00000000, 0x00000000, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-40 GSM. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-40 GSM has the following parameters and check value: - - polynomial = 0x0004820009 - - initial value = 0x0000000000 - - final XOR = 0xFFFFFFFFFF - - reflect input = false - - reflect output = false - - check value = 0xD4164FC646 - @return CRC-40 GSM parameters -*/ -inline const CRC::Parameters & CRC::CRC_40_GSM() -{ - static const Parameters parameters = { 0x0004820009, 0x0000000000, 0xFFFFFFFFFF, false, false }; - return parameters; -} - -/** - @brief Returns a set of parameters for CRC-64 ECMA. - @note The parameters are static and are delayed-constructed to reduce memory footprint. - @note CRC-64 ECMA has the following parameters and check value: - - polynomial = 0x42F0E1EBA9EA3693 - - initial value = 0x0000000000000000 - - final XOR = 0x0000000000000000 - - reflect input = false - - reflect output = false - - check value = 0x6C40DF5F0B497347 - @return CRC-64 ECMA parameters -*/ -inline const CRC::Parameters & CRC::CRC_64() -{ - static const Parameters parameters = { 0x42F0E1EBA9EA3693, 0x0000000000000000, 0x0000000000000000, false, false }; - return parameters; -} -#endif // CRCPP_INCLUDE_ESOTERIC_CRC_DEFINITIONS - -#ifdef CRCPP_USE_NAMESPACE -} -#endif - -#endif // CRCPP_CRC_H_ diff --git a/src/无人机端代码/Modules/communication/shard/include/Struct.hpp b/src/无人机端代码/Modules/communication/shard/include/Struct.hpp deleted file mode 100644 index 806d761d..00000000 --- a/src/无人机端代码/Modules/communication/shard/include/Struct.hpp +++ /dev/null @@ -1,900 +0,0 @@ -#ifndef STRUCT_HPP -#define STRUCT_HPP - -#include -#include // NULL -#include -#include -#include -#include - -#include -#include -#include - -//uav control -#define OPENUAVBASIC "gnome-terminal -- roslaunch prometheus_uav_control uav_control_main_outdoor.launch" -// #define CLOSEUAVBASIC "gnome-terminal -- rosnode kill /joy_node | gnome-terminal -- rosnode kill /uav_control_main_1" -//rhea control -#define OPENUGVBASIC "" -#define CLOSEUGVBASIC "" -//集群 -#define OPENSWARMCONTROL "" -#define CLOSESWARMCONTROL "" -//自主降落 -#define OPENAUTONOMOUSLANDING "" -#define CLOSEAUTONOMOUSLANDING "" -//目标识别与追踪 -#define OPENOBJECTTRACKING "" -#define CLOSEOBJECTTRACKING "" -//杀掉除了通信节点和主节点的其他节点 -//分为两种情况 -//1:杀掉子模块,这种情况不会杀掉uav control节点和通信节点以及master节点。 -//2:杀掉uav control节点,这种情况下只会保留通信节点以及master节点。 -#define CLOSEUAVBASIC "gnome-terminal -- rosnode kill `rosnode list | grep -v /ground_station_bridge | grep -v /rosout`" -#define CLOSEOTHERMODE "gnome-terminal -- rosnode kill `rosnode list | grep -v /ground_station_bridge | grep -v /rosout | grep -v /uav_control_main_1 | grep -v /joy_node`" - -//重启 -#define REBOOTNXCMD "shutdown -r now" -//关机 -#define EXITNXCMD "shutdown -h now" - - -enum MsgId -{ - UAVSTATE = 1, - TEXTINFO = 3, - GIMBALSTATE = 4, - VISIONDIFF = 5, - HEARTBEAT = 6, - RHEASTATE = 7, - MULTIDETECTIONINFO = 8, - UAVCONTROLSTATE = 9, - - SWARMCOMMAND = 101, - GIMBALCONTROL = 102, - GIMBALSERVICE = 103, - WINDOWPOSITION = 104, - RHEACONTROL = 105, - GIMBALPARAMSET = 106, - IMAGEDATA = 107, - UAVCOMMAND = 108, - UAVSETUP = 109, - - CONNECTSTATE = 201, - MODESELECTION = 202, - - //rviz数据 - UGVLASERSCAN = 230, - UGVPOINTCLOUND2 = 231, - - UGVTFMESSAGE = 232, - UGVTFSTATIC = 233, - - UGVMARKERARRAY = 234, - UGVMARKERARRAYLANDMARK = 235, - UGVMARKERARRAYTRAJECTORY = 236 -}; - -//参考文件: UAVState.msg -//订阅话题: /uav*/prometheus/state -struct Quaternion -{ - double x; - double y; - double z; - double w; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &x; - ar &y; - ar &z; - ar &w; - } -}; -//MSG 1 -struct UAVState -{ - //无人机编号 - uint8_t uav_id; - - // //无人机状态 - // uint8_t state; - // //enum agent状态枚举 - // enum State - // { - // unknown = 0, - // ready = 1, - // dead = 2, - // lost = 3 - // }; - - //无人机定位来源 - uint8_t location_source; - - //enum agent定位来源枚举 - enum LocationSource - { - MOCAP = 0, - T265 = 1, - GAZEBO = 2, - FAKE_ODOM = 3, - GPS = 4, - RTK = 5, - UWB = 6 - }; - - // PX4飞控当前飞行模式 int8 - std::string mode; - // 机载电脑是否连接上飞控,true已连接,false则不是 - bool connected; - // 是否解锁,true为已解锁,false则不是 - bool armed; - // odom失效 - bool odom_valid; - // GPS状态,变量对应状态可参考mavros_msgs/GPSRAW中的fix_type - uint8_t gps_status; - // GPS状态枚举 - enum GPSStatus - { - GPS_FIX_TYPE_NO_GPS = 0, - GPS_FIX_TYPE_NO_FIX = 1, - GPS_FIX_TYPE_2D_FIX = 2, - GPS_FIX_TYPE_3D_FIX = 3, - GPS_FIX_TYPE_DGPS = 4, - GPS_FIX_TYPE_RTK_FLOATR = 5, - GPS_FIX_TYPE_RTK_FIXEDR = 6, - GPS_FIX_TYPE_STATIC = 7, - GPS_FIX_TYPE_PPP = 8 - }; - - //无人机经度、纬度、高度 - float latitude; - float longitude; - float altitude; - - // 无人机状态量:位置、速度、姿态 - float position[3]; // [m] - float velocity[3]; // [m/s] - float attitude[3]; // [rad] - Quaternion attitude_q; // 四元数 - float attitude_rate[3]; // [rad/s] - float battery_state; // 电池状态[v] - float battery_percetage; // [0-1] - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &uav_id; - // ar &state; - ar &location_source; - ar &connected; - ar &mode; - ar &armed; - ar &odom_valid; - ar &gps_status; - ar &latitude; - ar &longitude; - ar &altitude; - ar &position; - ar &velocity; - ar &attitude; - ar &attitude_q; - ar &attitude_rate; - ar &battery_state; - ar &battery_percetage; - } -}; - -struct Heartbeat -{ - uint32_t count; - std::string message; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &count; - ar &message; - } -}; - -struct RheaState -{ - uint8_t rhea_id; - double linear; - double angular; - double yaw; - float latitude; - float longitude; - float altitude; - float position[3]; - float battery_voltage; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &rhea_id; - ar &linear; - ar &angular; - ar &yaw; - ar &latitude; - ar &longitude; - ar &altitude; - ar &position; - ar &battery_voltage; - } -}; - -struct ModeSelection -{ - uint8_t mode; - enum Mode - { - UAVBASIC = 1, - UGVBASIC = 2, - SWARMCONTROL = 3, - //GIMBAL? - AUTONOMOUSLANDING = 4, - OBJECTTRACKING = 5, - CUSTOMMODE = 6, - REBOOTNX = 7, - EXITNX = 8 - }; -// bool is_simulation; - std::vector selectId; - // uint8_t swarm_num; - - uint8_t use_mode; - enum UseMode - { - CREATE = 0, - DELETE = 1 - }; - - bool is_simulation; - - int swarm_num; - - std::string cmd; - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &selectId; - ar &mode; - ar &use_mode; - ar &is_simulation; - ar &swarm_num; - ar &cmd; - } -}; - -struct Point -{ - double x; - double y; - double z; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &x; - ar &y; - ar &z; - } -}; - -// SwarmCommand.msg -// /prometheus/swarm_command -struct SwarmCommand -{ - // 消息来源 - std::string source; - - //编队套件数量 - uint8_t swarm_num; - - //定位来源 - uint8_t swarm_location_source; - enum SwarmLocationSource - { - mocap = 0, - gps = 4, - rtk = 5, - uwb = 6 - }; - - // 命令 - uint8_t Swarm_CMD; - // enum CMD 控制模式枚举 - // enum CMD 控制模式枚举 - enum SwarmCMD - { - Ready = 0, - Init = 1, - Start = 2, - Hold = 3, - Stop = 4, - Formation = 5, - Follow = 11, - Search = 12, - Attack = 13 - }; - - // 编队控制参考量 - float leader_pos[3]; - float leader_vel[2]; - float swarm_size; - uint8_t swarm_shape; - enum SwarmShape - { - One_column = 0, - Triangle = 1, - Square = 2, - Circular = 3 - }; - - // 搜索控制参考量 - float target_area_x_min; // [m] - float target_area_y_min; // [m] - float target_area_x_max; // [m] - float target_area_y_max; // [m] - - // 攻击控制参考量 - float attack_target_pos[3]; // [m] - - std::vector formation_poses; - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &source; - ar &swarm_num; - ar &swarm_location_source; - ar &Swarm_CMD; - ar &leader_pos; - ar &leader_vel; - ar &swarm_size; - ar &swarm_shape; - ar &target_area_x_min; - ar &target_area_y_min; - ar &target_area_x_max; - ar &target_area_y_max; - ar &attack_target_pos; - ar &formation_poses; - } -}; - -// StationFeedback.msg -// /uav*/prometheus/station_feedback -struct TextInfo -{ - enum MessageTypeGrade - { - //INFO:正常运行状况下反馈给地面站的信息,例如程序正常启动,状态切换的提示信息等. - INFO = 0, - //WARN:无人机或软件程序出现意外情况,依然能正常启动或继续执行任务,小概率会出现危险状况,例如无人机RTK无法维持退出到GPS,视觉跟踪目标突然丢失重新搜寻目标等. - WARN = 1, - //ERROR:无人机或软件程序出现重大意外情况,无法正常启动或继续执行任务,极有可能会出现危险状况,需要中断任务以及人为接管控制无人机,例如通信中断,无人机定位发散,ROS节点无法正常启动等. - ERROR = 2, - //FATAL:任务执行过程中,软件崩溃或无人机飞控崩溃导致无人机完全失控,需要迅速人为接管控制无人机降落减少炸机损失. - FATAL = 3 - }; - - int sec; - uint8_t MessageType; - std::string Message; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &sec; - ar &MessageType; - ar &Message; - } -}; - -//参考文件: GimbalState.msg -//订阅话题: ~/gimbal/state -struct GimbalState -{ - uint8_t Id; - //# 0: 发一句回一句 `# 1: 发一句,一直回复, 摄像头倍数返回将失效`` - uint8_t feedbackMode; - //mode 0:手动控制 1:home 2:tracking 3:yaw follow 4:hold吊舱跟随无人机 5:search - uint8_t mode; - //是否视频录制 - bool isRecording; - //# 是否开启自动缩放(VisionDiff需要指定面积才能生效) 0:保持 1:放大 2:缩小 3:自动 - uint8_t zoomState; - // 当前所处倍数 - float zoomVal; - //roll,pitch,yaw - float imuAngle[3]; - //Current gimbal joint angles(roll,pitch,yaw), published at 30 Hz. - float rotorAngle[3]; - //rpy_vel 角速度 - float imuAngleVel[3]; - //rpy_tgt 目标角度 - float rotorAngleTarget[3]; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &Id; - ar &feedbackMode; - ar &mode; - ar &isRecording; - ar &zoomState; - ar &zoomVal; - ar &imuAngle; - ar &rotorAngle; - ar &imuAngleVel; - ar &rotorAngleTarget; - } -}; -//参考文件: VisionDiff.msg -//订阅话题: ~/gimbal/track -struct VisionDiff -{ - uint8_t id; - uint8_t detect; - - uint16_t objectX; - uint16_t objectY; - uint16_t objectWidth; - uint16_t objectHeight; - - uint16_t frameWidth; - uint16_t frameHeight; - - // Gimbal 跟踪pid - float kp; - float ki; - float kd; - - int8_t ctlMode; // 0: yaw+pitch, 1: roll+pitch 3:混合(未实现) - enum CtlMode - { - yawPitch = 0, - rollPitch = 1, - mix = 3 - }; - - float currSize; //框选近大远小 - float maxSize; - float minSize; //框选大小 - - float trackIgnoreError; - bool autoZoom; - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &id; - ar &objectX; - ar &objectY; - ar &objectWidth; - ar &objectHeight; - ar &frameWidth; - ar &frameHeight; - ar &kp; - ar &ki; - ar &kd; - ar &ctlMode; - ar &currSize; - ar &maxSize; - ar &minSize; - ar &trackIgnoreError; - ar &autoZoom; - } -}; - -//参考文件: GimbalControl.msg -//订阅话题: ~/gimbal/control -struct GimbalControl -{ - uint8_t Id; - //control mode 0:nothong 1:angle 2:speed 3:home postion - uint8_t rpyMode; - enum RPYMode - { - manual = 1, - home = 2, - hold = 3, - fellow = 4 - }; - - uint8_t roll; - uint8_t yaw; - uint8_t pitch; - - enum ControlMode - { - noCtl = 0, - velocityCtl = 1, - angleCtl = 2 - }; - - float rValue; // deg 单位 - float yValue; // deg - float pValue; // deg - - // focus - uint8_t focusMode; // 默认值 - enum FocusMode - { - focusStop = 1, - focusOut = 2, - focusIn = 3 - }; - - // zoom - uint8_t zoomMode; // 默认值 - enum ZoomMode - { - zoomStop = 1, - zoomOut = 2, - zoomIn = 3 - }; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &Id; - ar &rpyMode; - ar &roll; - ar &yaw; - ar &pitch; - ar &rValue; - ar &yValue; - ar &pValue; - ar &focusMode; - ar &zoomMode; - } -}; - -struct GimbalService -{ - uint8_t service; - enum Service - { - search = 1, - record_video = 2, - track_mode = 3 - }; - - bool data; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &service; - ar &data; - } -}; - -struct GimbalParamSet -{ - std::string param_id; - double real; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar ¶m_id; - ar ℜ - } -}; - -struct WindowPosition -{ - //模式:... - uint8_t mode; - enum Mode - { - IDLE = 0, - RECTANGLE = 1, - POINT = 2, - TRACK_ID = 3, - FRAME_ID_AND_POINT = 4 - }; - - //波门位置X,//波门位置Y(kcf,点击画面的功能的时候使用),左上角为(0,0) - int16_t origin_x; - int16_t origin_y; - int16_t width; - int16_t height; - - //波门位置X,//波门位置Y - //int16 window_position_x = origin_x + width/2 - //int16 window_position_y = origin_y + height/2 - int16_t window_position_x; - int16_t window_position_y; - - //算法检测结果的ID - int32_t track_id; - - // //被点击或框选帧(画面暂停的ID) - // int32_t frame_id; - - std::string udp_msg; - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &mode; - ar &origin_x; - ar &origin_y; - ar &width; - ar &height; - ar &window_position_x; - ar &window_position_y; - ar &track_id; - // ar &frame_id; - ar &udp_msg; - } -}; - -//ROS话题: "/deepsort_ros/object_detection_result" -struct DetectionInfo -{ - //目标框的位置(主要斜对角两个点) - float left; - float top; - float bot; - float right; - - //TRACK TARGET - int32_t trackIds; - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &left; - ar ⊤ - ar ⊥ - ar &right; - ar &trackIds; - } -}; -struct MultiDetectionInfo -{ - //模式:0:空闲 2.simaRPN 3.deepsort/sort - uint8_t mode; - - //检测到的目标数量 - int32_t num_objs; - - //每个目标的检测结果 - //DetectionInfo[] detection_infos; - std::vector detection_infos; - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &mode; - ar &num_objs; - ar &detection_infos; - } -}; - -struct RheaGPS -{ - double latitude; - double longitude; - double altitude; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &latitude; - ar &longitude; - ar &altitude; - } -}; - -struct RheaControl -{ - - uint8_t Mode; - - //控制模式类型枚举 - enum Mode - { - Stop = 0, - Forward = 1, - Left = 2, - Right = 3, - Back = 4, - CMD = 5, - Waypoint = 6 - }; - - double linear; - double angular; - - std::vector waypoint; - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &Mode; - ar &linear; - ar &angular; - ar &waypoint; - } -}; - -struct ImageData -{ - std::string name; - std::string data; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &name; - ar &data; - } -}; - -struct UAVCommand -{ - //控制命令的模式 - uint8_t Agent_CMD; - //Agent_CMD 枚举 - enum AgentCMD - { - Init_Pos_Hover = 1, - Current_Pos_Hover = 2, - Land = 3, - Move = 4, - User_Mode1 = 5 - }; - - //移动命令下的子模式 - uint8_t Move_mode; - // 移动命令下的子模式枚举 - enum MoveMode - { - XYZ_POS = 0, // 惯性系定点控制 - XY_VEL_Z_POS = 1, // 惯性系定高速度控制 - XYZ_VEL = 2, // 惯性系速度控制 - XYZ_POS_BODY = 3, // 机体系位置控制 - XYZ_VEL_BODY = 4, // 机体系速度控制 - XY_VEL_Z_POS_BODY = 5, // 机体系定高速度控制 - TRAJECTORY = 6, // 轨迹追踪控制 - XYZ_ATT = 7, // 姿态控制(来自外部控制器) - LAT_LON_ALT = 8 // 绝对坐标系下的经纬度 - }; - // 控制参考量 - float position_ref[3]; // [m] - float velocity_ref[3]; // [m/s] - float acceleration_ref[3]; // [m/s^2] - float yaw_ref; // [rad] - bool Yaw_Rate_Mode; // True 代表控制偏航角速率 - float yaw_rate_ref; // [rad/s] - float att_ref[4]; // [rad] + [0-1] - double latitude; // 无人机经度、纬度、高度 - double longitude; // 无人机经度、纬度、高度 - double altitude; // 无人机经度、纬度、高度 - - // 控制命令的编号 防止接收到错误命令, 编号应该逐次递加 - uint Command_ID; - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &Agent_CMD; - ar &Move_mode; - ar &position_ref; - ar &velocity_ref; - ar &acceleration_ref; - ar &yaw_ref; - ar &Yaw_Rate_Mode; - ar &yaw_rate_ref; - ar &att_ref; - ar &Command_ID; - ar &latitude; - ar &longitude; - ar &altitude; - } -}; - -struct UAVSetup -{ - //Setup类型(模拟遥控器) - uint8_t cmd; - enum CMD - { - ARMING = 0, - SET_PX4_MODE = 1, - REBOOT_PX4 = 2, - SET_CONTROL_MODE = 3, - }; - - bool arming; - // http://wiki.ros.org/mavros/CustomModes ,可参考该网址设置模式名,常用模式名:OFFBOARD,AUTO.LAND,AUTO.RTL,POSCTL - std::string px4_mode; - std::string control_state; - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &cmd; - ar &arming; - ar &px4_mode; - ar &control_state; - } -}; - -struct UAVControlState -{ - // 无人机编号 - uint8_t uav_id; - - // 无人机控制状态 - uint8_t control_state; - // 状态枚举 - enum ControlState - { - INIT = 0, - MANUAL_CONTROL = 1, - HOVER_CONTROL = 2, - COMMAND_CONTROL = 3, - LAND_CONTROL = 4 - }; - - // 无人机控制器标志量 - uint8_t pos_controller; - // 状态枚举 - enum ControllerFlag - { - PX4_ORIGIN = 0, - PID = 1, - UDE = 2, - NE = 3 - }; - - // 无人机安全保护触发标志量 - bool failsafe; - - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar &uav_id; - ar &control_state; - ar &pos_controller; - ar &failsafe; - } -}; - -struct ConnectState -{ - uint8_t num; - bool state; - friend class boost::serialization::access; - template - void serialize(Archive &ar, const unsigned int /* file_version */) - { - ar # - ar &state; - } -}; - -#endif \ No newline at end of file diff --git a/src/无人机端代码/Modules/communication/shard/include/communication.hpp b/src/无人机端代码/Modules/communication/shard/include/communication.hpp deleted file mode 100644 index 150355fa..00000000 --- a/src/无人机端代码/Modules/communication/shard/include/communication.hpp +++ /dev/null @@ -1,98 +0,0 @@ -#ifndef COMUNICATION_HPP -#define COMUNICATION_HPP - -#include -#include -#include -#include -#include -#include - -#include "CRC.h" -#include "Struct.hpp" - - -#define BUF_LEN 1024 * 10 // 1024*10 bytes -#define SERV_PORT 20168 - -typedef unsigned char byte; - -enum Send_Mode -{ - TCP = 1, - UDP = 2 -}; - -class Communication -{ -public: - Communication(); - ~Communication(); - - void init(int id, int udp_port, int tcp_port, int tcp_heart_port); - - //编码 - template - int encodeMsg(int8_t send_mode, T msg); - - //解码 - int decodeMsg(char *buff); - - //根据传入的struct返回对应的MSG_ID - template - uint8_t getMsgId(T msg); - - template - T add(T num1,T num2); - - // UDP client - int connectToUdpMulticast(const char *ip, const int port); - - // TCP client 返回套接字 - int connectToDrone(const char *ip, const int port); - - void sendMsgByUdp(int msg_len, std::string target_ip); - - void sendMsgByUdp(int msg_len, const char* udp_msg ,std::string target_ip, int port); - - void sendMsgByTcp(int msg_len, std::string target_ip); - - // TCP server - int waitConnectionFromGroundStation(const int port); - - // UDP server - int waitConnectionFromMulticast(const int port); - - unsigned short checksum(char *buff, int len); - -protected: - int ROBOT_ID = 0; - - // tcp/udp - struct sockaddr_in tcp_addr, udp_addr; - int tcp_send_sock, udp_send_sock, server_fd, udp_fd, recv_sock, udp_socket, rviz_socket, UDP_PORT, TCP_PORT, TCP_HEARTBEAT_PORT; - char udp_send_buf[BUF_LEN], udp_recv_buf[BUF_LEN], tcp_send_buf[BUF_LEN], tcp_recv_buf[BUF_LEN]; - std::string udp_ip, multicast_udp_ip; - - int try_connect_num = 0, disconnect_num = 0; - -public: - struct SwarmCommand recv_swarm_command_; - struct UAVState recv_uav_state_; - struct ConnectState recv_connect_state_; - struct GimbalControl recv_gimbal_control_; - struct ModeSelection recv_mode_selection_; - struct GimbalService recv_gimbal_service_; - struct WindowPosition recv_window_position_; - struct RheaControl recv_rhea_control_; - struct GimbalParamSet recv_param_set_; - struct RheaState recv_rhea_state_; - struct ImageData recv_image_data_; - struct UAVCommand recv_uav_cmd_; - struct UAVSetup recv_uav_setup_; - struct TextInfo recv_text_info_; - struct GimbalState recv_gimbal_state_; - struct VisionDiff recv_vision_diff_; -}; - -#endif \ No newline at end of file diff --git a/src/无人机端代码/Modules/communication/shard/libs/libcommunication.so b/src/无人机端代码/Modules/communication/shard/libs/libcommunication.so deleted file mode 100644 index 357669673ee546190543a814535bc4c2f94349fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1479848 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