首页 > 其他分享 >十一放假不停歇—学习ROS第三天

十一放假不停歇—学习ROS第三天

时间:2024-10-06 23:18:25浏览次数:8  
标签:count url self 停歇 download world ROS def 放假

1.继承

第一步:

我们如果定义的类比较多,这里就会运用到子类继承父类的编程语言了,

我们首先在包(demo_python_pkg)下面创建一个新的文件命名为write_node这个节点,开始写里面的程序,我们发现确实比较简略,

from demo_python_pkg.person_node import PersonNode #从包的节点文件中导入这个文件的类函数
class WriteNode(PersonNode):     #新定义一个类,括号是父类,引用他里面所有的东西,省去很多步骤
    def __init__(self,book:str) -> None:  #类初始化,定义一些参数
        self.book=book                   #把属性值赋予它
        
    def eat( self,food_name:str):     #定义一个类方法
        print(f"{self.name},{self.age}岁,爱吃{food_name}")
def main():                           #定义一个函数
    node = WriteNode('王五')     #引用类里面的属性赋予一个实例
    node.eat('大蜂蜜')               # 引用类里面的方法赋予一个实例

这是程序代码以及我个人理解的标注

第二步:

写完这个程序,到setup中,把节点Node写入里面

第三步: colcon build下

运行结果如下图所示:

我们发现说找不到这个包,那么我们可以source一下,就可以了,

得添加环境变量。

所以运行结果如下  source install/setup.bash

对于父类来讲其实这是没有问题的,但是子类就会有问腿,让我们一次来解决这个问题。

按住Ctrl+这个文件直接就会跳转

在里面添加父类的属性,然后super.__init__(里面的属性)。就可以完成初始化。

 

是super().__init__(里面的属性)

总结一下在这个‘包里面→新建文件节点名字→在里面写程序→setup→节点名=包.节点:函数’,

→在终端里colcon build下→ros2 run 包名 节点名就可以实现你想要的功能了

子类里面要记住 初始化那里和super那里原来的属性

成功了,感觉是有个优先级之分的,所以把上面的那个删了剩图片中的就可以运行了 。

这个图片很关键,包括步骤,包括定义节点

这里再说下 继承的这段代码,super()这里的话,初始化的属性是父类的属性,即里面括号的属性

然后再def __init__(),括号里面也要写上父类的属性,子类的话再最后写上你的子类属性

要在src下弄!!

如何把这个person和write变成这个ros中的节点。

让你的类继承Node这个类

运行出错,错在哪里呢?看

就是节点这里要记住只能是(a-z),(A-Z)以及(0-9)。

修改后运行一遍

还有错误?

继续修改

好了,实现了!,加油同学们,

这里赋上一句这里的话,学习是可控的,我们要多做一些可控的事情,想要走万里路,走得更远,必须下一些苦功夫,必须在吃的苦头比别人多,这也是很多创业者的必备因素,人生中有很多需要学习的地方,人的出生是一无所知的,学习是为了填充智慧,限制你内心的狂妄感,任何事情都需要去学习要保持强烈的好奇心,持续自律的学习力,趁年轻给自己一片方土,踏踏实实一直学习,学到老,才能活到老!

好了,在这里我们ctrl+5看一下ROS2节点都有哪些?

看到了

import rclpy
from rclpy.node import Node

    def __init__(self,node_name:str,name:str,age:int) -> None:  #定义的属性
        super().__init__(node_name)

self.get_logger().info(f"{self.name},{self.age}岁,爱吃{food_name}")
def main():
    rclpy.init()

    rclpy.spin(node)
    rclpy.shutdown()

一共是添加了这些东西。

好的,那么这个父类成功了,子类变成节点应该怎么做呢?我们大概一想其实和父类基本一样,但你看到了我这个出现错误了,马虎了,告诉你,但你知道马虎在哪里吗?

修改之后程序与运行结果!成功

节点名字为readbook

2. 多线程与回调函数

import threading      导入多线程数据库
import requests     导入用于发送HTTP请求
class Download:   定义这个类 
    def download(self,url,callback_world_count):    参数有url callback_world_count
        print(f"线程:{threading.get_ident()} 开始下载:{url}")    
        response = requests.get(url)        获得请求
        response.encoding='utf-8'      文本编码
        callback_world_count(url,response.text)  
    def start_download(self,url,callback_world_count):
        thread = threading.Thread(target=self.download,args=(url,callback_world_count))
        thread.start()

