徐州专业网站seo/短视频营销成功案例

徐州专业网站seo,短视频营销成功案例,企业网站建设有哪些优势,api网站制作前言 本篇文章属于ROS2humble的学习笔记,来源于B站鱼香ROSup主。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 《ROS 2机器人开发从入门到实践》课程介绍_哔哩哔哩_bilibili …

前言

本篇文章属于ROS2humble的学习笔记,来源于B站鱼香ROSup主。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。

《ROS 2机器人开发从入门到实践》课程介绍_哔哩哔哩_bilibili

一、坐标变换工具TF

1. Python中的手眼变换坐标变换

(1)静态TF

import rclpy
from rclpy.node import Node
from tf2_ros import StaticTransformBroadcaster # 静态坐标发布器
from geometry_msgs.msg import TransformStamped # 消息接口
from tf_transformations import quaternion_from_euler # 欧拉角转四元数
import math # 角度转弧度函数class StaticTFBroadcaster(Node):def __init__(self):super().__init__('static_tf_broadcaster')self.static_broadcaster_ = StaticTransformBroadcaster(self)self.publish_static_tf()def publish_static_tf(self):"""发布静态TF 从 base_link 到 camera_link 之间的坐标关系"""transform = TransformStamped()transform.header.frame_id = 'base_link'transform.child_frame_id = 'camera_link'transform.header.stamp = self.get_clock().now().to_msg()transform.transform.translation.x = 0.5transform.transform.translation.y = 0.3transform.transform.translation.z = 0.6q = quaternion_from_euler(math.radians(180),0,0)transform.transform.rotation.x = q[0]transform.transform.rotation.y = q[1]transform.transform.rotation.z = q[2]transform.transform.rotation.w = q[3]self.static_broadcaster_.sendTransform(transform)self.get_logger().info(f'发布静态TF:{transform}')def main():rclpy.init()node = StaticTFBroadcaster()rclpy.spin(node)rclpy.shutdown()

(2)动态TF

import rclpy
from rclpy.node import Node
from tf2_ros import TransformBroadcaster # 坐标发布器
from geometry_msgs.msg import TransformStamped # 消息接口
from tf_transformations import quaternion_from_euler # 欧拉角转四元数
import math # 角度转弧度函数class TFBroadcaster(Node):def __init__(self):super().__init__('tf_broadcaster')self.broadcaster_ = TransformBroadcaster(self)self.timer_ = self.create_timer(0.01,self.publish_tf)def publish_tf(self):"""发布动态TF 从 camera_link 到 bottle_link 之间的坐标关系""" transform = TransformStamped()transform.header.frame_id = 'camera_link'transform.child_frame_id = 'bottle_link'transform.header.stamp = self.get_clock().now().to_msg()transform.transform.translation.x = 0.2transform.transform.translation.y = 0.3transform.transform.translation.z = 0.5q = quaternion_from_euler(0,0,0)transform.transform.rotation.x = q[0]transform.transform.rotation.y = q[1]transform.transform.rotation.z = q[2]transform.transform.rotation.w = q[3]self.broadcaster_.sendTransform(transform)self.get_logger().info(f'发布静态TF:{transform}')def main():rclpy.init()node = TFBroadcaster()rclpy.spin(node)rclpy.shutdown()

(3)查询TF关系

import rclpy
from rclpy.node import Node
from tf2_ros import TransformListener,Buffer # 坐标监听器
from tf_transformations import euler_from_quaternion # 四元数转欧拉角
import math # 角度转弧度函数
import rclpy.timeclass TFListener(Node):def __init__(self):super().__init__('tf_listener')self.buffer_ = Buffer()self.listener_ = TransformListener(self.buffer_,self)self.timer_ = self.create_timer(1.0,self.get_transform)def get_transform(self):"""实时查询坐标关系""" try:result =  self.buffer_.lookup_transform('base_link','bottle_link',rclpy.time.Time(seconds=0.0),rclpy.time.Duration(seconds=1.0))transform = result.transformself.get_logger().info(f'平移:{transform.translation}')self.get_logger().info(f'旋转:{transform.rotation}')rotation_euler = euler_from_quaternion([transform.rotation.x,transform.rotation.y,transform.rotation.z,transform.rotation.w,])self.get_logger().info(f'旋转RPY:{rotation_euler}')except Exception as e:self.get_logger().warn(f'获取坐标变换失败,原因:{str(e)}')def main():rclpy.init()node = TFListener()rclpy.spin(node)rclpy.shutdown()

