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

news2024/11/16 19:39:23

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

通过代码新生一个海龟,放置在(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),则安静地退出程序。

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

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

相关文章

可以实时监控电脑的软件有哪些?好用的四款电脑监控软件【高人气收藏分享】

在当今数字化时代&#xff0c;电脑已经成为我们工作和生活中不可或缺的工具。然而&#xff0c;有时候我们需要对电脑进行监控&#xff0c;以确保工作效率和保护个人隐私。因此&#xff0c;选择一款好的电脑监控软件非常重要。本文将介绍四款好用的电脑监控软件&#xff0c;并探…

行测-资料:1. 速算技巧、基期与现期

1、速算技巧 1.1 截位直除 1.1.1 截位 1.1.2 截谁 1.1.3 截几位 选项差距大&#xff1a; 四个选项首位均不同首位相同&#xff0c;第二位差大于首位 选项差距小&#xff1a; 首位相同且第二位差小于等于首位 例子 C&#xff0c;截两位。 C&#xff0c;截两位。 B&#xff0c;截…

第十七讲_HarmonyOS应用开发Stage模型应用组件

HarmonyOS应用开发Stage模型应用组件 1. 应用级配置2. Module级配置3. Stage模型的组件3.1 AbilityStage3.1.1 AbilityStage的创建和配置3.1.2 AbilityStage的生命周期回调3.1.3 AbilityStage的事件回调&#xff1a; 3.2 UIAbility3.2.1 UIAbility生命周期3.2.3 UIAbility启动模…

mysql INSERT数据覆盖现有元素(若存在)

INSERT...ON DUPLICATE KEY UPDATE的使用 如果指定了ON DUPLICATE KEY UPDATE&#xff0c;并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值&#xff0c;则会更新ON DUPLICATE KEY UPDATE关键字后面的字段值。 例如&#xff0c;如果列a被定义为UNIQUE&#xff0…

P1226 【模板】快速幂题解

题目 给你三个整数a,b,p&#xff0c;求 mod p。 输入输出格式 输入格式 输入只有一行三个整数&#xff0c;分别代表a,b,p。 输出格式 输出一行一个字符串a^b mod ps&#xff0c;其中a,b,p分别为题目给定的值&#xff0c;s为运算结果。 输入输出样例 输入样例 2 10 9 …

三角函数、反三角函数

一、三角函数 二、反三角函数&#xff1a;已知三角函数值&#xff0c;反算角度大小 因为严格单调函数才有反函数一个y对应一个x&#xff0c;显然ysinx&#xff0c;ycosx&#xff0c;ytanx在其定义域并不是严格单调&#xff0c;所以需要人为划定范围。 1. 研究yarcsinx、yarcco…

第十六回 花和尚单打二龙山 青面兽双夺宝珠寺-FreeBSD基本操作:查找程序和文件的路径

杨志最终没有跳崖而是怅然下了冈子。那十四个人醒来&#xff0c;后悔没有听杨志的话&#xff0c;现在事情已经发生了&#xff0c;大家只好商量把所有的错推到杨志身上&#xff0c;说他和强盗合伙劫了生辰纲。 杨志到酒店吃酒没钱付账&#xff0c;跟店家打起来&#xff0c;却原…

编写nginx脚本,安装失败

这是我写的nginx脚本-&#xff08;正确的&#xff0c;已经修改过的&#xff09; 这是我在运行脚本是出现的问题 这是我在nginx官网上粘贴的内容&#xff0c;请注意我用红笔画的地方&#xff0c;与第一张我写的脚本图片作对比&#xff0c;会发现多出现两个转义符号\。第二幅图就…

mysql连接查询,备忘

mysql连接查询 在MySQL数据库查询中&#xff0c;经常会使用到多表查询&#xff0c;本篇介绍mysql中的内连接&#xff0c;左连接&#xff0c;右连接。 用作备忘。 使用两个简单的数据表做展现。 表A AidAvalue1a0012a0023a0034a0045a005 表B BidBvalue1b0012b0023b0034b0046b…

Acwing-语法基础练习

