当前位置: 首页 > news >正文

无锡市建设安全监督网站北京科技公司名称

无锡市建设安全监督网站,北京科技公司名称,建设厅网站密码忘了怎么办,合肥网络推广技巧目录 一、静态坐标变换(C实现)二、静态坐标变换(Python实现) 如前文所属,ROS通过广播的形式告知各模块的位姿关系,接下来详述这一机制的代码实现。 模块间的位置关系有两种类型,一种是相对固定…

目录

  • 一、静态坐标变换(C++实现)
  • 二、静态坐标变换(Python实现)

如前文所属,ROS通过广播的形式告知各模块的位姿关系,接下来详述这一机制的代码实现。

模块间的位置关系有两种类型,一种是相对固定的,称为静态坐标变换,一种是相对不固定,变化的,称为动态坐标变换。

一、静态坐标变换(C++实现)

所谓静态坐标变换,是指两个坐标系之间的相对位置是固定的。比如机器人底盘上安装了一个激光雷达,他和底盘组成一个刚体,它们的相对位姿不会随机器人的运动而变化,他们之间的坐标变换即属于静态坐标变换。

假设激光雷达相对与底盘的欧拉位姿为(0.5, 0.0, 0.3; 0.0, 0.0, 0.0)

雷达检测到的障碍物位置为(2.0, 2.5, 0.3)

若要计算障碍物和底盘的相对位置,就可以通过雷达到底盘的坐标变换来计算,步骤如下:

  1. 雷达(laser)发布自己和底盘(base_link)的相对静态坐标
  2. 避障模块监听雷达(laser)和底盘(base_link)的相对坐标关系,并通过tf 计算障碍物位置。

首先创建 tf2_learning 包,命令如下:(这一步不是必须,这里只是为了方便清晰的说明,也可以使用已有的包,在包里新增节点等方法)

catkin_creat_pkg tf2_learning roscpp rospy geometry_msgs std_msgs tf2 tf2_geometry_msgs tf2_ros

创建后,文件结构如下:

在这里插入图片描述

在创建的 tf2_learning 包路径下有一个 src 目录,在这里存储C++源码,我们创建 static_frame_broadcast.cppstatic_frame_listen.cpp ,修改 CMakeLists.txt ,添加如下内容:

add_executable(${PROJECT_NAME}_broadcast src/static_frame_broadcast.cpp)
add_executable(${PROJECT_NAME}_listen src/static_frame_listen.cpp)target_link_libraries(${PROJECT_NAME}_broadcast${catkin_LIBRARIES}
)target_link_libraries(${PROJECT_NAME}_listen${catkin_LIBRARIES}
)

static_frame_broadcast.cpp 实现广播子坐标系相对于父坐标系的静态坐标,内容如下:

#include "ros/ros.h"
#include "tf2_ros/static_transform_broadcaster.h"
#include "geometry_msgs/TransformStamped.h"
#include "tf2/LinearMath/Quaternion.h"int main(int argc, char **argv)
{// 初始化 ROS 节点ros::init(argc, argv, "static_frame_broadcast");// 创建静态坐标转换广播器tf2_ros::StaticTransformBroadcaster broadcaster;// 创建坐标系信息geometry_msgs::TransformStamped ts;// --设置头信息ts.header.seq = 100;ts.header.stamp = ros::Time::now();ts.header.frame_id = "base_link";// --设置子级坐标系ts.child_frame_id = "laser";// --设置子坐标系相对于父坐标系的平移偏移量ts.transform.translation.x = 0.5;ts.transform.translation.y = 0.0;ts.transform.translation.z = 0.3;// --设置子坐标系相对于父坐标系的旋转偏移量// --将欧拉角转换成四元数tf2::Quaternion qtn; // tf2的四元数类qtn.setRPY(0, 0, 0); // 设置欧拉角// 获取旋转的四元数值ts.transform.rotation.x = qtn.getX();ts.transform.rotation.y = qtn.getY();ts.transform.rotation.z = qtn.getZ();ts.transform.rotation.w = qtn.getW();// 广播器发布坐标系信息broadcaster.sendTransform(ts);ros::spin();return 0;
}

static_frame_listen.cpp 实现订阅静态坐标转换关系,并利用该关系将雷达坐标系的点转换到 base_link 坐标系,内容如下:

#include "ros/ros.h"
#include "tf2_ros/transform_listener.h"
#include "tf2_ros/buffer.h"
#include "geometry_msgs/PointStamped.h"
#include "tf2_geometry_msgs/tf2_geometry_msgs.h"int main(int argc, char *argv[])
{// 初始化 ROS 节点ros::init(argc, argv, "static_frame_listen");ros::NodeHandle nh;// 创建 TF 订阅节点tf2_ros::Buffer buffer;tf2_ros::TransformListener listener(buffer);ros::Rate rate(1);while (ros::ok()){// 生成一个坐标点, 模拟雷达检测到的障碍物坐标点(雷达坐标系下的坐标)geometry_msgs::PointStamped point_laser;point_laser.header.frame_id = "laser";point_laser.header.stamp = ros::Time::now();point_laser.point.x = 2.0;point_laser.point.y = 2.5;point_laser.point.z = 0.3;// 转换坐标点, 计算障碍物坐标点在 base_link 下的坐标try{geometry_msgs::PointStamped point_base;point_base = buffer.transform(point_laser, "base_link");ROS_INFO("point_base: (%.2f, %.2f, %.2f), frame: %s",point_base.point.x, point_base.point.y, point_base.point.z,point_base.header.frame_id.c_str());}catch (const std::exception &e){ROS_ERROR("%s", e.what());}rate.sleep();ros::spinOnce();}return 0;
}

