莱特币做空 网站新媒体如何运营推广

当前位置: 首页 > news >正文

莱特币做空 网站,新媒体如何运营推广,哪里有平面设计,简单的微信小程序项目目录 前言 通信模型 案例一#xff1a;Hello World节点#xff08;面向过程#xff09; 运行效果 代码解析 创建节点流程 案例二#xff1a;Hello World节点#xff08;面向对象#xff09; 运行效果 代码解析 创建节点流程 案例三#xff1a;物体识别节点 …目录 前言 通信模型 案例一Hello World节点面向过程 运行效果 代码解析 创建节点流程 案例二Hello World节点面向对象 运行效果 代码解析 创建节点流程 案例三物体识别节点 运行效果 代码解析 案例四机器视觉识别节点 运行效果 代码解析 节点命令行操作 思考题 前言 机器人是各种功能的综合体每一项功能就像机器人的一个工作细胞众多细胞通过一些机制连接到一起成为了一个机器人整体。 在ROS中我们给这些 “细胞”取了一个名字那就是节点。 通信模型 完整的机器人系统可能并不是一个物理上的整体比如这样一个的机器人 在机器人身体里搭载了一台计算机A它可以通过机器人的眼睛——摄像头获取外界环境的信息也可以控制机器人的腿——轮子让机器人移动到想要去的地方。除此之外可能还会有另外一台计算机B放在你的桌子上它可以远程监控机器人看到的信息也可以远程配置机器人的速度和某些参数还可以连接一个摇杆人为控制机器人前后左右运动。 这些功能虽然位于不同的计算机中但都是这款机器人的工作细胞也就是节点他们共同组成了一个完整的机器人系统。 节点在机器人系统中的职责就是执行某些具体的任务从计算机操作系统的角度来看也叫做进程每个节点都是一个可以独立运行的可执行文件比如执行某一个python程序或者执行C编译生成的结果都算是运行了一个节点既然每个节点都是独立的执行文件那自然就可以想到得到这个执行文件的编程语言可以是不同的比如C、Python乃至Java、Ruby等更多语言。这些节点是功能各不相同的细胞根据系统设计的不同可能位于计算机A也可能位于计算机B还有可能运行在云端这叫做分布式也就是可以分布在不同的硬件载体上每一个节点都需要有唯一的命名当我们想要去找到某一个节点的时候或者想要查询某一个节点的状态时可以通过节点的名称来做查询。 节点也可以比喻是一个一个的工人分别完成不同的任务他们有的在一线厂房工作有的在后勤部门提供保障他们互相可能并不认识但却一起推动机器人这座“工厂”完成更为复杂的任务。 接下来我们就来看看 节点这个工作细胞到底该如何实现。 案例一Hello World节点面向过程 ROS2中节点的实现当然是需要编写程序了我们从Hello World例程开始先来实现一个最为简单的节点功能并不复杂就是循环打印一个“Hello World”字符串到终端中。 运行效果 大家先不要着急看代码是骡子是马先拉出来溜溜我们通过ros2 run命令运行编译好的课程代码看下这个节点执行的效果如何然后再来分析代码的实现过程做到知其然也知其所以然。 ros2 run learning_node node_helloworld 运行成功后可以在终端中看到循环打印“Hello World”字符串的效果。 代码解析 这个节点是如何实现的呢我们来看下代码。 learning_node/node_helloworld.py #!/usr/bin/env python3

-- coding: utf-8 --

作者: 古月居(www.guyuehome.com) 说明: ROS2节点示例-发布“Hello World”日志信息, 使用面向过程的实现方式 import rclpy # ROS2 Python接口库 from rclpy.node import Node # ROS2 节点类 import timedef main(argsNone): # ROS2节点主入口main函数rclpy.init(argsargs) # ROS2 Python接口初始化node Node(node_helloworld) # 创建ROS2节点对象并进行初始化while rclpy.ok(): # ROS2系统是否正常运行node.get_logger().info(Hello World) # ROS2日志输出time.sleep(0.5) # 休眠控制循环时间node.destroy_node() # 销毁节点对象 rclpy.shutdown() # 关闭ROS2 Python接口完成代码的编写后需要设置功能包的编译选项让系统知道Python程序的入口打开功能包的setup.py文件加入如下入口点的配置 entry_points{console_scripts: [node_helloworld learning_node.node_helloworld:main,],创建节点流程 代码中出现的函数大家未来会经常用到大家先不用纠结函数的具体使用方法更重要的是理解节点的编码流程。 总结一下想要实现一个节点代码的实现流程是这样做 编程接口初始化创建节点并初始化实现节点功能销毁节点并关闭接口 大家如果有学习过C或者Pyhton的话应该可以发现这里我们使用的是面向过程的编程方法这种方式虽然实现简单但是对于稍微复杂一点的机器人系统就很难做到模块化编码。 案例二Hello World节点面向对象 所以在ROS2的开发中我们更推荐大家使用面向对象的编程方式比如刚才的代码就可以改成这样虽然看上去复杂了一些但是代码会具备更好的可读性和可移植性调试起来也会更加方便。 运行效果 接下来运行一下调整后的节点 ros2 run learning_node node_helloworld_class 代码解析 功能虽然一样但是程序的结构发生了变化我们具体看一下这份代码。 learning_node/node_helloworld_class.py #!/usr/bin/env python3

