我目前正在尝试用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()
答案 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)
根据PoseStamped
和Pose
消息中包含的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()