编译后,执行 rosrun tf2_learning tf2_learning_broadcast 开始广播坐标,此时打开rviz订阅TF看到TF树模型,操作与结果如下:

  • 输入命令:rviz
  • 在启动的 rviz 中设置 Fixed Framebase_link
  • 点击左下的 Add 按钮,在弹出的窗口中选择 TF 组件,即可显示坐标关系。

在这里插入图片描述

继续执行命令rosrun tf2_learning tf2_learning_listen可以看到转换后的坐标,以及所属父坐标系,如下:

在这里插入图片描述

其中,ERROR是由于节点刚起来时,TF数据还未来得及写入缓存,导致base_link不存在,可以发现第二次调用就没有报错了,实际使用中,可以等待要操作的frame存在再做转换,如下:

tf2_ros::Buffer buffer;
tf2_ros::TransformListener listener(buffer);
// _frameExists()返回指定frame是否存在于tf树中
if (!buffer._frameExists("base_link"))
{ROS_WARN("base_link frame does not exist.");
}

二、静态坐标变换(Python实现)

在创建的 tf2_learning 包路径下 src 目录的同级,创建一个 scripts 目录,在这里存储脚本(如python脚本),我们创建 tf2_learning_broadcast.py 以实现坐标广播,编辑内容如下:

#! /usr/bin/env pythonimport rospy
import tf
import tf2_ros
from geometry_msgs.msg import TransformStampedif __name__ == "__main__":# 初始化 ROS 节点rospy.init_node("static_frame_broadcast_py")# 创建静态坐标广播器broadcaster = tf2_ros.StaticTransformBroadcaster()# 创建并组织被广播的消息tfs = TransformStamped()# -- 头信息tfs.header.frame_id = "base_link" # 父坐标系tfs.header.stamp = rospy.Time.now()tfs.header.seq = 101# -- 子坐标系tfs.child_frame_id = "laser"# -- 坐标系相对信息# ---- 相对于父坐标系的平移偏移量tfs.transform.translation.x = 0.5tfs.transform.translation.y = 0.0tfs.transform.translation.z = 0.3# ---- 相对于父坐标系的旋转偏移量# ---- 设置欧拉角,并将欧拉角转换成四元数qtn = tf.transformations.quaternion_from_euler(0, 0, 0)tfs.transform.rotation.x = qtn[0]tfs.transform.rotation.y = qtn[1]tfs.transform.rotation.z = qtn[2]tfs.transform.rotation.w = qtn[3]# 广播器发送消息broadcaster.sendTransform(tfs)# spinrospy.spin()

创建 tf2_learning_listen.py 以订阅静态坐标转换关系,并利用该关系将雷达坐标系的点转换到 base_link 坐标系,编辑内容如下:

#! /usr/bin/env pythonimport rospy
import tf2_ros
# 不要使用 geometry_msgs,需要使用 tf2 内置的消息类型
from tf2_geometry_msgs import PointStamped
# from geometry_msgs.msg import PointStampedif __name__ == "__main__":# 初始化 ROS 节点rospy.init_node("static_frame_listen")# 创建 TF 订阅对象buffer = tf2_ros.Buffer()listener = tf2_ros.TransformListener(buffer)rate = rospy.Rate(1)while not rospy.is_shutdown():# 生成一个坐标点, 模拟雷达检测到的障碍物坐标点(雷达坐标系下的坐标)point_laser = PointStamped()point_laser.header.frame_id = "laser"point_laser.header.stamp = rospy.Time.now()point_laser.point.x = 2.0point_laser.point.y = 2.5point_laser.point.z = 0.3try:# 转换坐标点, 计算障碍物坐标点在 base_link 下的坐标point_base = buffer.transform(point_laser, "base_link")rospy.loginfo("point_base: (%.2f, %.2f, %.2f), frame: %s",point_base.point.x,point_base.point.y,point_base.point.z,point_base.header.frame_id)except Exception as e:rospy.logerr("%s", e)# spinrate.sleep()
http://www.yayakq.cn/news/86014/

相关文章:

  • 中卫市建设网站购买虚拟机建网站
  • 网站建设费税率是多少钱手机qq空间登录网页入口
  • 专门做985招聘信息的网站入侵网站后台管理系统
  • 济南高端网站设计黄冈app下载推广价格
  • 成都中职学校网站建设推广做婚恋网站的翻译好吗
  • 广西贵港网站建设外贸公司怎么做
  • 上海省住房与城乡建设厅网站嘉定网站建设哪里好
  • 中国造价信息网官网seo网站推广的目的包括哪个方面
  • 刷数据网站怎么推广网站备案前置审批 成都
  • 全国哪个县网站做的最好网站开发总体设计
  • 自贡百度做网站多少钱iphone私人网址
  • 专业建设网站公司哪家好360搜索引擎优化
  • seo网站优化推广费用wordpress显示指定分类目录
  • 网站什么时候恢复彩色cn域名做犯法网站
  • 广州百度网站搭建做平面素材比较好的网站
  • 网站目录结构图企业宣传视频拍摄制作
  • 大连做网站优化哪家好wordpress怎么上传产品
  • 手机网站图片轮播代理怎么做
  • 网站定制开发注意事项创业项目网
  • asp模版网站如何做优化手机网站 域名解析
  • 即墨城乡建设局网站聊城网站建设哪家专业
  • 公司网站制作苏州强化网站建设和管理
  • 四平网站设计公司wordpress移动导航菜单
  • 源代码代做网站网站seo培训
  • 帝国cms做视频网站性能如何改版网站会影响百度
  • 游戏网站做关键字国内最新新闻内容
  • 湖南做网站 地址磐石网络网页建设软件
  • 东莞好的网站建设公司太原制作网站的工作室
  • 网站不备案怎么办杭州网络营销
  • 网站推广策划书范文如何做好互联网营销推广