【问题标题】:How to Automate terminal commands of ROS using a python script如何使用 python 脚本自动化 ROS 的终端命令
【发布时间】:2019-06-19 10:27:34
【问题描述】:

我目前正在尝试在 python 中编写一个运行以下 ROS 命令的可执行程序:rostopic echo dvrk/PSM1/position_cartesian_current 但是尽管阅读了 ROS 教程,但我不确定如何去做。在名为 arm.py 的文件中,已经存在以下订阅者和定义:

rospy.Subscriber(self.__full_ros_namespace + '/position_cartesian_current', PoseStamped, self.__position_cartesian_current_cb)

def __position_cartesian_current_cb(self, data):
        self.__position_cartesian_current = posemath.fromMsg(data.pose)

我应该在新的自动化 python 脚本中重用这个订阅者和定义吗?在获得当前的笛卡尔位置后,机器人随后将被移动到不同的位置,目前可以在终端中使用 ROS 命令来完成,但目的是编写一个自动化这些命令的 python 脚本。任何帮助将不胜感激!

import rospy
from tf import transformations
from tf_conversions import posemath
from std_msgs.msg import String, Bool, Float32, Empty, Float64MultiArray
from geometry_msgs.msg import Pose, PoseStamped, Vector3, Quaternion, Wrench, WrenchStamped, TwistStamped

def callback(data):
  rospy.loginfo(rospy.get_caller_id() + data.data)

def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber(self.__full_ros_namespace + '/position_cartesian_current', PoseStamped, callback)
    rospy.spin()

if __name__ == '__main__':
    listener()

【问题讨论】:

  • 您是在尝试创建新脚本还是会重复使用arm.py?您能否提供完整的arm.py 代码?如果你能创建一个minimal reproducible example 那就完美了。
  • 我正在尝试创建一个新的 python 脚本来实现 arm.py 文件中的发布者/订阅者 - 所以目前如果我在终端中键入命令:rostopic echo dvrk/PSM1/position_cartesian_current,手臂的位置和方向连续显示。这个想法是,通过运行这个新的 python 文件,我应该能够最初获得手臂的当前位置,并使用 ROS 命令将手臂移动到所需的位置。
  • arm.py 文件可以通过这个链接找到:github.com/nortega1/dvrk-ros/blob/…

标签: python publish-subscribe ros


【解决方案1】:

您要做的是编写一个 Python ROS 节点来订阅主题并实现您的逻辑。

您可以关注this guide

主要思想是订阅位置主题,在回调函数中获取相关数据,并在同一个回调中发布您通常通过命令行执行的命令。

要重现一个简单的rostopic echo,您只需打印您在回调中收到的值。

【讨论】:

  • 我添加到原始帖子中的附加代码是否正确?抱歉,我还在掌握 ROS
  • 该代码是订阅主题和检索数据的正确代码。阅读指南,它真的写得很好。
【解决方案2】:

这不是 Python 自动化脚本,它是一个 Python ROS 程序,可以作为 ROS 节点执行(使用 rosrun)。这样做与通过 ROS 内置终端命令发布手动消息相同。每当在“/position_cartesian_current”主题发布消息时,该程序将执行回调。

如果您不想在任何时候尝试在不同的终端上执行一堆命令,ROS 为您提供了创建启动文件 (roslaunch) 的功能,这将您的执行管道减少为单个 roslaunch 命令。这在 ROS 社区中被大量用于自动化流程。

【讨论】:

    【解决方案3】:

    根据PoseHeader消息中包含的this docPoseStamped消息,所以要获取Pose的值试试:

    from geometry_msgs.msg import PoseStamped,
    
    def callback(data):
      print(data.pose)
    
    def listener():
        rospy.init_node('listener', anonymous=True)
        rospy.Subscriber(self.__full_ros_namespace + '/position_cartesian_current', 
        PoseStamped, callback
    )
        rospy.spin()
    

    【讨论】:

      猜你喜欢
      • 2011-07-22
      • 1970-01-01
      • 2020-05-14
      • 2018-09-01
      • 1970-01-01
      • 2020-03-19
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多