网站首页 > 精选文章 正文
上周我们了解了ROS核心(节点、话题、服务、DDS通信协议等),今天讲一下ROS2中的开放工具,包括launch脚本文件、tf坐标系、gazebo仿真平台、rviz可视化平台、rosbag数据记录与回放、rqt模块化可视化工具箱。(原文链接:https://www.eeworld.com.cn/avz9KO0)
launch脚本文件
相较于ROS1来说ROS2的launch文件使用了python语言,使其可以变得更加灵活。同时也可以对各个节点进行更加细致的操作
比如,ROS1的launch文件可能是这样的:
<launch>
<arg
name="model" />
<param
name="robot_description"
textfile="$(find wx_robot_model)/urdf/wx_robot_model.urdf" />
<node
name="joint_state_publisher"
pkg="joint_state_publisher"
type="joint_state_publisher" />
<node
name="robot_state_publisher"
pkg="robot_state_publisher"
type="robot_state_publisher" />
</launch>
而ROS2的launch文件如下
import os
from ament_index_python.packages import get_package_share_directory # 查询功能包路径的方法
from launch import LaunchDescription # launch文件的描述类
from launch_ros.actions import Node # 节点启动的描述类
defgenerate_launch_description():# 自动生成launch文件的函数
rviz_config = os.path.join( # 找到配置文件的完整路径
get_package_share_directory('learning_launch'),
'rviz',
'turtle_rviz.rviz'
)
return LaunchDescription([ # 返回launch文件的描述信息
Node( # 配置一个节点的启动
package='rviz2', # 节点所在的功能包
executable='rviz2', # 节点的可执行文件名
name='rviz2', # 对节点重新命名
arguments=['-d', rviz_config] # 加载命令行参数
)
])
可以看得出来ROS2的launch文件更发杂也更加灵活,学会编写launch文件可以实现一键启动等想法
如果想具体了解launch脚本文件的写法和多样的用法可以访问如下两个官方的链接
https://docs.ros.org/en/humble/Tutorials/Launch/Launch-Main.html
https://docs.ros.org/en/humble/Tutorials/Launch/Using-ROS2-Launch-For-Large-Projects.html
tf坐标系
tf坐标系的具体用法有以下这些:
- 查看tf树
- 查询坐标变换信息
- 坐标可视化
- 静态tf广播
- 动态tf广播
- tf监听
接下来演示一下:如何进行海龟跟随
效果如下:
具体的实现代码(python)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@作者: 古月居(www.guyuehome.com)
@说明: ROS2 TF示例-通过坐标变化实现海龟跟随功能
"""
import math
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
import tf_transformations # TF坐标变换库
from tf2_ros import TransformException # TF左边变换的异常类
from tf2_ros.buffer import Buffer # 存储坐标变换信息的缓冲类
from tf2_ros.transform_listener import TransformListener # 监听坐标变换的监听器类
from geometry_msgs.msg import Twist # ROS2 速度控制消息
from turtlesim.srv import Spawn # 海龟生成的服务接口
classTurtleFollowing(Node):
def__init__(self, name):
super().__init__(name) # ROS2节点父类初始化
self.declare_parameter('source_frame', 'turtle1') # 创建一个源坐标系名的参数
self.source_frame = self.get_parameter( # 优先使用外部设置的参数值,否则用默认值
'source_frame').get_parameter_value().string_value
self.tf_buffer = Buffer() # 创建保存坐标变换信息的缓冲区
self.tf_listener = TransformListener(self.tf_buffer, self) # 创建坐标变换的监听器
self.spawner = self.create_client(Spawn, 'spawn') # 创建一个请求产生海龟的客户端
self.turtle_spawning_service_ready = False# 是否已经请求海龟生成服务的标志位
self.turtle_spawned = False# 海龟是否产生成功的标志位
self.publisher = self.create_publisher(Twist, 'turtle2/cmd_vel', 1) # 创建跟随运动海龟的速度话题
self.timer = self.create_timer(1.0, self.on_timer) # 创建一个固定周期的定时器,控制跟随海龟的运动
defon_timer(self):
from_frame_rel = self.source_frame # 源坐标系
to_frame_rel = 'turtle2'# 目标坐标系
ifself.turtle_spawning_service_ready:# 如果已经请求海龟生成服务
ifself.turtle_spawned:# 如果跟随海龟已经生成
try:
now = rclpy.time.Time() # 获取ROS系统的当前时间
trans = self.tf_buffer.lookup_transform( # 监听当前时刻源坐标系到目标坐标系的坐标变换
to_frame_rel,
from_frame_rel,
now)
except TransformException as ex: # 如果坐标变换获取失败,进入异常报告
self.get_logger().info(
f'Could not transform {to_frame_rel} to {from_frame_rel}: {ex}')
return
msg = Twist() # 创建速度控制消息
scale_rotation_rate = 1.0# 根据海龟角度,计算角速度
msg.angular.z = scale_rotation_rate * math.atan2(
trans.transform.translation.y,
trans.transform.translation.x)
scale_forward_speed = 0.5# 根据海龟距离,计算线速度
msg.linear.x = scale_forward_speed * math.sqrt(
trans.transform.translation.x ** 2 +
trans.transform.translation.y ** 2)
self.publisher.publish(msg) # 发布速度指令,海龟跟随运动
else: # 如果跟随海龟没有生成
ifself.result.done():# 查看海龟是否生成
self.get_logger().info(
f'Successfully spawned {self.result.result().name}')
self.turtle_spawned = True
else: # 依然没有生成跟随海龟
self.get_logger().info('Spawn is not finished')
else: # 如果没有请求海龟生成服务
ifself.spawner.service_is_ready():# 如果海龟生成服务器已经准备就绪
request = Spawn.Request() # 创建一个请求的数据
request.name = 'turtle2'# 设置请求数据的内容,包括海龟名、xy位置、姿态
request.x = float(4)
request.y = float(2)
request.theta = float(0)
self.result = self.spawner.call_async(request) # 发送服务请求
self.turtle_spawning_service_ready = True# 设置标志位,表示已经发送请求
else:
self.get_logger().info('Service is not ready') # 海龟生成服务器还没准备就绪的提示
defmain(args=None):
rclpy.init(args=args) # ROS2 Python接口初始化
node = TurtleFollowing("turtle_following") # 创建ROS2节点对象并进行初始化
rclpy.spin(node) # 循环等待ROS2退出
node.destroy_node() # 销毁节点对象
rclpy.shutdown() # 关闭ROS2 Python接口
gazebo仿真平台
相较于ROS1,ROS2对gazebo惊醒了重新设计与升级;这里只展示如何在官网上下载gazebo,后续的使用则在后面进行展示
参考以下官方链接
https://gazebosim.org/docs/harmonic/install_ubuntu/
#安装依赖项
sudo apt-get update
sudo apt-get install curl lsb-release gnupg
#安装Gazebo Harmonic
sudo curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
echo"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null
sudo apt-get update
sudo apt-get install gz-harmonic
#最后安装jazzy gz安装包
sudo apt install ros-jazzy-ros-gz
#需要注意的是:
#根据 Gazebo 官方文档,ROS 2 Jazzy(LTS 版本)仅支持 Gazebo Harmonic(Gazebo 11),而 Ionic 版本(Gazebo 12)与 Jazzy 的兼容性被标记为**(不推荐)**。所以下载的时候要看清楚版本再下载
rviz可视化平台
rviz平台ROS2和ROS1版本的使用方法差不多,所以这里不会过多赘述
rosbag数据记录与回放
同样的ROS1和ROS2的使用方法大差不差
- 数据记录rosbag record
- 数据回放rosbag play值得注意的是,rosbag可以对图像话题进行录制,然后再会放出来,相当于进行了一次录像操作
rqt模块化可视化工具箱
rqt工具箱主要是这几个方面的使用
rqt安装
sudo apt install ros-jazzy-rqt
- 日志显示ros2 run rqt_console rqt_console
- 图像显示ros2 run rqt_image_view rqt_image_view
- 发布图像话题/服务数据
- 绘制数据曲线
- 数据包管理
- 节点可视化
最后,希望大家可以学习一下git开发工具,并使用vscode进行开发。
猜你喜欢
- 2025-07-28 手把手教您3D打印一个自动写字机器人
- 2025-07-28 学习少儿编程,可以这样寓教于乐(少儿编程到底学什么东西)
- 2025-07-28 python海龟绘图turtle(一):画布和窗体
- 2025-07-28 文言文编程还不够好玩?这里有个16岁高中生开发的粤语编程项目
- 2025-07-28 教孩子学Python编程之海龟画图(二)
- 2025-07-28 Python Turtle绘图 新手也能画出彩色风车、五角星 孩子学编程超合适
- 2025-07-28 少儿学编程系列---如何使用turtle画花瓣
- 2025-07-28 Python turtle模块编程实践教程(python turtle.rt)
- 2025-07-28 小学生Python编程入门-9.循环与海龟协作
- 2025-07-28 小学生Python编程入门-10.函数与海龟编程
- 最近发表
-
- Revit软件的AI驱动建模工具,Revit-MCP开源代码
- 腾讯云 Lighthouse 轻量应用服务器:数据驱动的架构选型指南
- 外贸独立站的"减肥日记":跨境电商卖家为何被数据库拖垮?
- CentOS7下搭建日志采集分析系统LogAnalyzer
- SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移?
- 数据库日志清理方法-日志文件收缩
- MySQL数据库太low了,error,slow,general日志...
- 利用shell脚本将Mysql错误日志保存到数据库中
- Python日志管理实战:用logging模块打造专业级应用监控
- Spring Boot中自定义appender实现往数据库中记录日志?
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)