Linux-ROS学习之旅-话题编程(二)

##承接上一篇文章的知识,有下面的实例操作

通过代码新生一个海龟,放置在(5,5)点,命名为turtle2,通过代码订阅turtle2的实时位置并打印在终端,控制turtle2实现旋转运动

步骤:

1.创建一个工作空间和一个功能包,功能包的依赖有rospy turtlesim在功能包里面的src文件创建.py文件用于编写代码,代码如下

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import rospy
from turtlesim.srv import Spawn
from geometry_msgs.msg import Twist
from turtlesim.msg import Pose

def pose_callback(pose):
    rospy.loginfo("Turtle2's position: x=%f, y=%f", pose.x, pose.y)

def turtle_mover():
    rospy.init_node('turtle_mover', anonymous=True)

    # 等待服务 /spawn
    rospy.wait_for_service('/spawn')
    try:
        add_turtle = rospy.ServiceProxy('/spawn', Spawn)
        # 在(5,5)创建一个新的turtle
        resp = add_turtle(5.0, 5.0, 0, 'turtle2')
    except rospy.ServiceException as e:
        rospy.logerr("Service call failed: %s", e)

    # 订阅turtle2的位置
    rospy.Subscriber('/turtle2/pose', Pose, pose_callback)

    # 发布turtle2的速度控制
    pub = rospy.Publisher('/turtle2/cmd_vel', Twist, queue_size=10)
    rate = rospy.Rate(10)  # 10Hz

    while not rospy.is_shutdown():
        # 创建一个旋转的动作
        twist = Twist()
        twist.linear.x = 0
        twist.angular.z = 1.0
        pub.publish(twist)
        rate.sleep()

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

2.使脚本可执行

chmod +x ~/<workspace_name>/src/<pkg_name>/src/turtle_mover.py

 这个很重要啊,当你运行rosrun命令提示找不到功能包时大概率就是因为这一步没有配置成功

3.构建和编译包

cd ~/catkin_ws
catkin_make
source devel/setup.bash

4.启动roscore

5.打开一个新终端,启动turtlesim

rosrun turtlesim turtlesim_node

6.运行脚本

rosrun turtle_control turtle_mover.py

如果成功的话,会有下面的情形:

来自GPT4的代码解释

当然,我会逐行解释您提供的代码。这是一个ROS(Robot Operating System)脚本,用于在`turtlesim`环境中创建并控制一个虚拟的海龟。

```python
#!/usr/bin/env python3
```
这是一个shebang行,告诉系统使用env程序来查找Python 3解释器的位置,从而运行这个脚本。它确保了脚本在不同的环境中可以找到正确的Python解释器。

```python
# -*- coding: utf-8 -*-
```
这行指定了文件的编码格式为UTF-8。这对于在脚本中包含非ASCII字符(如中文注释)是必要的。

```python
import rospy
```
导入`rospy`模块,这是ROS Python客户端库,用于编写ROS节点。

```python
from turtlesim.srv import Spawn
```
从`turtlesim`包导入`Spawn`服务类型。`Spawn`服务用于在`turtlesim`模拟器中创建新的海龟。

```python
from geometry_msgs.msg import Twist
```
从`geometry_msgs`包导入`Twist`消息类型。这种类型通常用于表示速度和旋转。

```python
from turtlesim.msg import Pose
```
从`turtlesim`包导入`Pose`消息类型。它包含了一个海龟的位置和方向信息。

```python
def pose_callback(pose):
    rospy.loginfo("Turtle2's position: x=%f, y=%f", pose.x, pose.y)
```
定义了一个回调函数`pose_callback`,它将在每次收到`turtle2`的位置更新时被调用。它接收一个`Pose`消息作为参数,并打印海龟的位置。

```python
def turtle_mover():
```
定义了主要功能的函数`turtle_mover`。

```python
rospy.init_node('turtle_mover', anonymous=True)
```
初始化一个ROS节点,名为`turtle_mover`。`anonymous=True`意味着节点名称将被随机数修改,以确保唯一性。

```python
rospy.wait_for_service('/spawn')
```
在继续之前,等待`/spawn`服务变得可用。

```python
try:
    add_turtle = rospy.ServiceProxy('/spawn', Spawn)
```
尝试创建一个服务代理`add_turtle`,用于调用`/spawn`服务,这个服务使用`Spawn`服务类型。

```python
resp = add_turtle(5.0, 5.0, 0, 'turtle2')
```
使用`/spawn`服务在坐标(5, 5)处创建一个新的海龟,命名为`turtle2`。

