ROS+python控制小乌龟走方形的实现rospy

2023-05-16

常见的简陋的控制乌龟行走方形的方式很简单,例如:

代码有些地方是测试用的,可以不要。

#! /usr/bin/env python
 
from pickle import TRUE
import rospy
from turtlesim.msg import Pose
from geometry_msgs.msg import Twist
from rospy.timer import Timer
 
 
PI=3.141592653
turn=True
twist=Twist()
def subCallback(pose):
 
    rospy.loginfo("come into subCallback!%f",pose.x)
    
 
def timeCallback(event):
 
    pub=rospy.Publisher("turtle1/cmd_vel",Twist,queue_size=1)
    global turn
    if turn:
        twist.linear.x=1
        twist.angular.z=0.0
        turn=False
    else:
        twist.linear.x = 0
        twist.angular.z = 1*PI/2
        turn=TRUE
    pub.publish(twist)
 
if __name__=="__main__":
 
 
    rospy.init_node("go_square")
 
    sub = rospy.Subscriber("turtle1/pose", Pose, subCallback, queue_size=10)
 
    rospy.Timer(rospy.Duration(1),timeCallback, oneshot=False)
 
 
    rospy.spin()
 
    
    pass

用rospy.Timer每隔一段固定时间改变乌龟策略,在行进和转弯中进行改变。这样的代码可能受硬件和线程影响较大,画出的方形比较粗糙。如下图:

 

当然,不用rospy.Timer也可以实现,但总感觉画的不踏实,比较有偶然性。

下边是模仿ROS自带的乌龟走方形的框架,利用Python写的,这样对乌龟的控制比较强,效果比较好。代码如下:

#! /usr/bin/env python
 
from genpy.message import fill_message_args
import rospy
from turtlesim.msg import Pose
from geometry_msgs.msg import Twist
from rospy.timer import Timer
from math import cos, fabs, sin
from enum import Enum
 
State=Enum('State',('MOVE','STOP_MOVE','TURN','STOP_TURN'))
 
now_pose=Pose()
goal_pose=Pose()
g_state=State.MOVE                                                                            
PI = 3.141592653
twist = Twist()
first_set_goal=True
 
 
 
 
 
def subCallback(pose):
    
    global now_pose
    now_pose = pose
 
def control(pub,linear,angular):
    global twist
    twist.linear.x=linear
    twist.angular.z=angular
    pub.publish(twist)
 
#whether the turtle has reached the goal 
def hasReachedGoal():
    global now_pose, goal_pose
   
    return (fabs(now_pose.theta-goal_pose.theta)<0.001)&(fabs(now_pose.x-goal_pose.x)<0.001)&(fabs(now_pose.y-goal_pose.y)<0.001)
 
#wheather the turtle has stopped 
def hasStopped():
    global now_pose
    return ((now_pose.linear_velocity<0.001)&(now_pose.angular_velocity<0.001))
 
 
def stopMove(pub):
    global goal_pose,g_state,now_pose
 
    if hasStopped():
        g_state=State.TURN
        goal_pose.x = now_pose.x
        goal_pose.y = now_pose.y
        goal_pose.theta = now_pose.theta+PI/2
        if goal_pose.theta>PI:
            goal_pose.theta=goal_pose.theta-2*PI
    else:
        control(pub,0,0)
    rospy.loginfo('停止行走')
 
 
def stopTurn(pub):
    global goal_pose,g_state,now_pose
 
    if hasStopped():
        g_state=State.MOVE
        goal_pose.x = now_pose.x+cos(now_pose.theta)*2
        goal_pose.y = now_pose.y+sin(now_pose.theta)*2
        goal_pose.theta = now_pose.theta
    else:
        control(pub,0,0)
    rospy.loginfo('停止转弯')
 
 
def move(pub):
 
    global g_state
    if hasReachedGoal():
        g_state=State.STOP_MOVE
        control(pub,0,0)
    else:
        control(pub,1,0)
    rospy.loginfo('直线行走move')
 
 
def turn(pub):
    global g_state
    if hasReachedGoal():
        g_state=State.STOP_TURN
        control(pub,0,0)
    else:
        control(pub,0,PI/4)
    rospy.loginfo('转弯')
 
 
 
def timeCallback(event):
    
    rospy.loginfo("come into timeCallback.....")
 
    pub = rospy.Publisher("turtle1/cmd_vel", Twist, queue_size=1)
 
    global goal_pose,now_pose, first_set_goal,g_state
    #if this is the first time to call this function
    if first_set_goal:
        goal_pose.x = now_pose.x+cos(now_pose.theta)*2
        goal_pose.y = now_pose.y+sin(now_pose.theta)*2
        goal_pose.theta = now_pose.theta
 
        first_set_goal=False
 
    if g_state==State.STOP_MOVE:
        rospy.loginfo('状态为:'+str(g_state))
        stopMove(pub)
    elif g_state==State.MOVE:
        rospy.loginfo('状态为:'+str(g_state))
        move(pub)
    elif g_state==State.TURN:
        turn(pub)
    else:
        stopTurn(pub)
 
