ROS暑期学校分享-2023

news2024/9/24 9:28:39

云课的优势

https://gitcode.net/ZhangRelay/cocubesim

网络编程和单机编程

网络编程和单机编程是两种不同的编程方式,它们的主要区别在于其应用场景和实现技术上。

1 应用场景

网络编程主要用于构建基于互联网的应用程序,例如Web应用程序、网上购物平台、在线游戏等。这些应用程序需要通过网络与远程服务器进行数据交换,因此需要使用网络编程技术来实现数据的传输和通信。

单机编程则主要用于构建基于本地的应用程序,例如桌面应用程序、游戏本地mod、本地数据分析工具等。这些应用程序不需要通过网络与远程服务器进行数据交换,而是在本地计算机上直接处理数据。

2 实现技术

网络编程的实现技术主要包括TCP/IP协议、HTTP协议、FTP协议等。这些协议规定了数据如何在网络中传输和通信,因此网络编程需要使用相应的协议来实现数据交换和通信。

单机编程的实现技术则包括本地数据库、文件系统、操作系统API等。这些技术用于在本地计算机上处理和存储数据,不需要通过网络进行数据交换。

3 编程语言

网络编程可以使用各种编程语言,例如Java、Python、C++、JavaScript等。这些语言都有相应的网络编程库和框架,可以方便地实现网络编程。

单机编程也可以使用各种编程语言,例如Java、C++、Python等。这些语言也有相应的本地编程库和框架,可以方便地实现单机编程。

总的来说,网络编程和单机编程都有其各自的应用场景和实现技术。在选择编程方式时,需要根据实际需求和应用场景来选择合适的编程方式。

分布思维和集中思维

分布思维和集中思维是两种不同的思维方式,对于ROS编程来说,它们有一定的差异。

分布思维是指将问题分解为多个部分,然后分别考虑每个部分的特点和解决方案,最终综合得出整体的解决方案。在ROS编程中,分布思维表现为将机器人系统分解为多个组件,如传感器、控制器、执行器等,然后分别考虑每个组件的功能和实现方式,最终通过ROS架构将这些组件组合成一个完整的系统。

集中思维则是指将问题看作一个整体,从整体角度出发考虑问题的解决方案。在ROS编程中,集中思维表现为将机器人系统看作一个整体,考虑系统的整体功能和目标,然后设计并实现一个完整的控制系统架构,将各个组件集成起来实现整体控制。

因此,分布思维和集中思维在ROS编程中的差异在于思考问题的角度和方法不同。分布思维更注重将问题分解为多个部分,分别考虑每个部分的解决方案,而集中思维更注重从整体角度考虑问题的解决方案。两种思维方式都有其优点和缺点,具体应用时需要根据实际情况选择合适的的方式。

真实案例

人工智能助力

M5ATOMS3基础03给ROS1发一个问候(rosserial)

官方代码:

#!/usr/bin/env python
# license removed for brevity
import rospy
from std_msgs.msg import String

def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

这段代码是一个使用Python编写的ROS节点,它可以向ROS网络发布"hello world"消息。

以下是代码的功能解释:

  1. #!/usr/bin/env python:这是一个shebang,用于指定脚本使用的解释器。在这里,它告诉操作系统使用Python解释器来执行这个脚本。
  2. license removed for brevity:这一行被注释掉,表示代码中没有包含任何许可证信息。
  3. import rospy:导入ROS库,用于与ROS系统进行通信。
  4. from std_msgs.msg import String:从ROS标准消息库中导入String消息类型,用于发布和订阅消息。
  5. def talker()::定义一个名为talker的函数,用于发布"hello world"消息。
  6. pub = rospy.Publisher('chatter', String, queue_size=10):创建一个发布者对象pub,用于向ROS网络发布String类型的消息,话题名为"chatter",队列大小为10。
  7. rospy.init_node('talker', anonymous=True):初始化ROS节点,并将其命名为"talker",匿名模式(不需要节点名称)。
  8. rate = rospy.Rate(10):创建一个速率对象rate,以10Hz的频率发布消息。
  9. while not rospy.is_shutdown()::进入一个无限循环,直到ROS节点关闭。
  10. hello_str = "hello world %s" % rospy.get_time():创建一个包含当前时间的字符串变量hello_str,格式为"hello world <当前时间>"。
  11. rospy.loginfo(hello_str):使用ROS的日志系统记录信息,将当前时间字符串打印到日志中。
  12. pub.publish(hello_str):向ROS网络发布当前时间字符串消息。
  13. rate.sleep():等待一段时间,以保持发布频率为10Hz。
  14. if __name__ == '__main__'::检查当前脚本是否作为主程序运行。
  15. try::开始一个异常处理块,用于捕获可能发生的的中断信号。
  16. talker():调用talker函数,开始发布消息。
  17. except rospy.ROSInterruptException::捕获ROS中断信号异常,并在异常处理块中执行pass语句,以忽略异常并继续执行。

