ROS1學習第三彈

ROS1學習第二彈
本文純屬記錄學習過程,所學教程來自B站古月居ROS入門21講

tf工具的使用

命令行中

1.rosrun tf view_frames 生成當前各個坐標的結構圖,導出pdf文件到當前終端所在文件夾下面在這里插入圖片描述2.rosrun rviz rviz -d rospackage find turtle_tf /rviz/turtle_rviz.rviz
在圖中藍色處要修改一下父親坐標系
在這里插入圖片描述

代碼實現

廣播:

#include<ros/ros.h>
#include<tf/transform_broadcaster.h>
#include<turtlesim/Pose.h>std::string turtle_name;  // 存儲烏龜名稱(由命令行參數傳入)// 回調函數:處理訂閱的烏龜位姿消息,并發布TF變換
void poseCallback(const turtlesim::PoseConstPtr& msg)
{// 創建TF廣播器(static確保只創建一次)static tf::TransformBroadcaster bro;// 創建變換對象,設置平移部分(x, y, z)tf::Transform transform;transform.setOrigin(tf::Vector3(msg->x, msg->y, 0.0));// 創建四元數對象,設置旋轉部分(由歐拉角轉換而來)tf::Quaternion q;q.setRPY(0, 0, msg->theta);  // 繞Z軸旋轉theta角度(烏龜朝向)transform.setRotation(q);// 發送帶時間戳的變換:// 參數1:變換對象// 參數2:當前時間戳// 參數3:父坐標系名稱("world")// 參數4:子坐標系名稱(烏龜名稱,如"turtle1")bro.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
}int main(int argc, char **argv)
{// 初始化ROS節點,節點名稱必須唯一// 注意:節點名稱在命令行中通過__name:=參數指定,而非此處的硬編碼名稱ros::init(argc, argv, "my_tf_broadcaster");// 檢查命令行參數(必須提供烏龜名稱,如"turtle1"或"turtle2")if(argc != 2){ROS_ERROR("需要傳入烏龜名稱作為參數");return -1;}// 從命令行參數獲取烏龜名稱(argv[1])turtle_name = argv[1];// 創建節點句柄,用于與ROS系統通信ros::NodeHandle node;// 訂閱烏龜的位姿話題(如"/turtle1/pose")// 回調函數poseCallback將在收到消息時被調用ros::Subscriber sub = node.subscribe(turtle_name + "/pose", 10, &poseCallback);// 進入循環等待回調(阻塞當前線程)ros::spin();return 0;
}

監聽:

#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節點,命名為"my_tf_listener"ros::init(argc, argv, "my_tf_listener");ros::NodeHandle node;// 等待/spawn服務可用(用于創建新烏龜)ros::service::waitForService("/spawn");// 創建服務客戶端,連接到/spawn服務ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");// 準備Spawn服務請求(創建新烏龜)turtlesim::Spawn srv;// 注意:此處未設置srv.request參數,將使用默認值(可能導致重復創建同名烏龜)add_turtle.call(srv);  // 調用服務創建烏龜// 創建速度指令發布者,發布到/turtle2/cmd_vel話題,控制turtle2移動ros::Publisher turtle_vel = node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel", 10);// 創建TF監聽器,用于接收和緩存TF變換數據tf::TransformListener listener;// 設置循環頻率為10Hzros::Rate rate(10.0);while(node.ok())  // 主循環,直到節點被關閉{tf::StampedTransform transform;  // 存儲變換結果的對象try{// 等待并查找turtle1相對于turtle2的變換// 參數1:目標坐標系(turtle2)// 參數2:源坐標系(turtle1)// 參數3:時間戳(ros::Time(0)表示最新可用變換)// 參數4:超時時間(等待3秒)listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);}catch(tf::TransformException &ex){// 捕獲變換異常并打印錯誤信息ROS_ERROR("%s", ex.what());ros::Duration(1.0).sleep();  // 暫停1秒后繼續continue;}// 計算控制指令,使turtle2跟隨turtle1geometry_msgs::Twist vel_msg;// 角速度控制(轉向):// atan2計算turtle1相對于turtle2的角度,乘以4.0放大控制量vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(), transform.getOrigin().x());// 線速度控制(前進):// 計算turtle1與turtle2的距離,乘以0.5作為前進速度vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) + pow(transform.getOrigin().y(), 2));// 發布控制指令turtle_vel.publish(vel_msg);rate.sleep();  // 休眠以維持10Hz的頻率}return 0;
}

launch文件

launch語法

<launch><node pkg="pkg_name", node="node_name", type="executable_name"/>
</launch>

參數設置(param)

用于設置ROS系統運行中的參數,存儲在參數服務器中

<param name="output_frame" value="odom"/>
  • name:參數名
  • value:參數值

參數文件加載(rosparam)

加載YAML文件中的多個參數

<rosparam file="params.yaml" command="load" ns="params"/>

局部變量(arg)

launch文件內部的局部變量,僅限于launch文件使用

<arg name="arg-name" default="arg-value"/>
  • name:參數名
  • default:參數值(默認值)

局部變量調用方法

  1. 在param中調用