def world_count(url,result):
    print(f"{url}:{len(result)}->{result[:5]}")
def main():
    download = Download()
    download.start_download('http://0.0.0.0:8000/novel1.txt',world_count)
    download.start_download('http://0.0.0.0:8000/novel2.txt',world_count)
    download.start_download('http://0.0.0.0:8000/novel3.txt',world_count)

以下是这段代码的下详细解释:
import threading
import requests

- `threading`:这是Python的标准库模块,用于提供线程相关的操作。
- `requests`:这是一个非常流行的第三方库,用于发送HTTP请求。它允许你轻松地发送HTTP/1.1请求而无需手动添加查询字符串或编码。

def download(self, url, callback_world_count):
    print(f"线程:{threading.get_ident()} 开始下载:{url}")
    response = requests.get(url)
    response.encoding = 'utf-8'
    callback_world_count(url, response.text)

- `download`方法接受三个参数:`url`是要下载的网页地址,`callback_world_count`是一个回调函数,用于处理下载后的数据。
threading.get_ident()`返回当前线程的唯一标识符。
 requests.get(url)`发送一个HTTP GET请求到指定的URL。
- `response.encoding = 'utf-8'`设置响应内容的编码为UTF-8,以确保正确地处理文本。
- `callback_world_count(url, response.text)`调用回调函数,并将URL和响应的文本内容作为参数传递。


def start_download(self, url, callback_world_count):
    thread = threading.Thread(target=self.download, args=(url, callback_world_count))
    thread.start()
```

`start_download`方法接受两个参数:`url`和`callback_world_count`。
`threading.Thread`创建了一个新的线程对象。`target=self.download`指定新线程将执行`Download`类的`download`方法。`args=(url, callback_world_count)`是一个元组,包含了传递给`download`方法的参数。
`thread.start()`启动新创建的线程。

### 定义`world_count`函数
def world_count(url, result):
    print(f"{url} 字符数:{len(result)} -> 开头内容:{result[:5]}")

- `world_count`是一个回调函数,它接受两个参数:`url`和`result`。
- `len(result)`计算结果字符串的长度。
- `result[:5]`获取结果字符串的前5个字符。
- 函数打印出URL、结果字符串的长度和结果字符串的前5个字符。


def main():
    download = Download()
    download.start_download('', world_count)
    download.start_download('', world_count)
    download.start_download('', world_count)
```

- `main`函数是程序的入口点。
- 创建`Download`类的实例。
- 调用`start_download`方法三次,每次都会创建一个新的线程来下载数据,并在下载完成后调用`world_count`函数。


if __name__ == '__main__':
    main()

### 注意事项

以上就是这段代码的详细解释。

自建库,生成网站

3.1 话题通信介绍

这里以运行小海龟的示例做解释

查看列表都有哪些 ros2 node list 

查看这个节点的信息: ros2 node info +节点名  例如ros2 node info /turtlesim 

这里的 turtle1/cmd_vel: (订阅话题的名字)geometry_msgs/msg/Twist (订阅话题的类型)

发布的话题名字和类型  使用ros2 topic --help 查看话题信息先查看都有哪些

那就使用ros2 topic echo +话题名字


把那个:去掉

这里对于话题的信息进行分析,x与y是指xy的坐标值

theta:脑袋朝向的弧度不是角度哦,最大值到Πpai,linear_velocity是指线速度,angular_velocity是指角速度。直线和旋转的角速度。逆时针大于0,顺时针小于0

查看这个话题的基本信息,查看话题哦的接口(是什么类型的),几个发布者,几个订阅者。

ros2 interface show  geometry_msgs/msg/Twist
查看这个接口的定义,发现由linear和angular组成的

ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 1,y: 0.3},angular: {z: 0.1}}"
意思是ros2 话题 发布 话题名称 话题接口 “{数据信息}”

注意:只要是有等级的就用{},然后冒号后面注意空格 

那么就会自动动起来,就像我们之前用的键盘命令差不多。

