ROS2 采集虚拟仿真环境图像并发布

简介:ROS2功能的学习我们还是在基于OpenAI的gym虚拟仿真环境中来完成,gym虚拟仿真环境安装请参考另一篇教程,这里不再重复说明,接下来我们开始创建一个ROS2的功能节点,并发布虚拟仿真环境小车摄像头的图像,然后利用rqt工具查看图像。

1、创建工作空间

与ROS1类似,ROS2也有工作空间的概念,所谓工作空间,实际就是一个目录结构按约定搭建的文件夹(我们这里的工作空间是指ros2_ws),ROS2的工作空间只需要提前创建src目录(功能包目录)即可,不需要初始化:

$ mkdir -p ~/ros2_ws/src

后续所有的功能包都在src目录下创建,编译要回到ros2_ws目录下,编译后,在工作空间内生成build、install、log目录。


2、创建功能包

进入功能包目录src

$ cd ros2_ws/src/

新建duckiebot功能包

$ ros2 pkg create duckiebot --build-type ament_python --node-name duckiebot_node --dependencies rclpy std_msgs sensor_msgs

命令

说明

ros2 pkg create

ROS2功能包创建命令

duckiebot

所建功能包名称,可以放在最后

—build-type ament_python

指定编程语言,我们这里使用python

—node-name duckiebot_node

指定要生成的源码文件,可以后期创建,但是手动创建需要手动配置

—dependencies rclpy std_msgs sensor_msgs

指定依赖模块,rclpy是python编程必选的, std_msgs和sensor_msgs是我们要用的消息模块,也可以不指定手动配置

创建完成后,目录结构如下图:

duckiebot_node.py就是自动生成的源码文件,内容如下:

def main():print('Hi from duckiebot.')if __name__ == '__main__':main()

3、编译并运行

ROS2编译需要用colcon工具,默认是没有安装的,需要手动安装:

$ sudo apt-get install python3-colcon-common-extensions -y

返回工作空间

$ cd .. 或者 $ cd ~/ros2_ws

编译所有功能包:

$ colcon build

为了提高工作效率,也可以指定要编译的功能包:

$ colcon build --packages-select duckiebot

编译后工作空间的目录结构:

设置环境变量:

$ source install/setup.bash

运行节点:

$ ros2 run duckiebot duckiebot_node

屏幕上输出:

Hi from duckiebot.


4、配置文件

上文提到在创建功能包时一些配置项可以手动配置,主要的配置项都在功能包内的setup.py和package.xml文件内:

setup.py内主要是指定源码文件及启动函数:

package.xml指定了编译方式和依赖项:


5、修改源码,本地显示虚拟仿真图像

修改duckiebot_node.py,加入虚拟仿真环境启动和图像显示功能:

#!/usr/bin/env python3import rclpy #ROS2的python实现库
from rclpy.node import Node  #节点基类,所有节点都要继承Node类import gym  #虚拟仿真环境基础实现库
from pyglet.window import key  #python动画GUI库
from gym_duckietown.envs import DuckietownEnv  #环境模型import cv2
import numpy as npclass DuckiebotNode(Node):def __init__(self, name):super().__init__(name)#初始化虚拟仿真环境参数,如果要切换地图,修改map_name的值self.env = DuckietownEnv(seed=1,map_name="udem1",draw_curve=False,draw_bbox=False,domain_rand=False,frame_skip=1,distortion=False,camera_rand=False,dynamics_rand=False)#初始化虚拟仿真环境self.env.reset()#定义一个定时器,通过定时器回调函数控制图像更新self.timer = self.create_timer(0.05, self.timer_callback)#定时器回调函数def timer_callback(self):#创建一个随机的action,让小车随机运动,#action是一个二元数组,两个元素分别代表小车的线速度和角速度#也可以自行指定action的值,例如:action = np.array([1,0])action = self.env.action_space.sample()#执行给定的动作,并返回当前状态#obs 是当前状态的图像数据#reward 是模拟器对小车当前状态计算出的奖励分数,可用来判断车辆状态好坏(强化学习中可以使用)#done 小车运行状态,出轨(行驶到禁止区域)、车祸(撞击到障碍物)、完成行驶任务(默认是1500次为一轮)返回true#info 小车当前状态的其他参数,可能会用到的是omega_r和omega_l,模拟小车的左右轮角速度obs, reward, done, info = self.env.step(action)#obs是rgb编码,opencv默认是bgr编码,转化颜色编码方式image = cv2.cvtColor(obs, cv2.COLOR_RGB2BGR)#显示图像cv2.imshow("image",image)cv2.waitKey(1)#出轨、车祸、完成任务时重置仿真环境if done:self.env.reset()   def main(args=None):rclpy.init(args=args) #初始化客户端node = DuckiebotNode(name="duckiebot_node") #创建节点实例rclpy.spin(node=node)  #运行节点实例rclpy.shutdown() #关闭节点

