ros可以运行c语言吗,ros 运行注意事项

本文介绍了ROS中关于数据实时性、节点命名、中断程序、运行方式及常用命令的注意事项。强调了ROS节点与消息类型、话题、主控制器的关系,并提供了处理Ctrl+C中断的方法。此外,还提到了不同语言间数据类型转换的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

1. 数据的实时性

要保证从节点获取的数据是最新的,就必须设置Publisher的queue_size和Subscriber的queue_size都为1,如果数据过大还需要设置buff_size

具体参考博客ROS订阅最新的消息及queue_size和buff_size的理解

2. 名称

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

包内可执行程序名由包内CMakeLists.txt控制生成

add_executable( exe_name xxx.cpp)

在每个可执行程序的main里都会有定义节点的语句,这里的节点名字只是用于代码编译,和launch文件的节点名不是一回事

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

Nodes:节点,一个节点即为一个可执行程序,它可以通过ROS与其他节点通信,另外,一个catkin程序包里可以有很多节点

Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题,是一个载体。

Topics:话题,节点可以向话题发布消息或可以向话题订阅消息,像通信中转站一样。

Master:节点管理器,ROS名称服务。

rosout:话题‘总管’,相当于std::cout

所有的节点发布都向话题/rosout 发布消息,该话题由同名的/rosout 节点订阅。这个话题的作用是用来生成各个节点的文本日志消息

roscore:是在运行所有ROS程序前首先要运行的命令

3.中断程序

Ctrl-C 命令终止节点

使用这种方法时可能不会在节点管理器中注销该节点,因此会导致已终止的节点仍然在 rosnode 列表中。这虽然没有什么坏处,但可能会让用户对当前系统的行为感到困扰。此时可以使用下面的命令将节点从列表中删除:rosnode cleanup

ctrl+c无法中断while循环

python利用rospy.is_shutdown()函数来判断当前是否关闭掉当前的进程

def main():

rospy.init_node('test', anonymous=True)

while not rospy.is_shutdown():

rospy.loginfo('gogogo')

if __name__ == '__main__':

main()

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

ros::ok()接口:返回false,说明节点已经关闭。

ros::isShuttingDown()接口:返回true,说明ros::shutdown()被调用,但是节点不一定结束

在ros::init()选项中,有一选项ros::init_options::NoSigintHandler,决定是否默认SIGINT处理函数,若不带此参数,则程序在收到SIGINT信号(ctrl+c)时,ros::ok()返回false,节点可以走关闭流程。若带此参数,需要自己设置SIGINT处理函数,以保证节点可以结束

#include "ros/ros.h"

#include

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节点一般有两种方法:

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

$rosrun [package_name] [node_name]

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

使用roslaunch

$roslaunch [package] [fliename.launch]

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

可以向程序传参,常配合yaml配置参数

可以同时运行多个节点

具体使用参考launch和yaml使用

5.常用命令

获得话题列表 rostopic list,这个列表列举的话题和 rqt_graph 中展示的话题应该是一样的。

打印消息内容 rostopic echo topic-name

测量发布频率rostopic hz topic-name,带宽rostopic bw topic-name-查

看话题rostopic info topic-name,可以获得消息类型等信息

查看消息类型rosmsg show message-type-name-用

命令发布消息rostopic pub –r rate-in-hz topic-name message-type message-content,如rostopic pub –r 1 /turtle1/cmd_vel geometry_msgs/Twist ’[2,0,0]’ ’[0,0,0]’

问题检查:roswtf

参数查看 rosparam get /run_id 查看 run_id通过runid来查看日志消息

清除日志rosclean check ,rosclean purge

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

rosrun rqt_tf_tree rqt_tf_tree查看tf 树

roscd [pkg_name] 转到包路径

rosdep install [pkg_name]安装包所有依赖

rosls [pkg_name] 列出包里面的文件

rostopic info [topic] 查询话题详细内容

rosnode info [topic] 查询节点详细内容

rostopic type [topic] 列出消息类型 eg:/cmd_vel

rosmsg show [msg_name] 列出消息包含的具体变量

7. 数据类型

0c41b61a6d361fd5a6348cc7c0f773dc.png

注意不同语言间发布和获取的数据注意类型的转换:

比如C++发布的uint和int在python上对应的都是int,如果msg定义的是int,传递负数会被自动转换的

标签:ros,name,topic,rostopic,注意事项,ROS,节点,运行

来源: https://blog.youkuaiyun.com/u011888840/article/details/111377454

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值