2. C++中的地图坐标变换

(1)静态TF

#include "rclcpp/rclcpp.hpp"
#include "geometry_msgs/msg/transform_stamped.hpp"
#include "tf2/LinearMath/Quaternion.h"
#include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"
#include "tf2_ros/static_transform_broadcaster.h"class StaticTFBroadcaster:public rclcpp::Node
{
private:std::shared_ptr<tf2_ros::StaticTransformBroadcaster> broadcaster_;
public:StaticTFBroadcaster() : Node("static_tf_broadcaster"){broadcaster_ = std::make_shared<tf2_ros::StaticTransformBroadcaster>(this);this->publish_tf();}void publish_tf(){geometry_msgs::msg::TransformStamped transform;transform.header.stamp = this->get_clock()->now();transform.header.frame_id = "map";transform.child_frame_id = "target_point";transform.transform.translation.x = 5.0;transform.transform.translation.y = 3.0;transform.transform.translation.z = 0.0;tf2::Quaternion q;q.setRPY(0.0,0.0,60*M_PI/180.0);transform.transform.rotation = tf2::toMsg(q);this->broadcaster_->sendTransform(transform);}
};int main(int argc,char* argv[])
{rclcpp::init(argc,argv);auto node = std::make_shared<StaticTFBroadcaster>();rclcpp::spin(node);rclcpp::shutdown();
}

(2)动态TF

