18.tf坐标系广播与监听的实现

2023-11-09

学习视频:https://www.bilibili.com/video/BV1zt411G7Vn?p=18
广播器代码:获取海龟位置,广播world与海龟坐标系之间的tf数据
监听器代码:监听tf数据,并计算、发布turtle2的速度指令
一、创建功能包

cd ~/catkin_ws/src/
catkin_create_pkg learning_tf roscpp rospy tf turtlesim

二、用C++创建tf广播器和监听者代码
1.tf广播器程序的创建
输入指令,打开turtle_tf_broadcaster.cpp文件

gedit ~/catkin_ws/src/learning_tf/src/turtle_tf_broadcaster.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************/

/**
 * 该例程产生tf数据,并计算、发布turtle2的速度指令
 */

#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>

std::string turtle_name;

void poseCallback(const turtlesim::PoseConstPtr& msg)
{
	// 创建tf的广播器
	static tf::TransformBroadcaster br;

	// 初始化tf数据
	tf::Transform transform;     
	transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );   //设置平移参数
	tf::Quaternion q;
	q.setRPY(0, 0, msg->theta);     //设置旋转参数
	transform.setRotation(q);       //保存至transform内部

	// 广播world与海龟坐标系之间的tf数据
	br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
}

int main(int argc, char** argv)
{
    // 初始化ROS节点
	ros::init(argc, argv, "my_tf_broadcaster");

	// 输入参数作为海龟的名字
	if (argc != 2)
	{
		ROS_ERROR("need turtle name as argument"); 
		return -1;
	}

	turtle_name = argv[1];

	// 订阅海龟的位姿话题
	ros::NodeHandle node;
	ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);

    // 循环等待回调函数
	ros::spin();

	return 0;
};

2.tf监听器程序的创建
输入指令,打开turtle_tf_listener.cpp文件

gedit ~/catkin_ws/src/learning_tf/src/turtle_tf_listener.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************/

/**
 * 该例程监听tf数据,并计算、发布turtle2的速度指令
 */

#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>

int main(int argc, char** argv)
{
	// 初始化ROS节点
	ros::init(argc, argv, "my_tf_listener");

    // 创建节点句柄
	ros::NodeHandle node;

	// 请求产生turtle2
	ros::service::waitForService("/spawn");
	ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");
	turtlesim::Spawn srv;
	add_turtle.call(srv);

	// 创建发布turtle2速度控制指令的发布者
	ros::Publisher turtle_vel = node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel", 10);

	// 创建tf的监听器
	tf::TransformListener listener;

	ros::Rate rate(10.0);  //设置频率
	while (node.ok())
	{
		// 获取turtle1与turtle2坐标系之间的tf数据
		tf::StampedTransform transform;
		try
		{
			listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));  //等待变换   ros::Time(0) 查询当前时间   ros::Duration(3.0)等待时间
			listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);    //执行变化   结果保存至transform变量中
		}
		catch (tf::TransformException &ex) 
		{
			ROS_ERROR("%s",ex.what());
			ros::Duration(1.0).sleep();
			continue;
		}

		// 根据turtle1与turtle2坐标系之间的位置关系,发布turtle2的速度控制指令
		geometry_msgs::Twist vel_msg;
		vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),
				                        transform.getOrigin().x());
		vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) +
				                      pow(transform.getOrigin().y(), 2));
		turtle_vel.publish(vel_msg);

		rate.sleep();
	}
	return 0;
};

3.配置tf广播器与监听器代码编译规则

输入指令,打开CMakeList.txr文件

gedit ~/catkin_ws/src/learning_tf/CMakeLists.txt

加入下面代码如下图所示

add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})

add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})

在这里插入图片描述
4.编译功能包

cd ~/catkin_ws/
catkin_make

三、用Python创建tf广播器和监听者代码
1.创建tf广播器代码
输入指令,打开turtle_tf_broadcaster.py文件。

mkdir ~/catkin_ws/src/learning_tf/scripts
gedit ~/catkin_ws/src/learning_tf/scripts/turtle_tf_broadcaster.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
########################################################################

# 该例程将请求/show_person服务,服务数据类型learning_service::Person

import roslib
roslib.load_manifest('learning_tf')
import rospy

import tf
import turtlesim.msg

def handle_turtle_pose(msg, turtlename):
    br = tf.TransformBroadcaster()
    br.sendTransform((msg.x, msg.y, 0),
                     tf.transformations.quaternion_from_euler(0, 0, msg.theta),
                     rospy.Time.now(),
                     turtlename,
                     "world")

