ROS2学习笔记(三)-- 采集虚拟仿真环境图像并发布
简介:ROS2功能的学习我们还是在基于OpenAI的gym虚拟仿真环境中来完成,gym虚拟仿真环境安装请参考另一篇教程,这里不再重复说明,接下来我们开始创建一个ROS2的功能节点,并发布虚拟仿真环境小车摄像头的图像,然后利用rqt工具查看图像。
1、创建工作空间
2、创建功能包
3、编译并运行
4、配置文件
5、修改源码,本地显示虚拟仿真图像
6、发布图像,并通过工具查看
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、发布图像,并通过工具查看
上文我们在本地显示了仿真图像,接下来我们把仿真图像通过一个话题发布出去,并使用ROS的GUI工具查看图像:
#!/usr/bin/env python3import rclpy
from rclpy.node import Nodeimport gym
from pyglet.window import key
from gym_duckietown.envs import DuckietownEnvimport cv2from sensor_msgs.msg import Image #发布图像使用Image消息类型
from cv_bridge import CvBridge #opencv和ros图像数据转换工具class DuckiebotNode(Node):def __init__(self, name):super().__init__(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.pub_img = self.create_publisher(Image,"duckiebot_node/image",10)self.timer = self.create_timer(0.05, self.timer_callback)#创建图像转换工具self.bridge = CvBridge()def timer_callback(self):action = self.env.action_space.sample()obs, reward, done, info = self.env.step(action)#发布图像数据,obs是rgb编码,转化时指定编码,解码时就有据可查self.pub_img.publish(self.bridge.cv2_to_imgmsg(obs, 'rgb8'))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
$ ros2 run duckiebot duckiebot_node
新开终端,运行rqt命令,打开GUI工具
$ rqt
在窗口中通过Plugins-->Visualization-->Image View打开图像显示工具,并选择我们发布的主题/duckiebot_node/image,就可以看到实时的图像了。
ROS2学习笔记(三)-- 采集虚拟仿真环境图像并发布相关推荐
- K8S 学习笔记三 核心技术 Helm nfs prometheus grafana 高可用集群部署 容器部署流程
K8S 学习笔记三 核心技术 2.13 Helm 2.13.1 Helm 引入 2.13.2 使用 Helm 可以解决哪些问题 2.13.3 Helm 概述 2.13.4 Helm 的 3 个重要概念 ...
- ROS2学习笔记(八)-- ROS2参数应用实现道路识别调试
简介:参数也是ROS2系统中很重要的一项功能,主要是用来对节点进行配置,一般用在调试过程中,通过命令行的方式修改节点的一些配置,用以辅助调试,另外节点参数也支持导入和导出,调试好的参数可以导出到本地保 ...
- Ethernet/IP 学习笔记三
Ethernet/IP 学习笔记三 原文为硕士论文: 工业以太网Ethernet/IP扫描器的研发 知网网址: http://kns.cnki.net/KCMS/detail/detail.aspx? ...
- iView学习笔记(三):表格搜索,过滤及隐藏列操作
iView学习笔记(三):表格搜索,过滤及隐藏某列操作 1.后端准备工作 环境说明 python版本:3.6.6 Django版本:1.11.8 数据库:MariaDB 5.5.60 新建Django ...
- ROS学习笔记三:创建ROS软件包
,# ROS学习笔记三:创建ROS软件包 catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 这个软件包必须包含一个catkin编译文件package.xml(man ...
- python3常用模块_Python学习笔记三(常用模块)
Python 学习笔记三 (常用模块) 1.os模块 os模块包装了不同操作系统的通用接口,使用户在不同操作系统下,可以使用相同的函数接口,返回相同结构的结果. os.name:返回当前操作系统名称( ...
- ESP32学习笔记(1)——搭建环境、编译烧写(Windows+VS Code)
Espressif-IDE 环境搭建参看 ESP32学习笔记(50)--搭建环境.编译烧写(Windows+Espressif-IDE) 一.搭建环境 1.1 官方资料 ESP-IDF 编程指南 1. ...
- ESP8266学习笔记(1)——搭建环境、编译烧写(NONOS SDK)
RTOS SDK环境搭建参看 ESP8266学习笔记(17)--搭建环境.编译烧写(RTOS SDK) 一.搭建环境 1.1 ESP8266 SDK 入门指南 官网下载:https://www.esp ...
- 【AngularJs学习笔记三】Grunt任务管理器
为什么80%的码农都做不了架构师?>>> #0 系列目录# AngularJs学习笔记 [AngularJs学习笔记一]Bower解决js的依赖管理 [AngularJs学习笔 ...
最新文章
- 判断屏幕宽高比是否为16:9
- 给不爱洗手找个理由——皮肤共生菌可以促进伤口愈合
- netty io.netty.buffer简介
- 【科技金融】CART树现金贷风控策略
- 跨链Cosmos(6)ABCI 原理
- 正则表达式的一些探索(偏JavaScript)
- springboot中三种xxxx.setAttribute()并与python中flask作对应比较+容器的通俗理解
- How to change max_allowed_packet size
- 2016-8-2更新日志
- 计算机网络 --- 传输层TCP协议
- 武汉理工计算机学院分数线,武汉理工今年计算机分数线
- MJRefresh的使用
- 服务器上文件添加可信任,如何将服务器配置为受信任以进行委派
- loongson2f_龙芯灵珑9S2A一体机tftp+usb安装debian6 详细过程:
- anaconda快捷键
- 你不知道的浏览器页面渲染机制
- 强引用置为null,会不会被回收及内存分配及年轻代年老代算法回收
- [软件工程]交换编程方法的深入讨论
- nginx架构(修改版)
- [计算机基础]整理计算机的数据计量单位
热门文章
- 数据结构与算法--更新中...
- 优秀架构师必须掌握的架构思维
- vue开发饿了吗外卖app④——使用vue-resource获取数据
- vue开发饿了吗外卖app③——移动端高分辨率屏幕下边框1px变大问题通用解决
- 饿了吗 系统_阿里反击开始!飞猪“100亿”补贴来袭,美团挺得住吗?
- 基于博弈论的大学生社群合作行为研究申报书(C写一个博弈软件)
- VB编程:Val字符串转数字,CStr数字转字符串-6
- SDL2嵌入控件播放导致崩溃,系统锁屏触锁后不刷新
- Android开发 华为手机读取相册闪退问题
- 我要糖糖糖HTML5小游戏,一些简单的团建破冰小游戏「15个」