#include "rclcpp/rclcpp.hpp"
#include "geometry_msgs/msg/transform_stamped.hpp"
#include "tf2/LinearMath/Quaternion.h"
#include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"
#include "tf2_ros/transform_broadcaster.h"
#include "chrono"
using namespace std::chrono_literals;class TFBroadcaster:public rclcpp::Node
{
private:std::shared_ptr<tf2_ros::TransformBroadcaster> broadcaster_;rclcpp::TimerBase::SharedPtr timer_;public:TFBroadcaster() : Node("tf_broadcaster"){broadcaster_ = std::make_shared<tf2_ros::TransformBroadcaster>(this);// this->publish_tf();timer_ = this->create_wall_timer(100ms,std::bind(&TFBroadcaster::publish_tf,this));}void publish_tf(){geometry_msgs::msg::TransformStamped transform;transform.header.stamp = this->get_clock()->now();transform.header.frame_id = "map";transform.child_frame_id = "base_link";transform.transform.translation.x = 2.0;transform.transform.translation.y = 3.0;transform.transform.translation.z = 0.0;tf2::Quaternion q;q.setRPY(0.0,0.0,30*M_PI/180.0);transform.transform.rotation = tf2::toMsg(q);this->broadcaster_->sendTransform(transform);}
};int main(int argc,char* argv[])
{rclcpp::init(argc,argv);auto node = std::make_shared<TFBroadcaster>();rclcpp::spin(node);rclcpp::shutdown();
}

(3)查询TF关系

#include "rclcpp/rclcpp.hpp"
#include "geometry_msgs/msg/transform_stamped.hpp"
#include "tf2/LinearMath/Quaternion.h"
#include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"
#include "tf2_ros/transform_listener.h"
#include "tf2_ros/buffer.h"
#include "tf2/utils.h"
#include "chrono"
using namespace std::chrono_literals;class TFListener:public rclcpp::Node
{
private:std::shared_ptr<tf2_ros::TransformListener> listener_;std::shared_ptr<tf2_ros::Buffer> buffer_;rclcpp::TimerBase::SharedPtr timer_;public:TFListener() : Node("tf_listener"){this->buffer_ = std::make_shared<tf2_ros::Buffer>(this->get_clock());this->listener_ = std::make_shared<tf2_ros::TransformListener>(*buffer_,this);// this->publish_tf();timer_ = this->create_wall_timer(1s,std::bind(&TFListener::get_tf,this));}void get_tf(){// 到Buffer查询坐标关系try{const auto transform = buffer_->lookupTransform("base_link","target_point",this->get_clock()->now(),rclcpp::Duration::from_seconds(1.0f));auto translation = transform.transform.translation;auto rotation = transform.transform.rotation;double y,p,r;tf2::getEulerYPR(rotation,y,p,r);RCLCPP_INFO(get_logger(),"平移:%f,%f,%f",translation.x,translation.y,translation.z);RCLCPP_INFO(get_logger(),"旋转:%f,%f,%f",y,p,r);}catch(const std::exception& e){RCLCPP_WARN(get_logger(),"%s",e.what());}}// void publish_tf()// {//     geometry_msgs::msg::TransformStamped transform;//     transform.header.stamp = this->get_clock()->now();//     transform.header.frame_id = "map";//     transform.child_frame_id = "base_link";//     transform.transform.translation.x = 2.0;//     transform.transform.translation.y = 3.0;//     transform.transform.translation.z = 0.0;//     tf2::Quaternion q;//     q.setRPY(0.0,0.0,30*M_PI/180.0);//     transform.transform.rotation = tf2::toMsg(q);//     this->broadcaster_->sendTransform(transform);// }
};int main(int argc,char* argv[])
{rclcpp::init(argc,argv);auto node = std::make_shared<TFListener>();rclcpp::spin(node);rclcpp::shutdown();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/72980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用android studio模拟器,模拟安卓手机访问网页,使用Chrome 开发者工具查看控制台信息

web 网页项目在安卓手机打开时出现问题&#xff0c;想要查看控制台调试信息。记录一下使用android studio 模拟器访问的方式。 步骤如下&#xff1a; 1.安装android studio&#xff0c;新增虚拟设备&#xff08;VDM- virtual device manager) 点击Virtual Device Manager后会…

spring-boot-starter和spring-boot-starter-web的关联

maven的作用是方便jar包的管理&#xff0c;所以每一个依赖都是对应着相应的一个或者一些jar包&#xff0c;从网上看到很多对spring-boot-starter的描述就是“这是Spring Boot的核心启动器&#xff0c;包含了自动配置、日志和YAML。”没看太明白&#xff0c;所参与的项目上也一直…

数智读书笔记系列015 探索思维黑箱:《心智社会:从细胞到人工智能,人类思维的优雅解读》读书笔记

引言 《The Society of Mind》&#xff08;《心智社会》&#xff09;的作者马文・明斯基&#xff08;Marvin Minsky&#xff09;&#xff0c;是人工智能领域的先驱和奠基者之一 &#xff0c;1969 年获得图灵奖&#xff0c;被广泛认为是对人工智能领域影响最大的科学家之一。他…

【网络编程】WSAAsyncSelect 模型

十、基于I/O模型的网络开发 接着上次的博客继续分享&#xff1a;select模型 10.8 异步选择模型WSAAsyncSelect 10.8.1 基本概念 WSAAsyncSelect模型是Windows socket的一个异步I/O 模型&#xff0c;利用这个模型&#xff0c;应用程序 可在一个套接字上接收以Windows 消息为基…

计算机网络:计算机网络的组成和功能

计算机网络的组成&#xff1a; 计算机网络的工作方式&#xff1a; 计算机网络的逻辑功能; 总结&#xff1a; 计算机网络的功能&#xff1a; 1.数据通信 2.资源共享 3.分布式处理:计算机网络的分布式处理是指将计算任务分散到网络中的多个节点&#xff08;计算机或设备&…

字符串习题

单词个数统计 原作&#xff1a; 输入&#xff1a; 一行字符串。仅有空格和英文字母构成。 输出&#xff1a; 英文字母个数letter_num 单词个数word_num 出现最多的字母max_letter 出现最多的字母的出现次数max_letter_frequ 处理&#xff1a; 统计并输出此句子英文字母…

解决火绒启动时,报安全服务异常,无法保障计算机安全

1.找到控制面板-安全和维护-更改用户账户控制设置 重启启动电脑解决。

python总结(1)

数据结构是以某种方式(如通过编号)组合起来的数据元素(如数、字符乃至其他数据结构)集合。在Python中&#xff0c;最基本的数据结构为序列(sequence)。序列中的每个元素都有编号&#xff0c;即其位置或索引&#xff0c;其中第一个元素的索引为0&#xff0c;第二个元素的索引为1…

NAT NAPT

NAT NAT&#xff08;Network Address Translation&#xff0c;网络地址转换&#xff09; 主要用于在不同网络&#xff08;如私有网络和公共互联网&#xff09;之间进行 IP 地址转换&#xff0c;解决IP 地址短缺问题&#xff0c;并提供一定的安全性。 IPv4 地址是 32 位&#xf…

快速排序(二叉树的前序递归遍历思想)

思路 之前我们从选择排序&#xff0c;到选择排序的稳定性优化&#xff0c;到冒泡排序&#xff0c;到插入排序&#xff0c;到插入排序的提前截止时间&#xff0c;到希尔排序&#xff0c;虽然逐步一直都在优化&#xff0c;但是时间复杂度还是N得平方&#xff0c;力扣提交的结果一…

Redis 面试篇

Redis相关面试题 缓存三剑客 面试官&#xff1a;什么是缓存穿透 ? 怎么解决 ? 缓存穿透是指查询一个一定不存在的数据&#xff0c;如果从存储层查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到 DB 去查询&#xff0c;可能导致 DB 挂掉。这种情况…

群晖DS223 Docker搭建为知笔记

群晖DS223 Docker搭建为知笔记&#xff0c;打造你的专属知识宝库 一、引言 在数字化信息爆炸的时代&#xff0c;笔记软件成为了我们管理知识、记录灵感的得力助手。为知笔记&#xff0c;作为一款专注于工作笔记和团队协作的云笔记产品&#xff0c;以其丰富的功能和便捷的使用体…

Linux网络之数据链路层协议

目录 数据链路层 MAC地址与IP地址 数据帧 ARP协议 NAT技术 代理服务器 正向代理 反向代理 上期我们学习了网络层中的相关协议&#xff0c;为IP协议。IP协议通过报头中的目的IP地址告知了数据最终要传送的目的主机的IP地址&#xff0c;从而指引了数据在网络中的一步…

分类评价指标

基础概念解释 TP、TN、FP、FN 这里T是True&#xff0c;F是False&#xff0c;P为Positive&#xff0c;N为Negative TP&#xff1a;被模型正确地预测为正样本&#xff08;原本为正样本&#xff0c;预测为正样本&#xff09; TN&#xff1a;被模型正确地预测为负样本&#xff0…

江科大51单片机笔记【11】AT24C02(I2C总线)

一、存储器 1.介绍 RAM的特点是存储速度特别快&#xff0c;但是掉电会丢失&#xff1b;ROM的特点是存储速度特别慢&#xff0c;但是掉电不会丢失 SRAM是所有存储器最快的&#xff0c;一般用于电脑的CPU高速缓存&#xff0c;容量相对较少&#xff0c;成本较高&#xff1b;DRAM…

【C++指南】一文总结C++类和对象【中】

&#x1f31f; 各位看官好&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; &#x1f680; 今天来学习C类和对象的语法知识。注意&#xff1a;在本章节中&#xff0c;小编会以Date类举例 &#x1f44d; 如果觉得…

文本转语音-音画适时推送rtsp并播放

文本语音 rtsp适时播放叫号系统的底层逻辑 发布Linux, unix socket 和window win32做为音频源的 python10下的(ffmpeg version 7.1) 可运行版本. 这两天在弄这个&#xff0c;前2篇是通过虚拟声卡&#xff0c;达到了最简单的一个逻辑&#xff0c;播放文本就从声卡发声&#xff0…

从0开始的操作系统手搓教程33:挂载我们的文件系统

目录 代码实现 添加到初始化上 上电看现象 挂载分区可能是一些朋友不理解的——实际上挂载就是将我们的文件系统封装好了的设备&#xff08;硬盘啊&#xff0c;SD卡啊&#xff0c;U盘啊等等&#xff09;&#xff0c;挂到我们的默认分区路径下。这样我们就能访问到了&#xff…

【图片批量转换合并PDF】多个文件夹的图片以文件夹为单位批量合并成一个PDF,基于wpf的实现方案

项目背景: 多个图片分布在不同文件夹,如何以文件夹为单位批量合并成一个PDF,还要保证文件夹里面图片大小和顺序 实现功能: 1、单张图片的转换PDF:一张图临时转一下 2、多张图片转换成PDF:多张图单独转成PDF 3、多级目录多张图转换成PDF:多级目录多张图单独转成多个PDF…

如何用Kimi生成PPT?秒出PPT更高效!

做PPT是不是总是让你头疼&#xff1f;&#x1f629; 快速制作出专业的PPT&#xff0c;今天我们要推荐两款超级好用的AI工具——Kimi 和 秒出PPT&#xff01;我们来看看哪一款更适合你吧&#xff01;&#x1f680; &#x1f947; Kimi&#xff1a;让PPT制作更轻松 Kimi的生成效…