if __name__ == '__main__':
    rospy.init_node('turtle_tf_broadcaster')
    turtlename = rospy.get_param('~turtle')
    rospy.Subscriber('/%s/pose' % turtlename,
                     turtlesim.msg.Pose,
                     handle_turtle_pose,
                     turtlename)
    rospy.spin()

设置turtle_tf_broadcaster.py 文件运行权限

cd ~/catkin_ws/src/learning_tf/scripts
chmod +x turtle_tf_broadcaster.py 

2.创建tf监听者代码
输入指令,打开turtle_tf_listener.py文件。

gedit ~/catkin_ws/src/learning_tf/scripts/turtle_tf_listener.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
########################################################################

# 该例程将请求/show_person服务,服务数据类型learning_service::Person

import roslib
roslib.load_manifest('learning_tf')
import rospy
import math
import tf
import geometry_msgs.msg
import turtlesim.srv

if __name__ == '__main__':
    rospy.init_node('turtle_tf_listener')

    listener = tf.TransformListener()

    rospy.wait_for_service('spawn')
    spawner = rospy.ServiceProxy('spawn', turtlesim.srv.Spawn)
    spawner(4, 2, 0, 'turtle2')

    turtle_vel = rospy.Publisher('turtle2/cmd_vel', geometry_msgs.msg.Twist,queue_size=1)

    rate = rospy.Rate(10.0)
    while not rospy.is_shutdown():
        try:
            (trans,rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time(0))
        except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):
            continue

        angular = 4 * math.atan2(trans[1], trans[0])
        linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2)
        cmd = geometry_msgs.msg.Twist()
        cmd.linear.x = linear
        cmd.angular.z = angular
        turtle_vel.publish(cmd)

        rate.sleep()

设置turtle_tf_listener.py 文件运行权限

cd ~/catkin_ws/src/learning_tf/scripts
chmod +x turtle_tf_listener.py 

四、运行程序
1.运行roscore

roscore

2.打开新的终端,运行小海龟仿真器

rosrun turtlesim turtlesim_node 

3.打开新的终端,运行指令,发布turtle1和world之间关系

rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1

这里的/turtle1的第一个小海龟名
__name:=turtle1_tf_broadcaster:是ros里面重映射的一种机制,程序中的my_tf_broadcaster变为turtle1_tf_broadcaster,避免资源的冲突。
4.打开新的终端,运行指令,发布turtle2和world之间的关系

rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2

5.打开新的终端,运行指令,创建海龟2

rosrun learning_tf turtle_tf_listener

6.打开新的终端,运行指令,通过键盘控制海龟1

rosrun turtlesim turtle_teleop_key

7.运行效果
在这里插入图片描述
用python运行时会有报错
在这里插入图片描述
下一节用launch启动文件会避免此处错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