重新编译(每次修改源码文件,都需要重新编译)

$ colcon build --packages-select duckiebot

运行节点(在没有重启终端或者改变节点数量的情况下,可以不执行source命令)

$ ros2 run duckiebot duckiebot_node

 

正常情况下,会弹出图像窗口,显示一个随机运动的小车视角画面:

6、发布图像,并通过工具查看

上文我们在本地显示了仿真图像,更多内容请参考:ROS2学习笔记(三)-- 采集虚拟仿真环境图像并发布 - 古月居 (guyuehome.com)

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

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

相关文章

图像分割-RSPrompter

文章目录 前言1. 自动化提示器1.1 多尺度特征增强器1.2 RSPrompterAnchor-based PrompterQuery-based Prompter 2. SAM的扩展3. 结果WHU数据集NWPU数据集SSDD数据集 前言 《RSPrompter: Learning to prompt for remote sensing instance segmentation based on visual foundati…

即插即用篇 | YOLOv5/v7引入Haar小波下采样 | 一种简单而有效的语义分割下采样模块

本改进已集成到 YOLOv5-Magic 框架。 下采样操作如最大池化或步幅卷积在卷积神经网络(CNNs)中被广泛应用,用于聚合局部特征、扩大感受野并减少计算负担。然而,对于语义分割任务,对局部邻域的特征进行池化可能导致重要的空间信息丢失,这有助于逐像素预测。为了解决这个问题…

前端window.open的简单使用

JavaScript 中的 Window.open() 用法详解-CSDN博客 window.open("https://www.baidu.com/?tn49055317_12_hao_pg", _blank);

如何在mac毒轻松获取佣金收益

目前 mac毒(macdo.cn) 网站开启了获取佣金的渠道,你可以通过分享专属推广链接的方式来获取佣金。 下面介绍一下具体如何操作: 如何获取专属推广链接 1.首先你需要在mac毒网站注册一个自己的账号,然后在前台进入「会员中心」 2. 接着进入「推…

[leetcode]remove-duplicates-from-sorted-list

. - 力扣(LeetCode) 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2]示例 2: 输入&…

【全套源码教程】基于SpringBoot+MyBatis+Vue的流浪动物救助网站的设计与实现

目录 前言 需求分析 可行性分析 技术实现 后端框架:Spring Boot 持久层框架:MyBatis 前端框架:Vue.js 数据库:MySQL 功能介绍 前台界面功能介绍 动物领养及捐赠 宠物论坛 公告信息 商品页面 寻宠服务 个人中心 购…

(React生命周期)前端八股文修炼Day8

一 React的生命周期有哪些 React组件的生命周期可以分为三个主要阶段:挂载(Mounting)、更新(Updating)和卸载(Unmounting)。React类组件的生命周期方法允许你在组件的不同阶段执行代码。 挂载…

golang的引用和非引用总结

目录 概述 一、基本概念 指针类型(Pointer type) 非引用类型(值类型) 引用类型(Reference Types) 解引用(dereference) 二、引用类型和非引用类型的区别 三、golang数据类型…

7-20 打印九九口诀表

题目链接&#xff1a;7-20 打印九九口诀表 一. 题目 1. 题目 2. 输入输出格式 3. 输入输出样例 4. 限制 二、代码 1. 代码实现 #include <stdio.h>int main(void) {unsigned int n;if (scanf("%d", &n) ! 1) {return -1;}for (int i 1; i < n; i) …