<param name="foo" value="$(arg arg-name)"/>
  1. 在node中調用
<node name="node" pkg="package" type="type" args="$(arg arg-name)"/>

重映射(remap)

重命名ROS計算圖資源(如Topic、Service等)

<remap from="/turtlebot/cmd_vel" to="/cmd_vel"/>
  • from:原始名稱
  • to:映射后的新名稱

包含其他launch文件(include)

在launch文件中包含另一個launch文件,類似C語言中的頭文件包含

<include file="${dirname}/other.launch"/>
  • file:被包含的launch文件路徑(可使用$(find pkg)或變量如${dirname}

其余可參考官網

工作空間中

以最簡單的在同一終端下運行兩個節點為例:

<launch><node pkg="learning_topic" type="person_subscriber" name="talker" output="screen" /><node pkg="learning_topic" type="person_publisher" name="listener" output="screen" />
</launch>

在這里插入圖片描述

<launch><!-- 全局參數 --><param name="/turtle_number" value="2"/><!-- 節點1 --><node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node" output="screen"><!-- 節點自己的參數 --><param name="turtle_name1" value="Tom"/><param name="turtle_name2" value="Jerry"/><!-- 加載YAML參數文件 --><rosparam file="$(find learning_launch)/config/param.yaml" command="load" /></node><!-- 節點2 --><node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen"/>
</launch>

在這里插入圖片描述調用之前的 learning_tf 功能包

<launch><node pkg="turtlesim" type="turtlesim_node" name="sim" /><node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen" /><node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" /><node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" /><node pkg="learning_tf" type="learning_tf_listener" name="listener" /></launch>

在這里插入圖片描述

可視化工具

rqt_bag
rqt_graph
rqt_plot
rqt_console
rqt_image_view
rqt_shell
rqt_dep
rqt_logger_level
rqt_topic
rosrun rviz rivz

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88438.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

技術演進中的開發沉思-30 MFC系列:五大機制

MFC&#xff0c;記得我剛畢業時在 CRT 顯示器前敲下第一行 MFC 代碼時&#xff0c;那時什么都不懂&#xff0c;沒有框架的概念。只覺得眼前的 CObject 像位沉默且復雜的大家族&#xff0c; 就像老北京胡同里的大家族&#xff0c;每個門牌號都藏著自己的故事。但現在看看&#x…

機器學習-06(Optimization-自動調整學習率)

臨界點其實不一定是在訓練神經網絡過程中遇到的最大阻礙。隨著對參數的不斷更新&#xff0c;Loss值會不斷下降&#xff0c;直至幾乎沒有變化&#xff0c;不再下降。當參數更新到臨界點時&#xff0c;意味著gradient非常小&#xff0c;所以要認定參數是否到達臨界點應當確認grad…

Uniapp中的uni.scss

uni.scss為uni-app新建項目自帶工程文件&#xff0c;使用的預處理器為sass/scss&#xff0c;由此可見&#xff0c;uni-app官方推薦的是scss。 uni.scss特點 無需引入&#xff0c;uni-app在編譯時&#xff0c;會自動引入此文件在此中定義的scss變量&#xff0c;可以全局使用&…

PreparedStatement 實現分頁查詢詳解

PreparedStatement 實現分頁查詢詳解 在 JDBC 中使用 PreparedStatement 實現分頁查詢是高效安全的方式&#xff0c;可以避免 SQL 注入并提升性能。下面我將詳細說明實現步驟和原理。 &#x1f4d0; 分頁查詢核心參數參數名說明計算公式pageNum當前頁碼&#xff08;從1開始&…

ClamAV 和 FreshClam:Linux 服務器上的開源殺毒解決方案

ClamAV 和 FreshClam:Linux 服務器上的開源殺毒解決方案 1. 概述 ClamAV 是一款開源的防病毒引擎,專為 Linux 服務器設計,用于檢測惡意軟件、病毒、木馬和其他安全威脅。它廣泛應用于郵件服務器、文件存儲系統和 Web 服務器,提供高效的病毒掃描功能。 主要特點: 免費開…

PySpark中python環境打包和JAR包依賴

在 PySpark 中打包 Python 環境并調度到集群是處理依賴一致性的關鍵步驟。以下是完整的解決方案&#xff0c;包含環境打包、分發和配置方法&#xff1a; 一、環境打包方法 使用 Conda 打包環境 # 創建 Conda 環境 conda create -n pyspark_env python3.8 conda activate pyspar…

和鯨社區深度學習基礎訓練營2025年關卡2(1)純numpy

擬分3種實現方法&#xff1a;1.純numpy2.sklearn中的MLPClassifier3.pytorch題目&#xff1a; 在 MNIST 數據集上訓練 MLP 模型并比較不同的激活函數和優化算法任務描述&#xff1a;使用 MNIST 數據集中的前 20,000 個樣本訓練一個多層感知機 (MLP) 模型。你需要比較三種不同的…

Sequential Thinking:AI深度思考的新范式及其與CoT、ReAct的對比分析

引言&#xff1a;AI深度思考的演進與Sequential Thinking的崛起在人工智能技術快速發展的今天&#xff0c;AI模型的思考能力正經歷著從簡單應答到深度推理的革命性轉變。這一演進過程不僅反映了技術本身的進步&#xff0c;更體現了人類對機器智能認知邊界的持續探索。早期的大語…

云原生詳解:構建現代化應用的未來

引言 在數字化轉型的浪潮中,"云原生"已成為技術領域最熱門的話題之一。從初創公司到全球500強企業,都在積極探索云原生技術以提升業務敏捷性和創新能力。本文將全面解析云原生的概念、核心技術、優勢以及實踐路徑,幫助您深入理解這一改變IT格局的技術范式。 什么…

SSE事件流簡單示例

文章目錄1、推送-SseEmitter2、接收-EventSourceListenerSSE&#xff08;Server-Sent Events&#xff0c;服務器推送事件&#xff09;是一種基于HTTP的服務器向客戶端實時推送數據的技術標準。1、推送-SseEmitter SseEmitter用于實現服務器向客戶端單向、長連接的實時數據推送…

Elasticsearch RESTful API入門:基礎搜索與查詢DSL

Elasticsearch RESTful API入門&#xff1a;基礎搜索與查詢DSL 本文為Elasticsearch初學者詳細解析RESTful API的核心操作與查詢DSL語法&#xff0c;包含大量實戰示例及最佳實踐。 一、Elasticsearch與RESTful API簡介 Elasticsearch&#xff08;ES&#xff09;作為分布式搜索…

(六)復習(OutBox Message)

文章目錄 項目地址一、OutBox Message1.1 OutBox表配置1. OutBoxMessage類2. OutboxMessage表配置3. 給每個模塊生成outboxmessage表1.2 發布OutBox Message1. 修改Intercepotor2. 配置Quartz3. 創建Quatz方法發布領域事件4. 創建Quatz定時任務5. 注冊Quatz服務和配置6. 流程梳…

STM32-ADC內部溫度

在通道16無引腳&#xff08;測量溫度不準確&#xff09;跟ADC代碼差不多&#xff1b;不需要使能引腳時鐘&#xff1b;將內部溫度測量打開/*** brief 啟用或禁用溫度傳感器和內部參考電壓功能* param NewState: 新的功能狀態&#xff0c;取值為ENABLE或DISABLE* retval 無* no…

「Linux命令基礎」文本模式系統關閉與重啟

關機重啟基本命令 直接拔掉計算機電源可能損壞內部元件;Linux系統通過命令關閉計算機則是安全流程,讓所有程序有機會保存數據、釋放資源。 關機命令:shutdown Linux系統提供了多種用于關閉或重啟系統的命令,其中 shutdown 是最常用的一種,它可以安全地通知用戶系統即將…

射頻信號(大寬高比)時頻圖目標檢測anchors配置

一、大寬高比目標YOLO檢測參數設置 這是yolov7的一個label的txt文件&#xff1a; 1 0.500 0.201 1.000 0.091 2 0.500 0.402 1.000 0.150 3 0.500 0.604 1.000 0.093 0 0.500 0.804 1.000 0.217 對應的樣本&#xff1a; 長寬比分別是&#xff1a;1/0.09110.98, 1/0.1506.67…

OpenStack 鑒權服務介紹.md

引言 OpenStack是一個開源的云計算管理平臺&#xff0c;其中的Keystone組件承擔了身份認證和授權的關鍵任務。Keystone的主要功能包括管理用戶及其權限、維護OpenStack Services的Endpoint&#xff0c;以及實現認證&#xff08;Authentication&#xff09;和鑒權&#xff08;Au…

Linux_3:進程間通信

IPC1.什么是IPC&#xff1f;Inter Process Communication2.進程間通信常用的幾種方式1&#xff0c;管道通信&#xff1a;有名管道&#xff0c;無名管道2&#xff0c;信號- 系統開銷小3&#xff0c;消息隊列-內核的鏈表4&#xff0c;信號量-計數器5&#xff0c;共享內存6&#x…

【Springboot】Bean解釋

在 Spring Boot 中&#xff0c;Bean 就像是你餐廳里的一名員工。比如&#xff0c;你有一名服務員&#xff08;Service&#xff09;、一名廚師&#xff08;Chef&#xff09;和一名收銀員&#xff08;Cashier&#xff09;。這些員工都是餐廳正常運轉所必需的&#xff0c;他們各自…

axios的post請求,數據為什么要用qs處理?什么時候不用?

為什么使用 qs 處理 POST 數據axios 的 POST 請求默認將 JavaScript 對象序列化為 JSON 格式&#xff08;Content-Type: application/json&#xff09;。但某些后端接口&#xff08;尤其是傳統表單提交&#xff09;要求數據以 application/x-www-form-urlencoded 格式傳輸&…

【unitrix】 4.21 類型級二進制數基本結構體(types.rs)

一、源碼 這段代碼定義了一個類型級數值系統的 Rust 實現&#xff0c;主要用于在編譯時表示和操作各種數值類型。 use crate::sealed::Sealed; use crate::number::{NonZero, TypedInt, Unsigned, Primitive}; // // 特殊浮點值枚舉 ///// 特殊浮點值&#xff08;NaN/∞&#x…