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

wap手机网站开发asp经验想要网站导航推广页

wap手机网站开发asp经验,想要网站导航推广页,网站开发亿码酷负责,山东做网站建设公司目录 一、静态坐标变换(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.tj-hxxt.cn/news/19306.html

相关文章:

  • 有专门做摄影画册的网站吗免费推广引流平台推荐
  • 广东专业网站建设独立站seo搜索优化
  • 成品网站分享一下太原做网站的工作室
  • 基本的网站建设步骤seo独立站优化
  • 自动生成作文的网站百度seo价格
  • 怎样给网站或者商品做推广seo优化排名软件
  • 抚州做网站的公司山东今日头条新闻
  • 泸州市住房和城乡建设局网站百度如何购买关键词
  • 我和你99谁做的网站网站seo优化外包
  • 公司网站打不开是什么原因网站排名优化多少钱
  • 上海软件开发的公司排名百度推广和优化有什么区别
  • 枣阳网站开发友情链接的网站有哪些
  • 怎么找网站如何做游戏推广
  • 科技类网站设计互联网平台推广
  • cmsapp模板网站百度西安
  • 做网站套餐百度一下电脑版首页
  • 电影院做羞羞的网站廊坊seo外包公司费用
  • 开发公司绩效考核惠州seo网站管理
  • 香港网站域名查询湖南中高风险地区
  • 宁夏省建设厅网站网络推广和seo
  • 服务网站 建设原则巢湖seo推广
  • node.js做网站好累上海关键词优化排名哪家好
  • 济南食品行业网站开发武安百度seo
  • wordpress栏目titleseo免费教程
  • 自己做壁纸的网站2018十大网络营销案例
  • 个人域名可以做企业网站吗山东一级造价师
  • 使用java做新闻网站思路知乎推广合作
  • 我的世界充钱网站怎么做帮人推广的平台
  • 唐山网站定制线上营销有哪些
  • 大气网站源码下载成品网站源码的优化技巧