总体而言,这段代码创建了一个ROS节点,使用发布者将"hello world"消息发布到名为"chatter"的话题中,并以10Hz的频率进行发布。

修改如上Python代码,不发布字符串,发布浮点数。

#!/usr/bin/env python  
# license removed for brevity  
import rospy  
from std_msgs.msg import Float64  
  
def talker():  
    pub = rospy.Publisher('chatter', Float64, queue_size=10)  
    rospy.init_node('talker', anonymous=True)  
    rate = rospy.Rate(10) # 10hz  
    while not rospy.is_shutdown():  
        hello_float = 3.14  # 定义一个浮点数  
        rospy.loginfo(hello_float)  
        pub.publish(hello_float)  
        rate.sleep()  
  
if __name__ == '__main__':  
    try:  
        talker()  
    except rospy.ROSInterruptException:  
        pass

在上述代码中,发布了浮点数3.14。同时,为了匹配浮点数的数据类型,将消息类型由String改为Float64,并在from std_msgs.msg中导入Float64。相应的,代码中的rospy.loginfo()也记录了这个浮点数。


ros2 run demo_nodes_py talker
ros2 run demo_nodes_py listener


 

 

 

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

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

相关文章

安装typora

1、下载压缩包 链接&#xff1a;https://pan.baidu.com/s/1nFvk3hAyXNbvKPJnu9ipIA 提取码&#xff1a;sdyy 2、安装typora 3、打开Crack 4、将这个dll文件复制粘贴到typora的安装路径里

Linux--进程的新建状态

新建状态&#xff1a; 操作系统创建了进程的内核数据结构&#xff08;task_struct、mm_struct、页表&#xff09;&#xff0c;但是页表没有创建映射关系&#xff0c;而且磁盘里的程序的代码和数据未加载到物理内存

Spring注解系列——@PropertySource

在Spring框架中PropertySource注解是非常常用的一个注解&#xff0c;其主要作用是将外部化配置解析成key-value键值对"存入"Spring容器的Environment环境中&#xff0c;以便在Spring应用中可以通过Value或者占位符${key}的形式来使用这些配置。 使用案列 // Propert…

React 路由使用-详细介绍

路由初使用 抽象路由模块 src\page\Article\index.js const Article () > {return (<div><p>文章页</p></div>); };export default Article;src\router\index.js // 导入页面 import Article from "../page/Article"; import Login fr…

Leetcode 剑指 Offer II 037. 小行星碰撞

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个整数数组 asteroids&#xff0c;表示在同一行的小行星。…

无涯教程-jQuery - Dragable拖动函数

Drag-able 函数可与JqueryUI中的交互一起使用。此函数可在任何DOM元素上启用可拖动功能。无涯教程可以通过使用鼠标单击来拖动可拖动元素。 Drag able - 语法 $( "#draggable" ).draggable(); Drag able - 示例 下面是一个简单的示例&#xff0c;显示可拖动的用法…

【Java面试丨消息中间件】Kafka

一、kafka是如何保证消息不丢失 1. 介绍 使用kafka在消息的收发过程都有可能会出现消息丢失 &#xff08;1&#xff09;生产者发送消息到broker丢失 &#xff08;2&#xff09;消息在broker中存储丢失 &#xff08;3&#xff09;消费者从broker接收消息丢失 2. 生产者发送消…

002-Spring Bean 从扫描到创建

目录 Spring Bean 从扫描到创建扫描流程 class 到 BeanDefinition引入扫描&#xff1a;ClassPathBeanDefinitionScannerdoScanfindCandidateComponents(basePackage)registerDefaultFilters()this.registry 创建流程 BeanDefinition 到 Bean统一 BeanDefinition 类型finishBean…

HTML+CSS+JavaScript:轮播图自动播放