-- coding: utf-8 --

作者: 古月居(www.guyuehome.com) 说明: ROS2节点示例-发布“Hello World”日志信息, 使用面向对象的实现方式 import rclpy # ROS2 Python接口库 from rclpy.node import Node # ROS2 节点类 import time 创建一个HelloWorld节点, 初始化时输出“hello world”日志class HelloWorldNode(Node):def init(self, name):super().init(name) # ROS2节点父类初始化while rclpy.ok(): # ROS2系统是否正常运行self.get_logger().info(Hello World) # ROS2日志输出time.sleep(0.5) # 休眠控制循环时间def main(argsNone): # ROS2节点主入口main函数rclpy.init(argsargs) # ROS2 Python接口初始化node HelloWorldNode(node_helloworld_class) # 创建ROS2节点对象并进行初始化rclpy.spin(node) # 循环等待ROS2退出node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口完成代码的编写后需要设置功能包的编译选项让系统知道Python程序的入口打开功能包的setup.py文件加入如下入口点的配置 entry_points{console_scripts: [node_helloworld learning_node.node_helloworld:main,node_helloworld_class learning_node.node_helloworld_class:main,],创建节点流程 所以总体而言节点的实现方式依然是这四个步骤只不过编码方式做了一些改变而已。 编程接口初始化创建节点并初始化实现节点功能销毁节点并关闭接口 到这里为止大家是不是心里还有一个疑惑机器人中的节点不能只是打印Hello World吧是不是得完成一些具体的任务。 案例三物体识别节点 没错接下来我们就以机器视觉的任务为例模拟实际机器人中节点的实现过程。 我们先从网上找到一张苹果的图片通过编写一个节点来识别图片中的苹果。 运行效果 在这个例程中我们将用到一个图像处理的库——OpenCV运行前请使用如下指令安装 sudo apt install python3-opencv 然后就可以运行例程啦 ros2 run learning_node node_object #注意修改图片路径后重新编译 运行前需要将learning_node/node_object.py代码中的图片路径修改为实际路径修改后重新编译运行即可 image cv2.imread(/home/hcx/dev_ws/src/ros2_21_tutorials/learning_node/learning_node/apple.jpg) 例程运行成功后会弹出一个可视化窗口可以看到苹果被成功识别啦一个绿色框会把苹果的轮廓勾勒出来中间的绿点表示中心点。 代码解析 在这个例程中我们加入了图像识别的处理过程模拟一个节点的功能关于图像处理的具体实现并不是此处的重点大家更多要关注我们是如何通过节点的概念来实现一个具体的机器人功能。 learning_node/node_object.py #!/usr/bin/env python3

-- coding: utf-8 --

