重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在使用ros::spin()的情况下,一般来说在初始化时已经设置好所有消息的回调,并且不需要其他背景程序运行。这样以来,每次消息到达时会执行用户的回调函数进行操作,相当于程序是消息事件驱动的;而在使用ros::spinOnce()的情况下,一般来说仅仅使用回调不足以完成任务,还需要其他辅助程序的执行:比如定时任务、数据处理、用户界面等。
从网站建设到定制行业解决方案,为提供成都网站建设、做网站服务体系,各种行业企业客户提供网站建设解决方案,助力业务快速发展。创新互联公司将不断加快创新步伐,提供优质的建站服务。
关于消息接收回调机制在ROS官网上略有说明 (callbacks and spinning)。总体来说其原理是这样的:除了用户的主程序以外,ROS的socket连接控制进程会在后台接收订阅的消息,所有接收到的消息并不是立即处理,而是等到spin()或者spinOnce()执行时才集中处理。所以为了保证消息可以正常接收,需要尤其注意spinOnce()函数的使用 (对于spin()来说则不涉及太多的人为因素)。
I. 对于速度较快的消息,需要注意合理控制消息队列及spinOnce()的时间。例如,如果消息到达的频率是100Hz,而spinOnce()的执行频率是10Hz,那么就要至少保证消息队列中预留的大小大于10。
II. 如果对于用户自己的周期性任务,最好和spinOnce()并列调用。即使该任务是周期性的对于数据进行处理,例如对接收到的IMU数据进行Kalman滤波,也不建议直接放在回调函数中:因为存在通信接收的不确定性,不能保证该回调执行在时间上的稳定性。
// 示例代码
ros::Rate r(100);
while (ros::ok())
{
libusb_handle_events_timeout(...); // Handle USB events
ros::spinOnce(); // Handle ROS events
r.sleep();
}
III. 最后说明一下将ROS集成到其他程序架构时的情况。有些图形处理程序会将main()包裹起来,此时就需要找到一个合理的位置调用ros::spinOnce()。比如对于OpenGL来说,其中有一个方法就是采用设置定时器定时调用的方法:
// 示例代码
void timerCb(int value) {
ros::spinOnce();
}
glutTimerFunc(10, timerCb, 0);
glutMainLoop(); // Never returns
参考:
为了使用python3的图像处理程序,需要使用到ros接口,但是由于原生ros接口不支持python3,只能使用python2.7(时间2020-07,版本melodic),一下步骤主要为了使用ros调用的方式调用python3的程序
由于ros接收图像数据使用的是cv_bridge 接口,所以先编译python3版本的cv_bridge
注意:此时要先安装好python3的环境,可以按照以下方式安装
进入到工作空间进行编译
会有如下提示
编译完成后,可以在工作路径下的install文件夹里生成需要的库,需要使用python3版本的cv_bridge时,就将这个环境变量导入即可
extend参数的作用是让这次的路径配置不影响之前配置好的路径
1. 在使用rosrun 运行程序时,默认还会调用原生melodic的cv_bridge
我的处理方法是将原来的python版本cv_bridge删除
2. 编译完成会有错误提示,如下图,但不影响使用
编译安装:
在编译时,使用如下命令:
编译过程中会有错误提示
解决方法:
参考
编译完成如下:
运行roscore错误提示
安装netifaces
参考
解压安装
1先建立工作空间~/catkin_ws参阅/note/516843231/3在工程目录下建一个src子目录和.py文件源代码文件:topic_publisher.py~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#!/usr/bin/envpythonimportroslib;roslib.load_manifest('basic')importrospyfromstd_msgs.msgimportInt32rospy.init_node('topic_publisher')pub=rospy.Publisher('counter',Int32)rate=rospy.Rate(2)count=0whilenotrospy.is_shutdown():pub.publish(count)count+=1rate.sleep()~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~操作步骤如下liao@liao-eagle:~/catkin_ws$lsbuilddevelinstallsrcliao@liao-eagle:~/catkin_ws$cdsrcliao@liao-eagle:~/catkin_ws/src$lsbasicbeginner_tutorialsCMakeLists.txtfirstsecondliao@liao-eagle:~/catkin_ws/src$cdbasic/liao@liao-eagle:~/catkin_ws/src/basic$lsCMakeLists.txtpackage.xmlsrcliao@liao-eagle:~/catkin_ws/src/basic$cdsrcliao@liao-eagle:~/catkin_ws/src/basic/src$vitopic_publisher.pyliao@liao-eagle:~/catkin_ws/src/basic/src$chmod+xtopic_publisher.py4回到~/catkin_ws目录下,编译程序$cd~/catkin_wsliao@liao-eagle:~/catkin_ws$catkin_make5将当前工程加入到shell环境里去liao@liao-eagle:~/catkin_ws$echo"source~/catkin_ws/devel/setup.bash"~/.bashrcliao@liao-eagle:~/catkin_ws$source~/.bashrc6运行程序(需开两个终端)liao@liao-eagle:~/catkin_ws$roscoreliao@liao-eagle:~/catkin_ws$rosrunbasictopic_publisher.py7通过rostopic查看相关信息liao@liao-eagle:~/catkin_ws$rostopiclist/counter/rosout/rosout_agg