目录 1. 非常基础的C (面向程序) 框架 2. 一些基础数据类型 3.变量的输入输出 4.ACWing题库-第1题&#xff1a;AB 5.四则运算(只整理一部分较难的) 6.数据类型转换 寒假自学用,记录Acwing题目。 语言&#xff1a;C 1. 非常基础的C (面向程序) 框架 #include <iostre…

Android13系统导航栏添加隐藏导航栏功能按钮

最近有个项目&#xff0c;客户要求在底部导航栏中添加一个可以隐藏整个导航栏的功能按钮&#xff0c;效果如下图&#xff1a; 具体方法如下&#xff1a; 1. 在frameworks/base做如下修改&#xff1a; diff --git a/packages/SystemUI/res/layout/navigation_bar.xml b/packag…

后端学习:数据库MySQL学习

数据库简介 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。   接下来&#xff0c;我们来学习Mysql的数据模型&#xff0c;数据库是如何来存储和管理数据的。在介绍 Mysql的数据模型之前&#xff0c;需要先了解一个概念&#xf…

YOLO自制数据集及训练

使用 Make Sense 网站进行标注 https://www.makesense.ai/可以让AI帮你先标一下 一定要点一下 + ,不然不会加进去 导出标签

混淆矩阵、准确率、查准率、查全率、DSC、IoU、敏感度的计算

1.背景介绍 在训练的模型的时候&#xff0c;需要评价模型的好坏&#xff0c;就涉及到混淆矩阵、准确率、查准率、查全率、DSC、IoU、敏感度的计算。 2、混淆矩阵的概念 所谓的混淆矩阵如下表所示&#xff1a; TP:真正类&#xff0c;真的正例被预测为正例 FN:假负类&#xf…

OSI七层模型 | TCP/IP模型 | 网络和操作系统的联系 | 网络通信的宏观流程

文章目录 1.OSI七层模型2.TCP/IP五层(或四层)模型3.网络通信的宏观流程3.1.同网段通信3.2.跨网段通信 1.OSI七层模型 在计算机通信诞生之初&#xff0c;不同的厂商都生产自己的设备&#xff0c;都有自己的网络通讯标准&#xff0c;导致了不同厂家之间各种协议不兼容&#xff0…

Linux文本三剑客---grep

grep&#xff08;从文本或字符串种过滤特定内容。&#xff09; 格式&#xff1a;Usage: grep [OPTION]... PATTERNS [FILE]... 常用选项&#xff1a; -E 等价于 egrep 扩展正则 -i 忽略大小写 -w 匹配单词 -o 仅显示匹配内容 -r 递归匹配 -c 统计匹配的行数 -v 取反 -n 行号 -A…

ABAP 状态栏排除某些按钮

ABAP 状态栏排除某些按钮 GUI State状态栏 在状态栏这里有这些按钮&#xff0c;现在在导出界面要排除掉这些按钮&#xff1a; 将要排除的按钮追加到gt_code内表&#xff1a; gt_fcode功能码内表的定义 DATA:gt_fcode TYPE TABLE OF sy-ucomm,完整程序 *&---------…

SpringBoot不同的@Mapping使用

文章目录 一、介绍二、使用 一、介绍 一般Mapping类注解在Spring框架中用于将HTTP请求映射到对应的处理器方法。它们各自对应于不同类型的HTTP方法&#xff0c;主要用于RESTful Web服务中。以下是每个注解的作用&#xff1a; GetMapping: 用于映射HTTP GET请求到处理器方法。通…

Android读写文件,适配Q以上

Android Q升级了文件系统&#xff0c;访问文件不仅仅是说动态权限了&#xff0c;有各种限制。权限什么的就不赘述了&#xff0c;下面介绍一下在10以上的系统中访问文件。 首先是打开文件管理器 /*** 打开文件管理器 存储卡和外接U盘都可以访问*/public void openFileManager()…

【揭秘】ForkJoinTask全面解析

内容摘要 ForkJoinTask的显著优点在于其高效的并行处理能力&#xff0c;它能够将复杂任务拆分成多个子任务&#xff0c;并利用多核处理器同时执行&#xff0c;从而显著提升计算性能&#xff0c;此外&#xff0c;ForkJoinTask还提供了简洁的API和强大的任务管理机制&#xff0c…