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 Posedef 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)# 等待服务 /spawnrospy.wait_for_service('/spawn')try:add_turtle = rospy.ServiceProxy('/spawn', Spawn)# 在(5,5)创建一个新的turtleresp = 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)  # 10Hzwhile not rospy.is_shutdown():# 创建一个旋转的动作twist = Twist()twist.linear.x = 0twist.angular.z = 1.0pub.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.hqwc.cn/news/434747.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK8新特性:Stream

Stream 认识Stream 也叫Stream流&#xff0c;是jdk8开始新增的一套API&#xff08;java.util.stream.*&#xff09;&#xff0c;可以用于操作集合或者数组的数据。优势&#xff1a;Stream流大量的结合了Lambda的语法风格来编程&#xff0c;提供了一种更强大&#xff0c;更加简…

微信小程序-04

rpx&#xff08;responsive pixel&#xff09;是微信小程序独有的&#xff0c;用来解决屏适配的尺寸单位。 import 后跟需要导入的外联样式表的相对路径&#xff0c;用 ; 表示语句结束。 定义在 app.wxss 中的样式为全局样式&#xff0c;作用于每一个页面。 在页面的 .wxss 文…

P1045 [NOIP2003 普及组] 麦森数题解

题目 形如的素数称为麦森数&#xff0c;这时P一定也是个素数。但反过来不一定&#xff0c;即如果P是个素数&#xff0c;不一定也是素数。到1998年底&#xff0c;人们已找到了37个麦森数。最大的一个是P3021377&#xff0c;它有909526位。麦森数有许多重要应用&#xff0c;它与…

[网鼎杯 2018]Fakebook1

join一个用户后&#xff0c;点进去发现是这样的 查看这个页面的源代码&#xff0c;发现一个base64编码后的字串 decode之后就是我们join新用户时填入的blog网址 那我们是不是可以通过填入存储flag的地址&#xff0c;从而回显出来呢&#xff1f;当然&#xff0c;先按照常规sqli…

python学习20

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

flask_apscheduler源码分析

前言 遵循flask框架的标准的库&#xff0c;称为flask扩展&#xff0c;flask_apscheduler模块就是一个flask扩展&#xff0c;它使用了flask编程上下文&#xff0c;同时内部完全依赖apscheduler。 我近期使用flask_apscheduler遇到了一个所有job全部死亡的bug。现象&#xff1a;j…

【Linux工具篇】Linux项目自动化构建工具make/Makefile

目录 背景 make/makefile怎样完成项目 完成原理 依赖关系 依赖方法 项目清理 执行顺序 Q1&#xff1a;makefile对最新可执行程序不会默认重新生成 Q2&#xff1a;Q1是怎样做到的 规范的makefile 背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成…

搜狐新闻客户端使用Kotlin之后对JSON解析框架的探索

本文字数&#xff1a;7488字 预计阅读时间&#xff1a;45分钟 01 引言 自2017年Google发布Kotlin语言之后&#xff0c;Android开发由原来的Java开始向Kotlin过度&#xff0c;目前绝大部分Android开发岗位基本要求就是熟练使用Kotlin。事实上&#xff0c;很多有着多年历史的项目…

Qt使用中文字符串乱码的问题

文章目录 vs编译器下第一种解决方式第二种解决方式 Qt编译器下 我们在使用qt的时候有时候会遇到打印中文字符串的时候出现中文乱码的问题&#xff0c;主要是由于Qt的QString字符串存储的方式是使用utf-8的编码方式&#xff0c;如果我们本地的文件是使用GBK方式的编码再使用中文…

osgEarth真HelloWorld

osgEarth真HelloWorld vcpkg installtests vcpkg install osgEarth安装指南 https://docs.osgearth.org/en/latest/install.html&#xff0c; 预先设置ports/osg/portfile.cmake GL3 否则调用osg相关功能时会出现如下提示 OpenSceneGraph does not define OSG_GL3_AVAILABLE; …

Factor Transfer(NeurIPS 2018)

paper&#xff1a;Paraphrasing Complex Network: Network Compression via Factor Transfer official implementation&#xff1a;https://github.com/Jangho-Kim/Factor-Transfer-pytorch 背景 尽管现有的知识蒸馏方法如KD、FitNet等带来了性能的改善&#xff0c;但直接传…

element plus使用问题

文章目录 element plusvue.config.js注意1、有时候会报错 not a function2、使用 ElMessage 报错3、 element plus 版本过高4、警告Feature flag VUE_PROD_HYDRATION_MISMATCH_DETAILS is not explicitly defined.5、报错 ResizeObserver loop completed with undelivered noti…