5_ROS节点

发布于:2022-12-13 ⋅ 阅读:(502) ⋅ 点赞:(0)

这部分教程介绍ROS图的概念以及讨论如何使用roscore,rosnode,rosrun等命令行工具.至于为什么选择deepin而不是ROS通用的ubuntu,也仅仅是为了支持国产系统。鉴于本人水平有限,如哪位攻城狮网友发现本文存在的问题,烦请留言指正,谢谢!

计算图的概念

  • Nodes(节点):一个节点是使用ROS进行相互通信的可执行程序
  • Message(消息):ROS在主题上(topic)发布或者订阅消息的数据类型
  • Topic(主题):ROS可以在一个主题上发布和订阅消息
  • Master:ROS服务的名字
  • rosout:ROS中与stdout/stderr类似的东西
  • roscore:Master + rosout + parameter server叫做roscore

节点

节点实际上只是ROS包中的一个可执行程序。ROS节点使用ROS的客户端库与其他节点进行通信。节点可以发布或订阅Topic消息。节点也可以提供或者利用服务。

客户端库

ROS客户端支持用不同语言开发的节点进行通信

  • rospy:python客户端库
  • roscpp:C++客户端库

roscore

在运行ros节点前必须先运行roscore.

~$ roscore
... logging to /home/gaoy/.ros/log/2f376548-2a05-11ed-9718-f8b54d546b81/roslaunch-msi-12110.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://msi:35699/
ros_comm version 1.15.14


SUMMARY
========

PARAMETERS
 * /rosdistro: noetic
 * /rosversion: 1.15.14

NODES

auto-starting new master
process[master]: started with pid [12121]
ROS_MASTER_URI=http://msi:11311/

setting /run_id to 2f376548-2a05-11ed-9718-f8b54d546b81
process[rosout-1]: started with pid [12132]
started core service [/rosout]

如果roscore没有初始化,你可能会遇到网络配置问题。可参考中single machine configuration部分
如果roscore没有初始化,并发送了一个关于缺少权限的消息,可能是~/.ros目录的所有者是root,递归更改此目录的所有者即可。

使用rosnode

gaoy@msi:~$ rosnode list
/rosout

上面表明目前只有一个节点/rosout在运行。此节点收集节点的调试输出信息。

rosnode的info命令可以给我们输出与节点相关的更多信息。发布的消息,接受的消息等等

gaoy@msi:~$ rosnode  info /rosout
--------------------------------------------------------------------------------
Node [/rosout]
Publications: 
 * /rosout_agg [rosgraph_msgs/Log]

Subscriptions: 
 * /rosout [unknown type]

Services: 
 * /rosout/get_loggers
 * /rosout/set_logger_level


contacting node http://msi:39289/ ...
Pid: 12132

使用rosrun

rosrun可以让你通过命令行的形式直接运行指定包的节点。下面命令运行小乌龟节点

rosrun  turtlesim turtlesim_node

# 可看到运行的turtlesim_node节点名是/turtlesim
~$ rosnode list 
/rosout
/turtlesim

ROS的一个强大特性是你可以通过命令行重新分配节点名。例如:

rosrun  turtlesim turtlesim_node __name:=my_turtle
#重新运行rosnode list查看节点名
gaoy@msi:~$ rosnode list
/my_turtle # 可以看到节点名改为我们设置的节点名my_turtle
/rosout

注意:如果你在关闭节点使用的是ctrl+c的形式而非关闭终端,或者没有按照single machine configuration设置ROS_HOSTNAME环境变量的时候。可能会出现ctrl+c后使用rosnode list发下之前的节点还存在,这时候可以使用rosnode cleanup进行清理

可以使用rosnode ping node名来测试某个节点是否启动

rosnode ping my_turtle
rosnode: node is [/my_turtle]
pinging /my_turtle with a timeout of 3.0s
xmlrpc reply from http://msi:34771/     time=3.972530ms

Single machine configuration

如果你仅仅想在本机上做测试,可以简单设置环境变量

$ export ROS_HOSTNAME=localhost
$ export ROS_MASTER_URI=http://localhost:11311

这样的话,roscore就已经正确初始化了。