其他分享
首页 > 其他分享> > ros 运行注意事项

ros 运行注意事项

作者:互联网

学习ros推荐看官方教程,现在里面大部分都有翻译成中文的版本,多看看绝对没错

1. 数据的实时性

要保证从节点获取的数据是最新的,就必须设置Publisher的queue_size和Subscriber的queue_size都为1,如果数据过大还需要设置buff_size
具体参考博客ROS订阅最新的消息及queue_size和buff_size的理解

2. 名称

我们往往将节点名和执行文件命名相同,但要注意节点名并不一定与对应可执行文件名称相同

  1. 包内可执行程序名由包内CMakeLists.txt控制生成
add_executable( exe_name xxx.cpp)
  1. 在每个可执行程序的main里都会有定义节点的语句,这里的节点名字只是用于代码编译,和launch文件的节点名不是一回事

明确一下与节点相关术语的含义:

3.中断程序

def main():
    rospy.init_node('test', anonymous=True)
    while not rospy.is_shutdown():
        rospy.loginfo('gogogo')

if __name__ == '__main__':
    main()

C++可以使用信号来监听

  1. ros::ok()接口:返回false,说明节点已经关闭。
  2. ros::isShuttingDown()接口:返回true,说明ros::shutdown()被调用,但是节点不一定结束
  3. 在ros::init()选项中,有一选项ros::init_options::NoSigintHandler,决定是否默认SIGINT处理函数,若不带此参数,则程序在收到SIGINT信号(ctrl+c)时,ros::ok()返回false,节点可以走关闭流程。若带此参数,需要自己设置SIGINT处理函数,以保证节点可以结束

#include "ros/ros.h"
#include <signal.h>
 
void MySigintHandler(int sig)
{
	//这里主要进行退出前的数据保存、内存清理、告知其他节点等工作
	ROS_INFO("shutting down!");
	ros::shutdown();
}

int main(int argc, char** argv){
	ros::init(argc, argv, "test");
	signal(SIGINT, MySigintHandler);
	
	ros::Rate loop_rate(1);
	int sec = 0;
	while(ros::ok() && sec++ < 5){
		loop_rate.sleep();
		ROS_INFO("ROS is ok!");
		ros::spinOnce();
	}
	ROS_INFO("ROS bey!");
}

4.运行

运行ros节点一般有两种方法:

  1. 使用rosrun,在设置完环境变量后,可以使用包名来直接运行一个包内的节点。
$rosrun  [package_name]  [node_name]

注意:这种方法需要新打开一个终端 运行$roscore

  1. 使用roslaunch
$roslaunch  [package]  [fliename.launch]

launch是个文件,用launch文件来运行程序相对于rosrun的优点有两个:

5.常用命令

6.有用但被忽略的指令:

7. 数据类型

在这里插入图片描述
注意不同语言间发布和获取的数据注意类型的转换:
比如C++发布的uint和int在python上对应的都是int,如果msg定义的是int,传递负数会被自动转换的

标签:ros,name,topic,rostopic,注意事项,ROS,节点,运行
来源: https://blog.csdn.net/u011888840/article/details/111377454