线程池详解

线程池 什么是线程池&#xff1a;线程池就是管理一系列线程的资源池。 当有任务要处理时&#xff0c;直接从线程池中获取线程来处理&#xff0c;处理完之后线程并不会立即被销毁&#xff0c;而是等待下一个任务。 为什么要用线程池 / 线程池的好处&#xff1a; **降低资源消…

FPGA开源项目分享——基于 DE1-SOC 的 String Art 实现

导语 今天继续康奈尔大学FPGA课程ECE 5760的典型案例分享——基于DE1-SOC的String Art实现。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 ECE 5760 Final Project 项目说明 String Art起源于19世纪的数学…

Taro打包生成不同目录

使用taro init创建taro项目时&#xff0c;taro默认打包目录是&#xff1a; /config/index.js outputRoot:dist默认的目录&#xff0c;编译不同平台代码时就会覆盖掉&#xff0c;为了达到多端同步调试的目的&#xff0c;这时需要修改默认生成目录了&#xff0c;通过查看官方文…

【MySQL数据库 | 第二十六篇】InnoDB基本数据存储单元以及存在问题

前言&#xff1a; InnoDB作为MySQL中最常用的存储引擎之一&#xff0c;承载着许多数据库系统的关键任务&#xff0c;如事务管理、并发控制和数据完整性保障。 然而&#xff0c;就像任何技术一样&#xff0c;InnoDB也并非完美无缺。在深入了解其工作原理和特性的同时&#xff…

ExoPlayer停止更新,建议升级到AndroidX Media3

1. 大家常用的ExoPlayer地址&#xff1a;GitHub - google/ExoPlayer: An extensible media player for Android ExoPlayer是谷歌官方提供的媒体播放库&#xff0c;大家在开发项目中经常使用ExoPlayer播放音视频&#xff0c;谷歌官方已经明确表示该库在2024-04-03停止更新&…

鸿蒙Native输出so动态库,并提供给第三方导入使用

前言&#xff1a; DevEco Studio版本&#xff1a;4.0.0.600 API:9 最近在学习鸿蒙的Native输出so动态库&#xff0c;下面就给大家分享下我的学习心得及在实现过程中遇到的问题。 实现需求&#xff1a;通过so库输出文本内容 “你好&#xff0c;鸿蒙&#xff01;” 参考资料…

CSS 使用 SVG 绘制动态皮筋与小球交互动画

CSS 使用 SVG 绘制动态皮筋与小球交互动画 效果展示 CSS 知识点 使用 animation 控制 SVG 的 path 属性执行动画使用 CSS 设置 SVG 部分属性 整体页面布局 <div class"elasic"><!-- 小球 --><div class"ball"></div><!-- 皮…

Nodejs 第六十二章(短链接)

短链接介绍 短链接是一种缩短长网址的方法&#xff0c;将原始的长网址转换为更短的形式。它通常由一系列的字母、数字和特殊字符组成&#xff0c;比起原始的长网址&#xff0c;短链接更加简洁、易于记忆和分享。 短链接的主要用途之一是在社交媒体平台进行链接分享。由于这些…

人工智能:更多有用的 Python 库

​ 目录 推荐 JupyterLab 入门 复杂的矩阵运算 其它人工智能和机器学习的 Python 库 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 在进入主题之前&#xff0c;我们先讨论几个人…

利用Sentinel解决雪崩问题(二)隔离和降级

前言&#xff1a; 虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。而要将这些故障控制在一定范围避免雪崩&#xff0c;就要靠线程隔离(舱壁模式)和熔断降级手段了&#xff0c;不管是线程隔离还是熔断降级&#xff0c;都是对客户端(调…

太赫兹探测器是太赫兹技术应用核心器件之一 我国研究成果不断增多

太赫兹探测器是太赫兹技术应用核心器件之一 我国研究成果不断增多 太赫兹探测器&#xff0c;是太赫兹&#xff08;THz&#xff09;应用的基础&#xff0c;是太赫兹成像、太赫兹通信等系统的核心器件&#xff0c;其性能直接决定太赫兹系统的优劣&#xff0c;地位极为重要&#x…