1.关于无rospy.spin()调用多次callback 2. subscrib后面语句和callback函数运行顺序

#!/usr/bin/env python
import rospy
from bzrobot_msgs.msg import bzr_WheelLinearVels

#from threading import Thread
from time import sleep

class RS232MotorComm():

    def callback(self, data):
        print ‘****************************************start callback‘
        self.flg=0
        sleep(0.05)
        rospy.loginfo("speed %f %f",data.leftWheelLinearVel, data.rightWheelLinearVel)
        self.flg=1

    def motor_listener(self):
        self.flg=1
        rospy.init_node(‘rs232_motor_comm‘, anonymous=True)

        rospy.Subscriber("control_wheel_linear_vel", bzr_WheelLinearVels, self.callback)
        #sleep(1)

        r = rospy.Rate(10) # 10hz
        while self.flg==1:#not rospy.is_shutdown():#True:
            print‘where‘
            r.sleep()  #time must enough for callback,or it will out while loop
            print‘after sleep 1s‘

if __name__ == ‘__main__‘:

    motor_controller = RS232MotorComm()
    print‘the1‘

    motor_controller.motor_listener()
    #rospy.spin()
    print‘end‘

1.关于rospy.spin()调用多次callback

程序若无rospy.spin(),也无上面黄色部分,则订阅一次发布消息会调用多次callback。

2.当接收到订阅消息时,ballback在r.sleep()时间空隙的时候调用,所以callback的执行时间不能超过r.sleep()提供的间隙时间,例如在callback里设置sleep(1),则会消耗完r.sleep(),然后运行print ‘after sleep 1s‘,此时flg=0,因此跳出while循环,结束程序。

直接用sleep()代替rospy.Rate和r.sleep(),也是可以的。

3.最好使用:

while not rospy.is_shutdown(): #True:
         if self.flg==1: #encoder_list[0]=‘e‘:

时间: 2024-11-10 23:07:59

1.关于无rospy.spin()调用多次callback 2. subscrib后面语句和callback函数运行顺序的相关文章

在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里

有个document里定义了一个函数func(),同时在document里嵌入了一个iframe,在这个iframe里调用父窗口的方法:parent.func(),本来我以为这个函数的运行环境是在这个iframe自己里面,测试发现虽然是在iframe里面调用的这个函数,但是运行环境依然是在父窗口里. 所以也验证了JS权威指南中的:js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里. 又比如 var a=1; function f1(){console.log(a);}; functi

尾递归 递归函数中,递归调用是整个函数体中最后的语句,且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归,空间复杂度是O(1)

什么是递归深度 递归深度就是递归函数在内存中,同时存在的最大次数. 例如下面这段求阶乘的代码: Java: int factorial(int n) { if (n == 1) { return 1; } return factorial(n - 1) * n; } Python: def factorial(n): if n == 1: return 1 return factorial(n-1) * n C++: int factorial(int n) { if (n == 1) { re

mybatis无接口直接调用xml的helloworld

1.首先在库里面创建一张表,sql语句如下: CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(20) COLLATE utf8_bin DEFAULT NULL, `age` INT(11) DEFAULT NULL, PRIMARY KEY (`id`) ); insert into `users`(`id`,`name`,`age`) values (1,'tome',12),(2,'ja

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静

Delphi 调用C/C++的Dll(stdcall关键字, 会导致函数名分裂. 此时函数名变成[email protected])

delphi调用C++写的Dll, 当然这个Dll要求是非MFC的Dll, 这样子才能被delphi调用. 根据C++定义函数的情况, Delphi有不同的相对应的处理方法.1. 声明中不加__stdcall,采用VC默认格式__cdecl,但在Delphi中要注明调用格式为cdecl.C++中例子: [cpp] view plain copy print? extern "C" int __declspec(dllexport) add(int x, int y); Delphi中例

(转)jdbc 调用 sql server 的存储过程时“该语句没有返回结果集”的解决方法

本文转载自:http://hedyn.iteye.com/blog/856040 在JDBC中调用SQL Server中的存储过程时出现如下异常: com.microsoft.sqlserver.jdbc.SQLServerException: 该语句没有返回结果集. at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:171) at com.microsof

Jmeter在一次线程里多次调用同一个拼接参数,不使用自带拼接函数

记录一下使用Jmeter在一次线程里需要多次调用同一个参数时的拼接方法 在对创建.编辑等接口使用Jmeter进行性能.稳定性测试时,需要造多个名称相同,编号不同的参数. 例如:productName参数,对应字段分别为testCreate001.testCreate002.testCreate003…… 原先是使用用户参数+计数器组件,加上Jmeter自带的__V{}函数,像这样: 这种方法在我没有将productName的字段testCreate参数化的时候很好用 ,无论怎么调用,在运行一次线

无表头单链表的总结----无限删除和无限插入(在主函数里实现)

1 #include"head.h" 2 int main() 3 { 4 struct Student *head; 5 struct Student *addinfo; 6 printf("请输入信息(101 wang f s 501)(以"0 0 0 s 0"作为结束标志):\n"); 7 head = input(); 8 print(head); 9 char del_num[N]; 10 printf("请输入要删除的号码(

关于SSIS包调用,把Execute out of Process 设成True后运行失败问题

Execute out of Process = True 相当于cmd 下直接dtexec运行package. 要求deployment下没有bingding parameter 或bingding parameter 有默认值 环境变量问题: 查看 dtexec 这是本机上三个SSIS from sql server  2012 to 2016 Dtexec版本要与包版本对应 临时解决办法:  modify path 只保留与当前ssdt对应的, ssdt for visual 2012 -