我是ROS的新手,我想弄清楚该节点如何与pyton / C ++代码一起工作。对于相同的情况,我有两个代码:

使用Xbox控制器在turtlesim中移动乌龟。 >
#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist
from sensor_msgs.msg import Joy

# DEFINING CLASS
class pubSub:
    def __init__(self):
        # DEFINE VARIABLE TO KEEP LAST VALUE
        rospy.init_node('c2t')
        self.twt = Twist()
        self.hold = Twist()

    def callback_function(self,joyData):
        self.twt.linear.x = 4*joyData.axes[1]
        self.twt.angular.z = 4*joyData.axes[0]
        self.hold = self.twt

    def assuming_cont(self):
        pub = rospy.Publisher('turtle1/cmd_vel', Twist, queue_size=10)
        rospy.Subscriber("joy", Joy, self.callback_function, queue_size=10)
        pub.publish(self.twt)

ps = pubSub()
while not rospy.is_shutdown():
    ps.assuming_cont()


第二个-使用全局变量和带有if __name__ == '__main__'rospy.spin()

#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist 
from sensor_msgs.msg import Joy 

# FUNCTION - GET JOY VALUES TRANSFORM TO TURTLE MOVE
def joy_to_twist_transform(jData):
    twt = Twist()
    twt.linear.x = 5*jData.axes[1]
    twt.angular.z = 4*jData.axes[0]
    pub.publish(twt)

# FUNCTION - START PROCESS
def process():
    global pub
    pub = rospy.Publisher('turtle1/cmd_vel', Twist, queue_size=10)
    sub = rospy.Subscriber("joy", Joy, joy_to_twist_transform, queue_size=1)
    rospy.init_node('control_2turtle')
    rospy.spin()

# MAIN
if __name__  == '__main__':
    try:
        process()
    except rospy.ROSInterruptException:
        pass


我的问题更理论化: >
1-我对节点的工作方式了解是:他循环运行代码,直到关闭为止。但这不能回答为什么我仍然可以保存主题中发布的最后一个值(在我的脑海中,如果我循环运行我的代码,每次都会从头开始)

2-为什么有必要在每个循环中继续创建rospy.Publisherrospy.Subscriber?只能一次创建这些家伙?(例如,在第二个示例中将其用于init函数)

3-while not rospy.is_shutdown():if __name__ == '__main__'rospy.spin()有什么区别? br /> 4-什么是rospy.spin()?在任何文档中都说可以使您的节点保持运行,但是我看到他将代码停留在该行中并仅保留在那里。很多。

#1 楼

if __name__ == '__main__':在这里无关紧要(在第二个代码中),您也可以像这样在没有它的情况下运行您的代码: br /> ie当您不希望在其他python代码中导入代码时运行该代码时,应使用if __name__ == '__main__':

更多信息。


代码和第二个代码是第二个代码使用了rospy.spin()方法,这是一个内置的ROS循环,它在另一个线程中触发publishersubscriber,因此您不需要像第一个示例那样在代码中使用内部while。 br />
相关问题。

#2 楼

好吧,我在ROS Answers中提出了这个问题,然后给出了答案(到目前为止,我已经有了一些经验):answer