这部分教程介绍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就已经正确初始化了。