ros2 run turtlesim turtle_teleop_key

后退加个负号 改变发布者的频率 可以用这个命令 ros2 topic pub --help

默认是1.

明天早点来,中午还是睡吧 然后把效率提高下,很多东西还没学完,但慢慢来,效率要高

标签:count,url,self,停歇,download,world,ROS,def,放假
From: https://blog.csdn.net/2302_81479776/article/details/142700707

相关文章

  • ROS基础入门——实操教程
    ROS基础入门——实操教程前言本教程实操为主,少说书。可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细繁杂了,看得脑壳疼,于是做了这个笔记。RubyRose,放在这里相当合理本文初编辑于2024年10月4日CSDN主页:https://blog.csdn.net/rvdgdsva博客园主页......
  • ROS报错The target name "test" is reserved when CTest testing is enabled
    ROS报错“Thetargetname“test“isreservedwhenCTesttestingisenabled”注意:现有特殊情况,可执行文件名可以为test,但是映射名称不可以为test。一般认为,可执行文件名和映射名称同名。因为映射名称不可命名为test,故可执行文件最好不要命名为test。纠正:ROS遇到的问题......
  • ROS基础入门——实操教程3C
    合集-Ubuntu强化学习合集(3)1.命令行gcc-v和g++-v输出版本不一致09-272.crypt.h:Nosuchfileordirectory报错处理09-283.ROS基础入门——实操教程10-04收起ROS基础入门——实操教程前言本教程实操为主,少说书。可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细......
  • 2024.10.4 ROS第五章结束,复习背包问题模型 + codeforces刷刷题
    项目学习总结ROS第五章主要是学习了坐标变换,实际用途还是好理解的,比方说地面基地控制无人机追鸟。坐标变换主要是用tf这个包实现的。可以实现静态坐标变换,动态坐标变换和多坐标变换。静态和动态变换的关键函数:ps_out=buffer.transform(ps,"base_link");动态变换里面主要是......
  • ROS基础入门——实操教程
    ROS基础入门——实操教程前言本教程实操为主,少说书。可供参考的文档中详细的记录了ROS的实操和理论,只是过于详细繁杂了,看得脑壳疼,于是做了这个笔记。RubyRose,放在这里相当合理前言:本文初编辑于2024年10月24日CSDN主页:https://blog.csdn.net/rvdgdsva博客园主页:https://......
  • Windows11系统Microsoft.Build.Engine.dll文件丢失问题
    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个Microsoft.Build.Engine.dll文件(挑选合适的......
  • ubuntu18安装ros
    一、环境配置我的环境:Ubuntu18.04+melodicUbuntu对应的ROS版本:二、安装步骤1.添加ROS软件源输入命令:$sudosh-c'echo"debhttp://packages.ros.org/ros/ubuntu$(lsb_release-sc)main">/etc/apt/sources.list.d/ros-latest.list'2.添加密钥输入命令:$sudoapt-......
  • Office for Mac升级提醒如何去掉?关闭Microsoft AutoUpdate弹框提示
    macOS安装MicrosoftOfficeforMac之后,有时候会弹出MicrosoftAutoUpdate微软应用自动更新工具。今天就给弹出来,就像下面这样:(我不知道您会不会烦,我是烦了)如果您也和我一样,不喜欢这样不经过允许就自动弹框的提示,可以按如下方式来安排。方法一:设置权限不可访问打开终端......
  • 常见问题解决 --- 如何解决CROS跨域问题
    问题原因:前后端不是一个服务导致的浏览器禁止访问的安全问题。比如前端部署在http://x.x.x.x:8888,后端部署在http://x.x.x.x:9999,由于端口不一致,浏览器安全起见不允许一个web页面有不同ip或端口的地址发送出流量。在开发者工具可以看出CROS错误。解决办法:关闭浏览器安全策......
  • 微软远程连接工具:Microsoft Remote Desktop for Mac 中文直装版
    MicrosoftRemoteDesktop是一款由微软开发的远程桌面连接工具,允许用户远程访问和控制另一台计算机。它支持Windows、macOS、iOS和Android等多种操作系统,提供了灵活的远程工作解决方案,非常适合需要在不同位置访问工作计算机的用户。主要功能:远程访问:用户可以通过互联网或......