如何使用 python 脚本自动化 ROS 的终端命令
How to Automate terminal commands of ROS using a python script
我目前正在尝试在 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()
你想做的是写一个Python ROS节点来订阅主题并实现你的逻辑。
您可以按照 this guide.
进行操作
主要思想是订阅位置主题,在回调函数中获取相关数据并在同一个回调中发布您通常通过命令行执行的命令。
要重现一个简单的 rostopic echo
,您可以只打印在回调中收到的值。
这不是 Python 自动化脚本,它是一个 Python ROS 程序,可以作为 ROS 节点执行(使用 rosrun)。这样做的目的与通过 ROS built-in 终端命令发布手动消息相同。每当在“/position_cartesian_current”主题上发布消息时,该程序将执行回调。
如果您不想在每次想尝试某事时都在不同的终端执行一堆命令,ROS 为您提供了创建启动文件 (roslaunch) 的功能,它将您的执行管道减少为单个 roslaunch 命令。这在 ROS 社区中大量用于自动化流程。
根据 this doc PoseStamped
消息包含在 Pose
和 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()
我目前正在尝试在 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()
你想做的是写一个Python ROS节点来订阅主题并实现你的逻辑。
您可以按照 this guide.
进行操作主要思想是订阅位置主题,在回调函数中获取相关数据并在同一个回调中发布您通常通过命令行执行的命令。
要重现一个简单的 rostopic echo
,您可以只打印在回调中收到的值。
这不是 Python 自动化脚本,它是一个 Python ROS 程序,可以作为 ROS 节点执行(使用 rosrun)。这样做的目的与通过 ROS built-in 终端命令发布手动消息相同。每当在“/position_cartesian_current”主题上发布消息时,该程序将执行回调。
如果您不想在每次想尝试某事时都在不同的终端执行一堆命令,ROS 为您提供了创建启动文件 (roslaunch) 的功能,它将您的执行管道减少为单个 roslaunch 命令。这在 ROS 社区中大量用于自动化流程。
根据 this doc PoseStamped
消息包含在 Pose
和 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()