```python
except rospy.ServiceException as e:
    rospy.logerr("Service call failed: %s", e)
```
如果在调用服务时出现异常,打印错误消息。

```python
rospy.Subscriber('/turtle2/pose', Pose, pose_callback)
```
创建一个订阅者,订阅`/turtle2/pose`主题,接收`Pose`消息,并指定`pose_callback`作为回调函数。

```python
pub = rospy.Publisher('/turtle2/cmd_vel', Twist, queue_size=10)
```
创建一个发布者`pub`,用于发布到`/turtle2/cmd_vel`主题,消息类型为`Twist`,用于控制海龟的移动。

```python
rate = rospy.Rate(10)  # 10Hz
```
设置一个频率为10Hz的速率对象`rate`。

```python
while not rospy.is_shutdown():
```
在ROS没有关闭的情况下,循环执行以下代码块。

```python
twist = Twist()
twist.linear.x = 0
twist.angular.z = 1.0
pub.publish(twist)
```
创建一个`Twist`消息`twist`,设置线速度为0和角速度为1.0,然后发布这个消息到`/turtle2/cmd_vel`主题,使海龟旋转。

```python
rate.sleep()
```
在循环的每次迭代后休眠,以保持循环以10Hz

的频率运行。

```python
if __name__ == '__main__':
    try:
        turtle_mover()
    except rospy.ROSInterruptException:
        pass
```
当脚本被直接运行时,执行`turtle_mover()`函数。如果在运行过程中遇到`rospy.ROSInterruptException`(例如,用户按Ctrl+C),则安静地退出程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【GitHub项目推荐--30 天学会XXX(HTML/React/Python/JavaScript)】【转载】

30 天学会 React 这个项目是《30 天 React 挑战》&#xff0c;是在 30 天内学习 React 的分步指南。它需要你学习 React 之前具备 HTML、CSS 和 JavaScript 知识储备。 除了 30 天学会 React&#xff0c;开发者还发布过 30 天学会 JavaScript 等项目。 开源地址&#xff1a;…

MySQL数据操纵语言DML

MySQL数据操纵语言DML(SELECT,UPDATE,INSERT INTO,DELETE) 目录 MySQL数据操纵语言DML(SELECT,UPDATE,INSERT INTO,DELETE)DML关键字数据操纵语言DML1.查表2.插入数据3.更新数据4.删除数据 DML关键字 DML关键字含义SELECT从数据库中检索数据INSERT INTO向数据库表中插入新的行…

什么是协方差矩阵?

协方差矩阵&#xff08;Covariance Matrix&#xff09;是一个用于衡量多个变量之间相互关系的工具&#xff0c;在统计学和数据分析领域中非常重要。这个矩阵展现了每一对变量之间的协方差。协方差是衡量两个变量如何一起变化的度量&#xff1b;如果两个变量的协方差是正的&…

基于springboot+vue的美容院管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

运维SRE-01 目录结构体系、find

1. Linux目录结构体系 Linux 核心目录的核心文件概述 1&#xff09; /etc下面 a) /etc/hosts 主机ip地址与域名(主机名)对应关系 b&#xff09; /etc/hostname 主机名 c) /etc/sysconfig/network-scripts/ifcfg-ens33或ifcfg-eth0 Linux网卡配置文件 d&#xff09;了解 /etc/i…

12.6管道流(血干JAVA系列)

管道流 12.6管道流基础概念【例12.34】验证管道流 12.6管道流 基础概念 管道流的主要作用是可以进行两个线程间的通信&#xff0c;如图12-9所示&#xff0c;分为管道输出流(PipedOutputStream)、管道输入流(PipedlnputStream)。如果要想进行管道输出&#xff0c;则必须把输出…

基于蛙跳优化的神经网络数据预测matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 通过蛙跳优化算法&#xff0c;优化神经网络的权值参数&#xff0c;然后使用优化后的神经网络模型对数据进行预测&#xff0c;输出预测曲线。 2.测试软件版本以及…

2024 年 eBPF 和网络趋势预测

本文地址&#xff1a;2024 年 eBPF 和网络趋势预测 | 深入浅出 eBPF 1. eBPF 1.1 eBPF 将继续呈指数增长1.2 eBPF 应用市场1.3 eBPF 在手机中得到更广泛的应用1.4 eBPF 滥用带来的风险2. 可观测 2.1 最受欢迎的可观测性2.2 降低可观测性开销2.3 上下文感知的 Kubernetes 工作负…

