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.mzph.cn/news/807119.shtml

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

相关文章

day02 VS Code开发单片机

VS Code开发单片机 1.1 安装 MinGW-w64 1)MinGW-w64介绍 VS Code 用于编辑 C 代码,我们还需要 C 编译器来运行 C 代码,所以安装 VS Code之前我们需要先安装 C 编译器。这里我们使用 MinGW-w64(Minimalist GNU for Windows 64-bit)。 MinGW-w64 是一个用于Windows操作系…

SpringBoot和Vue2项目配置https协议

1、SpringBoot项目 ① 去你自己的云申请并下载好相关文件,SpringBoot下载的是Tomcat(默认),Vue2下载的是Nginx ② 将下载的压缩包里面的.pfx后缀文件拷贝到项目的resources目录下 ③ 编辑配置文件 (主要是框里面的内…

解决苹果iMac的M1芯片Node Sass does not yet support your current environment的问题

问题背景 如图所示,这是我的电脑,M1芯片 启动前端项目老是报错,说node Sass不支持我当前的环境,同事的macBook是intel芯片的,就能跑起项目来 很烦 但是不慌!!! 咱有解决方法啦&a…

云原生__K8S

createrepo --update /var/localrepo/# 禁用 firewall 和 swap [rootmaster ~]# sed /swap/d -i /etc/fstab [rootmaster ~]# swapoff -a [rootmaster ~]# dnf remove -y firewalld-*[rootmaster ~]# vim /etc/hosts 192.168.1.30 harbor 192.168.1.50 master 192.168.1.…

数字货币:金融创新的未来?

随着科技的进步,数字货币作为一种新型的金融工具正逐渐走进人们的视线。那么,数字货币究竟是什么?它有哪些优势?它是否真的能够引领金融创新的未来?本文将从专业角度出发,深入探讨这些问题。 一、数字货币的…

iOS 启动速度优化

启动耗时:点击App后到首帧显示耗费的时间。 阶段分析:premain、postmain,也就是main函数执行前和main函数执行后。 耗时检测:Instrument->App Launch Premain 减少动态库数量:启动时程序会加载动态库,…

一分钟了解机器人自由度

目录 自由度的定义 自由度的分类 自由度的影响 影响自由度的主要参数 关节类型和数量 机械结构 控制系统 自由度控制的硬件架构原理 传感器 执行器 控制器 通信接口 软件和算法 机器人的自由度是指机器人在空间中可以独立移动的方向和角度的数量,它是衡…

html--虎鲸

<!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>虎鲸</title> <link rel"stylesheet" href"css/normalize.css"> <link rel"stylesheet" href"css/style.css" …

Linux C++ 029-STL之queue容器

Linux C 029-STL之queue容器 本节关键字&#xff1a;Linux、C、queue 相关库函数&#xff1a;push、pop、back、front queue基本概念 概念&#xff1a;queue是一种先进先出&#xff08;First In Fisrst Out&#xff0c;FIFO&#xff09;的数据结构&#xff0c;它有两个端口 关…

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

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

OpenCV 学习笔记2 C++

1.图像直方图 直方图&#xff08;Histogram&#xff09;是图像处理中常用的工具&#xff0c;它表示图像中每个像素强度值的分布情况。在OpenCV中&#xff0c;可以使用 cv::calcHist 函数来计算图像的直方图。 图像直方图是一种展示图像像素强度分布的统计图表。它显示了图像中…

ES学习日记(十一)-------Java操作ES之基本操作

前言 此篇博客还是一些基础操作&#xff0c;没什么可写的&#xff0c;需要的同学直接抄作业进行测试就可以 上一节写了连接和测试新增操作,这一节写java操作ES的基本操作,也就是增删改查,在这里补充一点知识,我们之前用了指定的索引进行指定添加 有一个情况是,如果我们指定了…

企微自建应用开发-注意事项

1、错误48002 api forbidden&#xff0c;接口无权限 1.1添加ip白名单&#xff0c;ip地址以企微返回值为准 1.2按照规则添加相应权限&#xff0c;例如&#xff1a;【联系我】二维码接口 2、错误60011 no privilege to access/modify contact/party/agent 2.2修改应用可见范围&am…

文件下载本地

1、不管什么格式的文件都需要转为字节数组 byte[] 2、再转为各种格式文件的的输出流 3、再转为文件输出流写入本地 注意File生成目录 FileOutputStream为具体全称。

C++ | Leetcode C++题解之第19题删除链表的倒数第N个结点

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummy new ListNode(0, head);ListNode* first head;ListNode* second dummy;for (int i 0; i < n; i) {first first->next;}while (fi…

【产品】ADW300 无线计量仪表 用于计量低压网络的三相有功电能

1 概述 ADW300 无线计量仪表主要用于计量低压网络的三相有功电能&#xff0c;具有体积小、精度高、功能丰富等优点&#xff0c;并且可选通讯方式多&#xff0c;可支持 RS485 通讯和 Lora、2G、NB、4G 等无线通讯方式&#xff0c;增加了外置互感器的电流采样模式&#xff0c;从…

机器学习-09-图像处理

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中图像处理技术。 参考 02图像知识 色彩基础知识整理-色相、饱和度、明度、色调 图像特征提取&#xff08;VGG和Resnet特征提取卷积过程详解&#xff09; Python图像处理入门 【人工智能】PythonOpenCV…

Redis高级-分布式缓存RDB原理

分布式缓存 1.1.2.RDB原理 bgsave开始时会fork主进程得到子进程&#xff0c;子进程共享主进程的内存数据。完成fork后读取内存数据并写入 RDB 文件。 fork采用的是copy-on-write技术&#xff1a; 当主进程执行读操作时&#xff0c;访问共享内存&#xff1b;当主进程执行写操…

idea中输入法被锁定如何清除

今天遇到一个问题&#xff1f;idea中输入法被锁定了&#xff0c;无论怎么切换输入法&#xff0c;切换中英文&#xff0c;在idea中输出的均为英文内容&#xff0c;该如何解决呢&#xff1f;&#xff08;idea官网&#xff1a;JetBrains: 软件开发者和团队的必备工具&#xff09; …

SQLite Android 绑定(十八)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite 在Android安装与定制方案&#xff08;十七&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ 应用程序编程 加载共享库 在使用任何与 SQLite 相关的方法或对象之前&#xff0c;本机 SQLite 必…