if __name__ == "__main__":
 
    rospy.init_node("go_square")
 
 
    sub = rospy.Subscriber("turtle1/pose", Pose, subCallback,queue_size=10)
 
    rospy.Timer(rospy.Duration(0.016), timeCallback, oneshot=False)
 
 
    rospy.spin()
 
 
 
    pass

绘制的方形相对比较整齐。但根据计算机当前分配内存和CPU影响,有时可能仍会出现在拐弯处出现过度判断。当然,如果把:

   rospy.Timer(rospy.Duration(0.016), timeCallback, oneshot=False)

中0.016改为更小数字,效果应该会更好。个人感觉应该就向微分那样,分的约细小就能判断更好。不过还未 验证。
————————————————

原文为本人另一账号书写,链接:https://blog.csdn.net/jubobolv1/article/details/121693827

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS+python控制小乌龟走方形的实现rospy 的相关文章

  • Pandas/Google BigQuery:架构不匹配导致上传失败

    我的谷歌表中的架构如下所示 price datetime DATETIME symbol STRING bid open FLOAT bid high FLOAT bid low FLOAT bid close FLOAT ask open
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • 用枢轴点拟合曲线 Python

    我有下面的图 我想用 2 条线来拟合它 使用 python 我设法适应上半部分 def func x a b x np array x return a x b popt pcov curve fit func up x up y 我想用另
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 删除flask中的一对一关系

    我目前正在使用 Flask 开发一个应用程序 并且在删除一对一关系中的项目时遇到了一个大问题 我的模型中有以下结构 class User db Model tablename user user id db Column db String
  • 独立滚动矩阵的行

    我有一个矩阵 准确地说 是 2d numpy ndarray A np array 4 0 0 1 2 3 0 0 5 我想滚动每一行A根据另一个数组中的滚动值独立地 r np array 2 0 1 也就是说 我想这样做 print np
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • Python 2:SMTPServerDisconnected:连接意外关闭

    我在用 Python 发送电子邮件时遇到一个小问题 me my email address you recipient s email address me email protected cdn cgi l email protectio
  • Python,将函数的输出重定向到文件中

    我正在尝试将函数的输出存储到Python中的文件中 我想做的是这样的 def test print This is a Test file open Log a file write test file close 但是当我这样做时 我收到
  • 如何在不丢失注释和格式的情况下更新 YAML 文件 / Python 中的 YAML 自动重构

    我想在 Python 中更新 YAML 文件值 而不丢失 Python 中的格式和注释 例如我想改造 YAML 文件 value 456 nice value to value 6 nice value 界面类似于 y yaml load
  • “隐藏”内置类对象、函数、代码等的名称和性质[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我很好奇模块中存在的类builtins无法直接访问的 例如 type lambda 0 name function of module
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • 在 Sphinx 文档中*仅*显示文档字符串?

    Sphinx有一个功能叫做automethod从方法的文档字符串中提取文档并将其嵌入到文档中 但它不仅嵌入了文档字符串 还嵌入了方法签名 名称 参数 我如何嵌入only文档字符串 不包括方法签名 ref http www sphinx do
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • 将 Python 中的日期与日期时间进行比较

    所以我有一个日期列表 datetime date 2013 7 9 datetime date 2013 7 12 datetime date 2013 7 15 datetime date 2013 7 18 datetime date
  • Scipy Sparse:SciPy/NumPy 更新后出现奇异矩阵警告

    我的问题是由大型电阻器系统的节点分析产生的 我基本上是在设置一个大的稀疏矩阵A 我的解向量b 我正在尝试求解线性方程A x b 为了做到这一点 我正在使用scipy sparse linalg spsolve method 直到最近 一切都
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s
  • 使用 z = f(x, y) 形式的 B 样条方法来拟合 z = f(x)

    作为一个潜在的解决方案这个问题 https stackoverflow com questions 76476327 how to avoid creating many binary switching variables in gekk

随机推荐

  • YoloV5+ROS2直接发布出物品坐标

    大家好 xff0c 我是秃头了依然在敲代码的小鱼 最近小鱼又整了一个开源库 xff0c 结合YOLOV5订阅图像数据和相机参数 xff0c 直接给出一个可以给出识别物品的坐标信息 xff0c 方便进行识别和抓取 xff0c 目前适配完了2D
  • IKFAST太难配?小鱼OpenRave的Docker镜像分享给你!

    大家好 xff0c 我是倒腾了一天机械臂的小鱼 众所周知 xff0c moveit自带的求解器 xff0c 使用的是数值解 xff0c 求解结果稳定性是要看人品的 xff0c 不过Moveit支持通过配置来更换求解器 xff0c 目前比较公
  • 小鱼的一键安装系列

    小鱼的一键安装系列 鱼香ROS介绍 xff1a 鱼香ROS是由机器人爱好者共同组成的社区 xff0c 欢迎一起参与机器人技术交流 进交流群请加机器人小伊微信 xff1a fishros2048 文章信息 xff1a 标题 xff1a 小鱼的
  • ubuntu18.04 ros-melodic 在安装ros依赖包时总是出现E软件包无法定位

    ubuntu18 04 ros melodic 在安装ros依赖包时总是出现E软件包无法定位 鱼香ROS介绍 xff1a 鱼香ROS是由机器人爱好者共同组成的社区 xff0c 欢迎一起参与机器人技术交流 进交流群请加机器人小伊微信 xff1
  • 树莓派4B(Pi buster)一键安装apt存在问题,WARNING: apt does not have a stable CLI interface

    树莓派4B xff08 Pi buster xff09 一键安装apt存在问题 xff0c WARNING apt does not have a stable CLI interface 鱼香ROS介绍 xff1a 鱼香ROS是由机器人爱
  • ROS1/ROS2版本代号

    ROS1 ROS2版本代号 鱼香ROS介绍 xff1a 鱼香ROS是由机器人爱好者共同组成的社区 xff0c 欢迎一起参与机器人技术交流 进群加V xff1a fishros2048 文章信息 xff1a 标题 xff1a ROS1 ROS
  • 一键安装失败

    一键安装失败 鱼香ROS介绍 xff1a 鱼香ROS是由机器人爱好者共同组成的社区 xff0c 欢迎一起参与机器人技术交流 进群加V xff1a fishros2048 文章信息 xff1a 标题 xff1a 一键安装失败 原文地址 xff
  • 在ROS 2中使用QT,显示话题内容,详细配置代码

    功能包类型选ament cmake xff0c 核心代码是这两句 xff0c 把spin单独出来 xff0c 不然接收不到话题数据 std thread spin thread listener gt void rclcpp spin li
  • 进程切换-

    实验课之前有一些问题 中断机制 第一个问题 xff1a interrupt的两个状态源头 xff1a 外中断多由随机中断 xff08 异步中断 xff09 造成 xff0c 如鼠标点击 xff0c 键盘输入 xff1b 内终端多由故障终端
  • 前后端分离项目 — 基于SpringSecurity OAuth2.0用户认证

    1 前言 现在的好多项目都是基于APP移动端以及前后端分离的项目 xff0c 之前基于Session的前后端放到一起的项目已经慢慢失宠并淡出我们视线 xff0c 尤其是当基于SpringCloud的微服务架构以及Vue React单页面应用
  • Android Studio com.android.support:percent 导入错误

    看第一行代码 xff08 第二版的 xff09 书 xff0c 讲了一个关于PercentFrameLayout和PercentRelativeLayout的部分 xff0c 书上在build gradle中导入了com android s
  • BS_TYPEMASK 重定义

    问题来源 CButtonST从VC6移植到VS2008的时候 xff0c 会提示下面语句重定义 span class token macro property span class token directive keyword defin
  • Ubuntu安装python

    CentOS 安装 Python3 没什么坑 xff0c 按照步骤一步步来就可以了 但 Ubuntu 安装 Python3 的坑却不少 xff0c 这里总结一下 xff0c 避免以后继续踩坑 我用的是 ubuntu16 04 xff0c 安
  • 【深度学习】Pytorch中cv2的错误 TypeError: Expected Ptr<cv::UMat> for argument ‘img‘

    错误出现的原因应该为数据之间出了冲突 xff0c 需要在某些地方调用 copy 函数 当我查看画框后的原图和旋转后的图片时 xff0c 发现它只是旋转的原图 xff0c 而不是将原图直接拷贝一份再旋转 下面为代码 xff1a import
  • PX4飞控开发——环境配置及编译ubuntu18.04

    PX4飞控学习过程 xff08 随着学习不断更新 xff0c 欢迎讨论 xff09 一 安装时遇到的问题二 添加环境变量及编译三 解決E 无法获得锁 var lib dpkg lock frontend open 11 资源暂时不可用 的問
  • PX4飞控试炼之路

    PX4飞控试炼之路 一 地面站控制台上显示输出 Hello Sky 二 利用飞控计算加法三 飞控按指定频率计数 xff0c 并将计数结果反馈到控制台1 利用while循环实现计数2 利用 96 hrt call every 96 周期回调函
  • 解决电脑wlan被禁用无法再启动的办法.

    快捷键ctrl 43 alt 43 delete打开任务管理器 gt 选择服务 gt 左下角打开服务 gt 找到WLAN AutoConfig右键 gt 选择重新启动 xff0c 然后Ok了
  • 关于虚拟机ubuntu编译程序时报make: warning: Clock skew detected. Your build may be incomplete.问题的解决办法

    关于ubuntu虚拟机编译程序时报make warning Clock skew detected Your build may be incomplete 问题的解决办法 xff1a 我在ubuntu虚拟的arm linux gcc上编译
  • 解决rosbag时间戳未对齐的解决方法

    解决rosbag时间戳未对齐的解决方法 Reference ROS org rosbag Cookbook http wiki ros org rosbag Cookbook rosbag在存储时间时 xff0c 接收消息的时间和生成消息的
  • ROS+python控制小乌龟走方形的实现rospy

    常见的简陋的控制乌龟行走方形的方式很简单 xff0c 例如 xff1a 代码有些地方是测试用的 xff0c 可以不要 usr bin env python from pickle import TRUE import rospy from