如何使用python脚本自动化ROS的终端命令

时间:2019-06-19 10:27:34

标签: python publish-subscribe ros

我目前正在尝试用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()

3 个答案:

答案 0 :(得分:1)

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

您可以按照this guide进行操作。

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

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

答案 1 :(得分:0)

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

如果您不想每次尝试尝试在不同终端上执行命令时,ROS都可以为您创建启动文件(roslaunch),从而将您的执行流水线简化为单个roslaunch命令。这在ROS社区中大量使用,以使流程自动化。

答案 2 :(得分:0)

根据PoseStampedPose消息中包含的this doc Header消息,因此要获得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()