一、需求 轮播图如下图所示&#xff0c;需求是每隔一秒轮播图自动切换一次 二、代码素材 以下是缺失JS部分的代码&#xff0c;感兴趣的小伙伴可以先自己试着写一写 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /&…

【笔记】Java并发编程

Callable 和 Runable Java 8 并发教程&#xff1a;Threads和Executors 原文&#xff1a;Java 8 Concurrency Tutorial: Threads and Executors 译者&#xff1a;BlankKelly 来源&#xff1a;Java8并发教程&#xff1a;Threads和Executors 两种提交方式 submit和execute subm…

【数据结构】带头+双向+循环链表(DList)(增、删、查、改)详解

一、带头双向循环链表的定义和结构 1、定义 带头双向循环链表&#xff0c;有一个数据域和两个指针域。一个是前驱指针&#xff0c;指向其前一个节点&#xff1b;一个是后继指针&#xff0c;指向其后一个节点。 // 定义双向链表的节点 typedef struct ListNode {LTDataType dat…

开发一个RISC-V上的操作系统(五)—— 协作式多任务

目录 往期文章传送门 一、什么是多任务 二、代码实现 三、测试 往期文章传送门 开发一个RISC-V上的操作系统&#xff08;一&#xff09;—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统&#xff08;二&#xff09;—— 系统引导程序&a…

NO4 实验四:生成Web工程

1、说明 使用 mvn archetype&#xff1a;generate 命令生成 Web 工程时&#xff0c;需要使用一个专门的 archetype。这个专门生成 Web 工程骨架的 archetype 可以参照官网看到它的用法&#xff1a; 2、操作 注意&#xff1a;如果在上一个工程的目录下执行 mvn archetype&…

LeetCode208.Implement-Trie-Prefix-Tree<实现 Trie (前缀树)>

题目&#xff1a; 思路&#xff1a; tire树&#xff0c;学过&#xff0c;模板题。一种数据结构与算法的结合吧。 代码是&#xff1a; //codeclass Trie { private:bool isEnd;Trie* next[26]; public:Trie() {isEnd false;memset(next, 0, sizeof(next));}void insert(strin…

第72篇:近年HVV、红队攻防比赛中常见外围打点漏洞的分析与总结

前言 大家好&#xff0c;我是ABC_123。前一段时间我花时间花精力总结了最近两三年中&#xff0c;在攻防比赛中比较常见的Web打点漏洞类型&#xff0c;捎带着把钓鱼邮件的主题类型也总结了一下。今天分享出来&#xff0c;相信无论是对于攻击方还是防守方&#xff0c;都能从中获…

【雕爷学编程】MicroPython动手做(14)——掌控板之OLED屏幕2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Spring学习笔记之spring概述

文章目录 Spring介绍Spring8大模块Spring特点 Spring介绍 Spring是一个轻量级的控制反转和面向切面的容器框架 Spring最初的出现是为了解决EJB臃肿的设计&#xff0c;以及难以测试等问题。 Spring为了简化开发而生&#xff0c;让程序员只需关注核心业务的实现&#xff0c;尽…

从源码角度去深入分析关于Spring的异常处理ExceptionHandler的实现原理

ExceptionHandler的作用 ExceptionHandler是Spring框架提供的一个注解&#xff0c;用于处理应用程序中的异常。当应用程序中发生异常时&#xff0c;ExceptionHandler将优先地拦截异常并处理它&#xff0c;然后将处理结果返回到前端。该注解可用于类级别和方法级别&#xff0c;…

【RabbitMQ】golang客户端教程1——HelloWorld

一、介绍 本教程假设RabbitMQ已安装并运行在本机上的标准端口&#xff08;5672&#xff09;。如果你使用不同的主机、端口或凭据&#xff0c;则需要调整连接设置。如果你未安装RabbitMQ&#xff0c;可以浏览我上一篇文章Linux系统服务器安装RabbitMQ RabbitMQ是一个消息代理&…

STL 关于vector的细节,vector模拟实现【C++】

文章目录 vector成员变量默认成员函数构造函数拷贝构造赋值运算符重载函数析构函数 迭代器beginend size和capacityresizereserve[ ]push_backpop_backinserteraseswap vector成员变量 _start指向容器的头&#xff0c;_finish指向容器当中有效数据的下一个位置&#xff0c;_end…