为什么ROS Publisher没有发布价值观?

2024-09-29 21:46:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试编写一个pythonros程序,它可以作为ROS节点执行(使用rosrun),它实现在单独的Python文件中声明的def手臂.py(网址:https://github.com/nortega1/dvrk-ros/..)。程序首先检查手臂的当前笛卡尔位置。随后,当提供了手臂必须经过的一系列点时,程序计算一个多项式方程,并给定一个x值的范围,程序计算该方程以找到相应的y值。在

arm.py文件中,有一个发布服务器set_position_cartesian_pub,它设置手臂的笛卡尔位置,如下所示:

self.__set_position_cartesian_pub = rospy.Publisher(self.__full_ros_namespace + '/set_position_cartesian', Pose, latch = True, queue_size = 1)

问题是,发布者set_position_cartesian没有向机器人发布newPose的值-有人知道可能是什么问题吗?我可以确认def lagrange正确地计算了x和y坐标的值,这些值通过命令打印到终端rospy.loginfo(新姿势)。任何帮助将不胜感激,因为我一直在努力解决这个问题在过去两天!在

^{pr2}$

Tags: 文件pyself程序defpositionrosrospy
1条回答
网友
1楼 · 发布于 2024-09-29 21:46:33

您没有发布,因为当您调用application.configure()时,代码停止在rospy.spin()。据我所知,你正在尝试做什么,代码将发布10个姿势到一个主题,然后你不再需要它了。在

我已经移动了rospy.spin()的位置,但是代码需要更多的修改。在

#! /usr/bin/python
import rospy
import sys
from std_msgs.msg import String, Bool, Float32
from geometry_msgs.msg import Pose
from geometry_msgs.msg import PoseStamped
from geometry_msgs.msg import Vector3
from geometry_msgs.msg import Quaternion
from geometry_msgs.msg import Wrench

class example_application(object):
    def callback(self, data):
        self.position_cartesian_current = data.pose
        rospy.loginfo(data.pose)

    def configure(self,robot_name):
        self._robot_name = 'PSM1'
        ros_namespace = '/dvrk/PSM1'
        rospy.Subscriber('/dvrk/PSM1/position_cartesian_current', PoseStamped, self.callback)
        self.set_position_cartesian = rospy.Publisher('/dvrk/PSM1/set_position_cartesian', Pose, latch=True, queue_size = 10)

    def lagrange(self, f, x):
        total = 0
        n = len(f)
        for i in range(n):
            xi, yi = f[i]
            def g(i, n):
                g_tot = 1
                for j in range(n):
                    if i == j:
                        continue
                    xj, yj = f[j]
                    g_tot *= (x - xj) / float(xi - xj)

                return g_tot

            total += yi * g(i, n)
        return total

    def trajectoryMover(self):
        newPose = Pose()
        points =[(0.0156561,0.123151),(0.00715134,0.0035123151),(0.001515177,0.002123151),(0.0071239751,0.09123150)]
        xlist = [i*0.001 for i in range(10)]
        ylist = [self.lagrange(points, xlist[i])*0.001 for i in range(10)]
        for x, y in zip(xlist, ylist):
            newPose.position.x = x
            newPose.position.y = y
            newPose.position.z = 0.001
            newPose.orientation.x = 0.001
            newPose.orientation.y = 0.001
            newPose.orientation.z = 0.005
            newPose.orientation.w = 0.002
            self.set_position_cartesian.publish(newPose)
            rospy.loginfo(newPose)

    def run(self):
        # self.home()
        self.trajectoryMover()

if __name__ == '__main__':
    if (len(sys.argv) != 2):
        print(sys.argv[0] + ' requires one argument, i.e. name of dVRK arm')
    else:
        application = example_application()
        application.configure(sys.argv[1])
        application.run()

    try:
        rospy.spin()
    except KeyboardInterrupt:
        rospy.loginfo("Keyboard Interrupt")

想想:

  • 使脚本参数成为节点的参数。在
  • configure方法移动到__init__方法。在
  • g()函数置于lagrange()之外。在

最好使用相对主题名,而不是绝对主题名(absolute:topicname以/开头,例如:'/dvrk/PSM1')。在

相关问题 更多 >

    热门问题