TF2 Traveling in time (C++)

目标:了解 tf2 的高级时间旅行功能。

教程级别:中间

时间:10分钟

背景

在上一教程中,我们讨论了 tf2 和时间的基础知识。本教程将把我们更进一步,并揭示一个强大的tf2技巧:时间旅行。简而言之,tf2库的一个关键特征是它能够在时间和空间中转换数据。

这个tf2时间旅行功能可用于各种任务,例如长时间监视机器人的姿势或构建将遵循领导者“步骤”的跟随机器人。我们将使用该时间旅行功能查找时光倒流,并程序跟踪5秒。turtle2carrot1

时间旅行

首先,让我们回到上一教程“使用时间”中结束的位置。转到您的包裹。learning_tf2_cpp

现在,我们不是让第二只去机器人现在的位置,而是让第二只去5秒前第一只机器人的地方。将文件中的调用编辑为lookupTransform()turtle_tf2_listener.cpp

rclcpp::Time when = this->get_clock()->now() - rclcpp::Duration(5, 0);
transformStamped = tf_buffer_->lookupTransform(
    toFrameRel,
    fromFrameRel,
    when,
    50ms);

现在,如果你运行这个,在前5秒,第二只将不知道去哪里,因为我们还没有机器人姿势的5秒历史。但是在这5秒钟之后会发生什么呢?让我们试一试:

ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo.launch.py

您现在应该注意到您的正在不受控制地行驶,就像此屏幕截图中一样。让我们试着理解这种行为背后的原因。

  1. 在我们的代码中,我们向tf2提出了以下问题:“相对于5秒前,5秒前的姿势是什么?这意味着我们正在根据5秒前的位置以及5秒前第一只机器人的位置来控制第二只。carrot1turtle2

  2. 但是,我们真正想问的是:“相对于当前位置,5秒前的姿势是什么?carrot1turtle2

用于查找转换() 的高级 API

为了向 tf2 提出该特定问题,我们将使用一个高级 API,该 API 使我们能够明确地说出何时获取指定的转换。这是通过使用其他参数调用该方法来完成的。您的代码现在将如下所示:lookupTransform()

rclcpp::Time now = this->get_clock()->now();
rclcpp::Time when = now - rclcpp::Duration(5, 0);
transformStamped = tf_buffer_->lookupTransform(
    toFrameRel,
    now,
    fromFrameRel,
    when,
    "world",
    50ms);

的高级 API 采用六个参数:lookupTransform()

  1. 目标帧第二个机器人

  2. 第二个机器人当前时间

  3. 源帧第一个机器人

  4. 评估源帧的时间第一个机器人5秒前的时间

  5. 不随时间变化的帧,在本例中为帧world

  6. 等待目标帧变为可用所需的时间

总而言之,tf2 在后台执行以下操作。过去,它计算从 到 的转换。在帧中,tf2 时间从过去到现在。在当前时间,tf2 计算从 到 的转换。carrot1worldworldworldturtle2

检查结果

让我们再次运行模拟,这次使用高级时间旅行 API:

ros2 launch learning_tf2_cpp turtle_tf2_fixed_frame_demo.launch.py

是的,第二只被引导到5秒前第一只机器人的地方!

总结

在本教程中,您已经看到了 tf2 的高级功能之一。您了解到 tf2 可以及时转换数据,并通过 turtlesim 示例学习了如何执行此操作。tf2允许您使用高级API回到过去,并在海龟的旧姿势和当前姿势之间进行帧转换。lookupTransform()

参考:

Traveling in time (C++) — ROS 2 Documentation: Rolling documentation

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TSP(Traveling Salesman Problem,旅行商问题)是一个经典的组合优化问题,目标是找到一条最短路径,使得旅行商能够访问所有城市并回到起始城市。贪心算法是一种常用的解决TSP问题的方法之一。 贪心算法的基本思想是每一步都选择当前最优的解决方案,而不考虑全局最优解。在TSP问题中,贪心算法可以按照以下步骤进行: 1. 选择一个起始城市作为当前城市。 2. 从当前城市出发,选择与当前城市距离最近且未访问过的城市作为下一个城市。 3. 将下一个城市添加到路径中,并将其标记为已访问。 4. 将下一个城市设为当前城市,重复步骤2和3,直到所有城市都被访问过。 5. 将最后一个城市与起始城市相连,形成闭合路径。 以下是TSP问题贪心算法的C++代码示例: ```cpp #include <iostream> #include <vector> #include <cmath> using namespace std; // 计算两个城市之间的距离 double distance(int x1, int y1, int x2, int y2) { return sqrt(pow(x2 - y1, 2)); } // TSP贪心算法 vector<int> tspGreedy(vector<vector<double>>& graph, int start) { int n = graph.size(); vector<int> path; vector<bool> visited(n, false); path.push_back(start); visited[start] = true; while (path.size() < n) { int current = path.back(); int next = -1; double minDist = numeric_limits<double>::max(); for (int i = 0; i < n; i++) { if (!visited[i] && graph[current][i] < minDist) { minDist = graph[current][i]; next = i; } } path.push_back(next); visited[next] = true; } path.push_back(start); return path; } int main() { // 城市坐标 vector<pair<int, int>> cities = {{0, 0}, {1, 2}, {3, 1}, {2, 3}}; // 构建城市之间的距离矩阵 int n = cities.size(); vector<vector<double>> graph(n, vector<double>(n, 0.0)); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { graph[i][j] = distance(cities[i].first, cities[i].second, cities[j].first, cities[j].second); } } // 调用贪心算法求解TSP问题 vector<int> path = tspGreedy(graph, 0); // 输出最短路径 cout << "最短路径:"; for (int i = 0; i < path.size(); i++) { cout << path[i] << " "; } cout << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值