|
1 | 1 | #include "utility/rclcpp/visualization.hpp" |
| 2 | +#include "utility/math/solve_armors.hpp" |
2 | 3 | #include <eigen3/Eigen/Dense> |
3 | 4 | #include <print> |
4 | | -#include <rclcpp/rclcpp.hpp> |
| 5 | +#include <rclcpp/utilities.hpp> |
5 | 6 |
|
6 | 7 | auto main() -> int { |
7 | 8 | using namespace rmcs; |
8 | 9 | using namespace rmcs::util; |
9 | 10 |
|
| 11 | + constexpr auto translation_speed = 3.; // m |
| 12 | + constexpr auto orientation_speed = 6.28; // rad |
| 13 | + |
10 | 14 | rclcpp::init(0, nullptr); |
11 | 15 |
|
12 | 16 | std::println("> Hello World!!!"); |
13 | 17 | std::println("> Visualization Here using Rclcpp"); |
14 | 18 |
|
15 | | - auto visualization = Visualization { "example" }; |
| 19 | + auto visual = VisualNode { "example" }; |
| 20 | + |
| 21 | + auto armors = std::array<std::unique_ptr<visual::Armor>, 4> {}; |
| 22 | + auto index = char { 'a' }; |
| 23 | + std::ranges::for_each(armors, [&](auto& armor) { |
| 24 | + const auto naming { std::string { "sentry_" } + index++ }; |
| 25 | + armor = visual.make<visual::Armor>(naming, "camera_link"); |
| 26 | + armor->init(DeviceId::SENTRY, CampColor::BLUE); |
| 27 | + }); |
16 | 28 |
|
17 | | - auto armor_a = visualization.make_visualized<visual::Armor>("sentry_a", "camera_link"); |
18 | | - auto armor_b = visualization.make_visualized<visual::Armor>("sentry_b", "camera_link"); |
19 | | - auto armor_c = visualization.make_visualized<visual::Armor>("sentry_c", "camera_link"); |
20 | | - auto armor_d = visualization.make_visualized<visual::Armor>("sentry_d", "camera_link"); |
21 | | - armor_a->init(DeviceId::INFANTRY_3, CampColor::RED); |
22 | | - armor_b->init(DeviceId::INFANTRY_3, CampColor::RED); |
23 | | - armor_c->init(DeviceId::INFANTRY_3, CampColor::RED); |
24 | | - armor_d->init(DeviceId::INFANTRY_3, CampColor::RED); |
| 29 | + auto solution = ArmorsForwardSolution {}; |
25 | 30 |
|
26 | 31 | auto start = std::chrono::steady_clock::now(); |
27 | 32 |
|
28 | 33 | while (rclcpp::ok()) { |
29 | | - auto now = std::chrono::steady_clock::now(); |
30 | | - double t = std::chrono::duration<double>(now - start).count(); |
31 | | - |
32 | | - // 整体绕 z 轴旋转:角速度 1 rad/s |
33 | | - double angle = t * 3; |
34 | | - Eigen::AngleAxisd rot(angle, Eigen::Vector3d::UnitZ()); |
| 34 | + const auto now = std::chrono::steady_clock::now(); |
| 35 | + const auto t = std::chrono::duration<double>(now - start).count(); |
35 | 36 |
|
36 | | - // 四个角点(正方形边长 0.5 m) |
37 | | - double half = 0.25; |
38 | | - std::array<Eigen::Vector3d, 4> corners = { Eigen::Vector3d(half, half, 0.0), |
39 | | - Eigen::Vector3d(-half, half, 0.0), Eigen::Vector3d(-half, -half, 0.0), |
40 | | - Eigen::Vector3d(half, -half, 0.0) }; |
| 37 | + const auto angle_axisd = |
| 38 | + Eigen::AngleAxisd { t * orientation_speed, Eigen::Vector3d::UnitZ() }; |
| 39 | + const auto quaternion = Eigen::Quaterniond { angle_axisd }; |
41 | 40 |
|
42 | | - // 更新四个装甲板 |
43 | | - auto update_armor = [&](const auto& armor, const Eigen::Vector3d& corner) { |
44 | | - Eigen::Vector3d pos = rot * corner; |
45 | | - armor->set_translation(pos); |
46 | | - |
47 | | - // 让装甲板朝向中心 (0,0,z) |
48 | | - Eigen::Vector3d to_center = pos; |
49 | | - to_center.normalize(); |
50 | | - |
51 | | - // 假设装甲板的局部 x 轴是“正前方” |
52 | | - auto orient = Eigen::Quaterniond::FromTwoVectors(Eigen::Vector3d::UnitX(), to_center); |
53 | | - armor->set_orientation(orient); |
| 41 | + solution.input.t = std::sin(translation_speed * t) * Eigen::Vector3d::UnitX(); |
| 42 | + solution.input.q = quaternion; |
| 43 | + solution.solve(); |
54 | 44 |
|
| 45 | + const auto& armors_status = solution.result.armors_status; |
| 46 | + for (auto&& [armor, status] : std::views::zip(armors, armors_status)) { |
| 47 | + armor->set_translation(std::get<0>(status)); |
| 48 | + armor->set_orientation(std::get<1>(status)); |
55 | 49 | armor->update(); |
56 | | - }; |
57 | | - |
58 | | - update_armor(armor_a, corners[0]); |
59 | | - update_armor(armor_b, corners[1]); |
60 | | - update_armor(armor_c, corners[2]); |
61 | | - update_armor(armor_d, corners[3]); |
| 50 | + } |
62 | 51 |
|
63 | | - using namespace std::chrono_literals; |
64 | | - rclcpp::sleep_for(5ms); |
| 52 | + rclcpp::sleep_for(std::chrono::milliseconds { 1'000 / 60 }); |
65 | 53 | } |
66 | 54 |
|
67 | 55 | return 0; |
|
0 commit comments