作者: 古月居(www.guyuehome.com) 说明: ROS2节点示例-通过颜色识别检测图片中出现的苹果 import rclpy # ROS2 Python接口库 from rclpy.node import Node # ROS2 节点类import cv2 # OpenCV图像处理库 import numpy as np # Python数值计算库lower_red np.array([0, 90, 128]) # 红色的HSV阈值下限 upper_red np.array([180, 255, 255]) # 红色的HSV阈值上限def object_detect(image):hsv_img cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 图像从BGR颜色模型转换为HSV模型mask_red cv2.inRange(hsv_img, lower_red, upper_red) # 图像二值化contours, hierarchy cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 图像中轮廓检测for cnt in contours: # 去除一些轮廓面积太小的噪声if cnt.shape[0] 150:continue(x, y, w, h) cv2.boundingRect(cnt) # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2)# 将苹果的轮廓勾勒出来cv2.circle(image, (int(xw/2), int(yh/2)), 5, (0, 255, 0), -1)# 将苹果的图像中心点画出来cv2.imshow(object, image) # 使用OpenCV显示处理后的图像效果cv2.waitKey(0)cv2.destroyAllWindows()def main(argsNone): # ROS2节点主入口main函数rclpy.init(argsargs) # ROS2 Python接口初始化node Node(node_object) # 创建ROS2节点对象并进行初始化node.get_logger().info(ROS2节点示例检测图片中的苹果)image cv2.imread(/home/hcx/dev_ws/src/ros2_21_tutorials/learning_node/learning_node/apple.jpg) # 读取图像object_detect(image) # 苹果检测rclpy.spin(node) # 循环等待ROS2退出node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口完成代码的编写后需要设置功能包的编译选项让系统知道Python程序的入口打开功能包的setup.py文件加入如下入口点的配置 entry_points{console_scripts: [node_helloworld learning_node.node_helloworld:main,node_helloworld_class learning_node.node_helloworld_class:main,node_object learning_node.node_object:main,],案例四机器视觉识别节点 用图片进行识别好像还不太合理机器人应该有眼睛呀没问题接下来我们就让节点读取摄像头的图像动态识别其中的苹果或者类似颜色的物体。 运行效果 启动一个终端运行如下节点 ros2 run learning_node node_object_webcam #注意设置摄像头 如果是在虚拟机中操作需要进行以下设置 1. 把虚拟机设置为兼容USB3.1 2. 在可移动设备中将摄像头连接至虚拟机。 运行成功后该节点就可以驱动摄像头并且实时识别摄像头中的红色物体啦。 代码解析 相比之前的程序这里最大的变化是修改了图片的来源使用OpenCV中的VideoCapture()来驱动相机并且周期read摄像头的信息并进行识别。 learning_node/node_object_webcam.py #!/usr/bin/env python3

-- coding: utf-8 --

作者: 古月居(www.guyuehome.com) 说明: ROS2节点示例-通过摄像头识别检测图片中出现的苹果 import rclpy # ROS2 Python接口库 from rclpy.node import Node # ROS2 节点类import cv2 # OpenCV图像处理库 import numpy as np # Python数值计算库lower_red np.array([0, 90, 128]) # 红色的HSV阈值下限 upper_red np.array([180, 255, 255]) # 红色的HSV阈值上限def object_detect(image):hsv_img cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 图像从BGR颜色模型转换为HSV模型mask_red cv2.inRange(hsv_img, lower_red, upper_red) # 图像二值化contours, hierarchy cv2.findContours(mask_red, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) # 图像中轮廓检测for cnt in contours: # 去除一些轮廓面积太小的噪声if cnt.shape[0] 150:continue(x, y, w, h) cv2.boundingRect(cnt) # 得到苹果所在轮廓的左上角xy像素坐标及轮廓范围的宽和高cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2) # 将苹果的轮廓勾勒出来cv2.circle(image, (int(xw/2), int(yh/2)), 5, (0, 255, 0), -1) # 将苹果的图像中心点画出来cv2.imshow(object, image) # 使用OpenCV显示处理后的图像效果cv2.waitKey(50)def main(argsNone): # ROS2节点主入口main函数rclpy.init(argsargs) # ROS2 Python接口初始化node Node(node_object_webcam) # 创建ROS2节点对象并进行初始化node.get_logger().info(ROS2节点示例检测图片中的苹果)cap cv2.VideoCapture(0)while rclpy.ok():ret, image cap.read() # 读取一帧图像if ret True:object_detect(image) # 苹果检测node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口完成代码的编写后需要设置功能包的编译选项让系统知道Python程序的入口打开功能包的setup.py文件加入如下入口点的配置 entry_points{console_scripts: [node_helloworld learning_node.node_helloworld:main,node_helloworld_class learning_node.node_helloworld_class:main,node_object learning_node.node_object:main,node_object_webcam learning_node.node_object_webcam:main,],节点命令行操作 节点命令的常用操作如下 \( ros2 node list # 查看节点列表 \) ros2 node info node_name # 查看节点信息思考题 现在大家应该熟悉节点这个工作细胞的概念和实现方法了回到这个机器人系统的框架图我们还会发现另外一个问题。 电脑B中的摇杆要控制机器人运动这两个节点岂不是应该有某种连接比如摇杆节点发送一个速度指令给运动节点收到后机器人开始运动。 同理如果我们想要改变机器人的速度负责配置参数的节点就得发送一个指令给运动节点如果电脑B想要显示机器人看到的图像电脑A中的摄像头节点就得把图像发送过来。 没错在一个ROS机器人的系统中节点并不是孤立的他们之间会有很多种机制保持联系下一节我们将给大家介绍这些机制中最为常用的一种。