18.tf坐标系广播与监听的实现 的相关文章

  • 初级软件测试工程师需要具备那些知识与技能

    哈喽 大家好 今天我们来聊聊如何成为一名初级软件测试工程师 需要必备那些知识和技能 什么是软件测试 软件测试的经典定义是 在规定的条件下对程序进行操作 以发现程序错误 衡量软件品质 并对其是否能满足设计要求进行评估的过程 软件测试的现实定义
  • iOS安全之ipa 包重签名的3种方法

    重签名的意义 ipa 重签名最大的用处是 不必重新打包 和配置其它第三方获取 appkey 等操作 直接重签名之后依然可以拥有这些功能 更快的发布测试或者灰度版本 方法一 终端命令 sigh resign 1 明白两个东西 想要重签名的证书
  • Unity笔记--Canvas渲染

    参考 五 UGUI源码分析之Rebuild 布局重建 图形重绘 网格重建 网格重建大体包括布局重建和图形重建两部分 canvas更新过程可分为布局 渲染两部分 共六阶段 public enum CanvasUpdate Prelayout
  • C++类和对象——引用作为函数形参

    问题 1 如果函数的形参为普通函数 那么调用函数时形参对象会被构造 函数调用结束形参对象还需要被销毁 2 为了避免形参对象这种 临时对象 的创建 我们可以将形参设计成引用 着重理解下边的代码 include
  • 牛客网--HJ1 字符串最后一个单词的长度

    文章目录 前言 一 题目内容和牛客网的链接 二 话不多说 引入代码 1 引入库 2 读入数据 总结 前言 题目的分析 一 题目内容和牛客网的链接 牛客网题目链接 二 话不多说 引入代码 1 引入库 代码如下 示例 include
  • Origin常见问题

    1 在绘图时 常常移动一个图 其他的图也跟着缩放 这是由于图层关联导致 取消即可 如下 图中所示 默认是图层2关联到了图层1 所以取消关联就可以了
  • C语言数组指针和指针数组实例演示

    一 数组指针 1 简介 数组指针就是指向数组的指针 定义方式 int p len NULL 示例 include
  • 使用RabbitMQ实现延时队列

    之前公司是一个类电商公司 会有用户下单后未支付取消订单的场景 解决方案是使用RabbitMQ的死信队列来实现一个延时队列 下单时 将订单丢进消息队列 设置过期时间 订单失效时间 然后到时候检查订单状态 如果未支付则取消订单 1 什么是死信
  • 【LeetCode】345. 反转字符串中的元音字母

    题目 给你一个字符串 s 仅反转字符串中的所有元音字母 并返回结果字符串 元音字母包括 a e i o u 且可能以大小写两种形式出现 示例 1 输入 s hello 输出 holle 示例 2 输入 s leetcode 输出 leotc
  • odoo连接器-odoo数据拉取,Java xml-rpc实现

    背景 odoo数据拉取 创建 更新 参考 官方external api文档 External API Odoo 14 0 文档 术语 ORM odoo数据以对象模型呈现 支持one2many many2one many2many等对象关联关
  • FSDataOutputStream 的深入分析

    对于一般文件 都有满足随机读写的api 而hadoop中的读api很简单用FSDataInputStream类就可以满足一般要求 而hadoop中的写操作却是和普通java操作不一样 在这里插入代码片 Hadoop对于写操作提供了一个类 F
  • 刷脸支付服务商重金之下必有勇夫

    为了吸引消费者使用刷脸支付 而非扫码 支付宝和微信会给消费者提供优惠 比如在店里面使用刷脸会有随机立减 打折活动 而扫码则没有 这只是给消费者的补贴 以利益吸引商家与推广人员加入刷脸支付同样重要 显然 与二维码支付的几乎没有成本不同 刷脸支
  • C++全局变量的声明和定义

    参考 http wrchen blog sohu com 71617539 html 1 编译单元 模块 在VC或VS上编写完代码 点击编译按钮准备生成exe文件时 编译器做了两步工作 第一步 将每个 cpp c 和相应的 h文件编译成ob
  • 算法学习:插值型求积公式

    算法学习 插值型求积公式 牛顿 柯斯特 Newton Cotes 求积公式 定义 牛顿 柯斯特 Newton Cotes 求积公式是插值型求积公式的特殊形式 在插值求积公式 baf x dx baP x dx k 0nAkf xk a b
  • Stall Reservations POJ - 3190

    这道题 是学长给我们布置的学习用的题目 重在给我们讲解了什么是优先队列以及其对应的贪心问题 好了 先送上 中文翻译过的题意 手动 滑稽 Oh those picky N 1 lt N lt 50 000 cows They are so p
  • Armbian5.9.0如何安装docker及部署可视化portainer

    安装 docker 通过 ssh 进去 Armbian 系统后 输入下面代码 按提示输入y 等待安装完成即可 apt install docker io 如何查看 docker 是否安装成果 输入命令 docker 可出现docker帮助内