多数据源组件dynamic-datasource使用总结

简介 dynamic-datasource-spring-boot-starter 是一个基于springboot的快速集成多数据源的启动器。 其支持 Jdk 1.7, SpringBoot 1.5.x 2.x.x 3.x.x。 特性 支持 数据源分组 &#xff0c;适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库敏感配置信息 加密…

matlab基本操作

目录 1 清空workspace 2 清空命令行窗口 3 求字符的ASCII码 4 矩阵的表示 5 矩阵的转置 6 按列输出 7 求逆矩阵 8 创建零矩阵 9 生成随机数 10 生成空数组 11 生成单位矩阵 12 生成幻方矩阵 13 结构体 14 重复 15 点乘与叉乘 16 寻找符合条件的元素…

Hadoop, HIve, Spark关系简述

大数据∈数据管理系统的范畴 数据管理系统&#xff1a; 数据怎么存&#xff1f;数据怎么算&#xff1f; 单机数据管理时代下&#xff0c; 数据处理的任务&#xff1a;IO密集型&#xff1b; 数据存不下&#xff1f; HDFS用于存放多机器的数据并提供相关Api接口。 HDFS中引入了…

146基于matlab的齿轮非线性动力学

基于matlab的齿轮非线性动力学&#xff0c;绘出系统状态变量随参数变化分岔图&#xff0c;绘图参数对应的系统各周期及混沌状态的时间历程图、相轨迹图、Poincare映射图&#xff0c;程序已调通&#xff0c;可直接运行。 146 matlab 齿轮非线性动力学 相图 (xiaohongshu.com)

【前端web入门第二天】01 html语法实现列表与表格_合并单元格

html语法实现列表与表格 文章目录: 1.列表 1.1 无序列表1.2 有序列表1.3 定义列表 2.表格 2.1 表格基本结构2.2 表格结构标签2.3 合并单元格 写在最前,第二天学习目标: 列表 表格 表单 元素为嵌套关系 1.列表 作用:布局内容排列整齐的区域。 列表分类:无序列表、有序列表…

【leetcode题解C++】101.对称二叉树 and 111.二叉树的最小深度 and 222.完全二叉树的节点个数 and 110.平衡二叉树

101. 对称二叉树 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 思路&#xff1a…

2023启示录|虚拟人这一年

图片&#xff5c;《银翼杀手 2049》剧照 作者丨程心 编辑丨罗辑 2023 年&#xff0c;大模型 “救活” 了很多行业&#xff0c;其中最为反转的&#xff0c;就是把虚拟数字人&#xff08;以下简称虚拟人&#xff09;从活死人墓里拉了出来。 还没开年&#xff0c;在 2022 年火…

python_ACM模式《剑指offer刷题》链表3

题目&#xff1a; 注意&#xff1a; 剑指offer上对这道题目的描述是给定的删除节点是节点指针。这表明这道题可以用时间复杂度为O(1)的方式解决。 而leetcode上对类似本题的描述是&#xff1a; 给定删除节点是节点值&#xff0c;这决定了本题时间复杂度必然至少为O(N)。因为…

PINN物理信息网络 | 全局自适应物理信息神经网络SA-PINN

概述 本文提出的自适应加权方法在于权重适用于不同损失组件中的个别训练点,而不是整个损失组件。之前的方法可以被看作是这个方法的一个特例,当所有针对特定损失组件的自适应权重同时更新时。在之前的方法中,独立开发的极小极大加权方案[16]与SA-PINNs最为相近,因为它也通过…

SpringCloud--FeignGateWay

Feign 创建项目勾选web SpringWeb 1.0 创建生产者SpringCloudFeignProvider 端口号:8081 pom.xml引入依赖 <!--nacos依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery<…

语义分割(3):损失函数解析

文章目录 1. 常见语义分割损失1.1 Cross Entropy1.2 dice Loss1.2.1 为什么使用Dice loss1.2.2 公式1.2.3 Dice loss 和 F1-score代码 1.3 focal loss1.3.1 公式&#xff1a;1.3.2 代码 2. 语义分割损失应用参考 语义分割任务实际上是一种像素层面上的分类&#xff0c;需要识别…

回归预测 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多输入单输出回归预测

回归预测 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SSA-SVR麻雀算法优化支持向量机的数据多输入单输出回归预测预测效果基本描述程序设计参考资料 预测效果 基本描述 1.Matlab基于SSA-SVR麻雀算法优化支持向量机的数据…