随机推荐

  • MySQL常用命令用法总结

    原文 http www jb51 net article 22110 htm 一 启动与退出 1 进入MySQL 启动MySQL Command Line Client MySQL的DOS界面 直接输入安装时的密码即可 此时的提示符是 my
  • Win 10系统无法连接蓝牙耳机问题

    问题描述 本人刚入手的笔记本电脑 设置里面也有 蓝牙 的开关 由于处于实验室的环境不能开外放 有线耳机显得很不舒服 于是本人兴奋地拿起平时用的蓝牙耳机 想和电脑连起来 但是打开蓝牙开关之后 遇到了下面的情况 打开添加完设备之后 不仅仅是本人
  • springboot2.0学习笔记 自定义JSON序列化程序和反序列化器

    如果使用jackson序列化和反序列化json数据 则可能需要编写 自己JsonSerializer和JsonDeserializer的类 Spring提供了一个替代方案 JsonComponent创建注释 直接注册spring bean容
  • SecureCRT 64位 破解版v8.1.4

    http www xue51 com soft 1510 html xzdz securecrt 破解版是一款支持SSH1和SSH2的终端仿真程序 这个程序能够在windows系统中登陆UNIX或Linux的服务器主机并且还能进行管理设置
  • 全网最细的SpringBoot3系列教程

    1 开发第个Spring Boot应用 创建POM 因为是3 0 0 M1版本 是程碑版本 不是正式发布版 需要从Spring提的Maven仓库中才能下载到3 0 0 M1版本的依赖包 需要在pom xml件中单独指定仓库地址 如果使的是正
  • 安卓真机调试安装失败Session ‘app‘: Installation did not succeed. The application could not be installed: IN:

    Session app Installation did not succeed The application could not be installed INSTALL FAILED TEST ONLY 解决方案 在gradle pr
  • 自定义Looper/Handler模型 线程wait/notify版本 非poll版本

    循环 public static class Looper final static ThreadLocal
  • PS证件照换底色

    原图 1 本教程采用photoshop CS5制作 其它版本基本通用 先在PS中打开原图 如下图所示 2 右键单击背景图层 在弹出的菜单中选择 复制图层 如下图所示 3 接着会弹出 复制图层 对话框 直接按确定即可 如下图所示 4 单击选中
  • pymysql的使用

    pymysql是从Python连接到MySQL数据库服务器的接口 其官方文档为 https pymysql readthedocs io en latest 安装 pip install pymysql 对于数据库的操作 我们一般是这样的操
  • 正在开发应用于Maxthon、TT等多页面浏览器的页面模式

    经过大量的用户调查 我们发现 有不少朋友使用了Maxthon 腾讯TT 世界之窗等基于IE的多页面浏览器使用WEBCHAT 而这种模式下弹出窗口将变成一个新页面 用起来不方便
  • 如何查看支付宝旗下的天弘基金一共有多少只?分别是什么?

    如何查看支付宝旗下的天弘基金一共有多少只 分别是什么 2020年 股市风格突变 相对股市个股的跌宕起伏 基金的收益可谓一枝独秀 下面我们将对基金进行研究 看看我们可以获取数据能否到什么程度 利用tushare的数据接口就可以获取基金的名称
  • 排序类算法

    文章目录 利用vector进行排序 数字类元素 字符串类元素 利用其他STL容器排序 map set priority queue 利用vector进行排序 数字类元素 每个元素一般包含多个条件 利用lambda编写特定排序条件 用sort
  • 转:Ogre TerrainGroup地形赏析

    转 Ogre TerrainGroup地形赏析 1 1 参考 http www ogre3d org tikiwiki tiki index php page Ogre Terrain System http www ogre3d org
  • VS2017找不到QT头文件

    一 我的电脑右键属性 高级系统设置 环境变量 增加环境变量Qt INCLUDEPATH 值为QT的头文件目录 二 重启VS 发现波纹线不见了 证明设置环境变量后VS能识别到QT头文件了 原理是 vs导入qt项目附加包含目录继承值有Qt IN
  • (202301)pytorch图像分类全流程实战Task6:可解释性分析、显著性分析

    Task6 可解释性分析 显著性分析 对B站up同济子豪兄的图像分类系列的学习 大佬的完整代码在GitHub开源 2022年人工智能依旧飞速发展 从传统机器学习模型到如今以 炼丹 为主的深度神经网络 代表着模型拟合度与模型可解释性各自的发展
  • MySQL学习(十六):数据类型之日期与时间类型

    数据类型之日期与时间类型 日期与时间是重要的信息 在我们的系统中 几乎所有的数据表都用得到 原因是客户需要知道数据的时间标签 从而进行数据查询 统计和处理 类型 名称 字节 日期格式 最小值 最大值 YEAR 年 1 YYYY或YY 190
  • Linux系统管理(六)高级存储管理

    目录 一 逻辑卷 二 lvm逻辑管理器 lvm建立 lvm拉伸 lvm缩减 lvm删除 lvm快照 三 vdo虚拟数据优化器 vdo建立 使用vdo设备 测试vdo性能 设置vdo开机自启动 vdo设备的删除 一 逻辑卷 pv 物理卷 被处
  • DRM——学习篇0:概念认识

    刚开始学习 记忆不是很好 容易忘 边学边记 阅读的速度会比较慢 看的会比较仔细 这边主要参考以下博客 前辈们水平很高 写的很详细 详细的知识学习可查看以下链接 详细请看 蜗窝科技 http www wowotech net graphic
  • wpf 怎么用代码连接sql server

    在WPF中 可以使用C 代码来连接SQL Server 以下是连接SQL Server的一般步骤 首先 在项目中添加对System Data SqlClient命名空间的引用 在代码中创建SqlConnection对象 该对象表示与SQL
  • 18.tf坐标系广播与监听的实现

    学习视频 https www bilibili com video BV1zt411G7Vn p 18 广播器代码 获取海龟位置 广播world与海龟坐标系之间的tf数据 监听器代码 监听tf数据 并计算 发布turtle2的速度指令 一