理解几个概念
- Nodes: 一个节点是ROS中与其他节点进行联系的可执行文件。
(注意:事实上节点就是package中的一个可执行文件,ROS节点使用ROS的客户端库client library来与其他节点进行通讯。节点可以发布或者接收话题,同时,节点也可以提供或者使用服务)。
客户端库client library包括,rospy = python client library和roscpp = c++ client library。允许我们使用不同的编程语言进行编写。
Messages: 当发布话题时设置的ROS数据类型,例如point, path, image等。
Topics: 节点能够通过topic发布各种message消息,同时后续节点也能够通过topic接收消息。
Master: ROS的名字服务(例如帮助各种节点找到彼此)。
rosout: ROS 中的标准输出stdout/stderr。
roscore: Master + rosout + parameter server 组成了roscore,其中(parameter server在后续过程中介绍)。
启动ros
在启动ROS时首先要执行roscore。
例如,我们通过Ctrl + Alt + T 打开一个新的Terminal,执行roscore如果正常的话可以在命令行中看到类似于下述格式的内容。
roscore
... logging to /home/xiaochen/.ros/log/fc2129c0-4510-11ec-a53f-7085c2dc7a69/roslaunch-xiaochen-32511.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://xiaochen:40923/ ros_comm version 1.14.11 SUMMARY ======== PARAMETERS * /rosdistro: melodic * /rosversion: 1.14.11 NODES auto-starting new master process[master]: started with pid [32528] ROS_MASTER_URI=http://xiaochen:11311/ setting /run_id to fc2129c0-4510-11ec-a53f-7085c2dc7a69 process[rosout-1]: started with pid [32546] started core service [/rosout]
如果roscore没有初始化并回复提示说缺乏权限的错误,那么可能是因为 ~/.ros文件夹的权限为root,可以使用以下命令递归更改该文件夹的所有权。
$ sudo chown -R <your_username> ~/.ros
使用rosnode
保持上述窗口执行了roscore之后,继续使用Ctrl + Alt + T 再次打开一个新的Terminal(注意保持前一个窗口处于打开状态),使用下述命令来查看当前激活状态的node。
$ rosnode list
输出结果为:
/rosout
这代表我们现在只有一个node在运行,即rosout,因为其总是处于运行状态来收集并记录各node的debugging输出。
同时,可以使用下述命令来查看指定node的信息。
$ 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://xiaochen:35625/ ... Pid: 4798
这给我们很多关于/rosout节点的信息,例如其发布和接收的消息,同时提供的服务。
使用rosrun
我们可以通过rosrun命令直接运行一个package中的节点node,命令形式如下。
$ rosrun [package_name] [node_name]
例如,我们现在想要运行turtlesim package中的turtlesim_node节点,则执行下述命令:
$ rosrun turtlesim turtlesim_node
可以看到下述界面:
注意:不同版本的ros所执行命令出现的小乌龟图案并不相同。这里是melodic。
随后,我们再次使用Ctrl + Alt + T 打开一个Terminal,在新的窗口中使用命令:
$ rosnode list
查看当前活动的节点,可以看到:
/rosout /turtlesim
ros中另外一个有用的功能是我们可以通过命令对节点进行重命名。例如,我们可以通过下述命令把 turtlesim 包中的 turtlesim_node节点名字修改为my_turtle。
$ rosrun turtlesim turtlesim_node __name:=my_turtle
修改之后我们再使用rosnode list查看当前活动的节点就可以看到如下结果:
/my_turtle /rosout
如果我们还是可以看到/turtlesim节点,这可能是因为我们使用了Ctrl + C结束上一个活动节点而不是直接关闭窗口。
为了避免出现这种情况,我们可以使用:
$ rosnode cleanup
清理所有的节点,然后再重新执行ros run调用对应的节点。
接着,我们使用rosnode中的另一个命令ping来测试我们当前活动的节点。
$ rosnode ping /my_turtle
可以看到返回结果类似于下述形式:
rosnode: node is [/my_turtle] pinging /my_turtle with a timeout of 3.0s xmlrpc reply from http://xiaochen:36823/ time=0.252008ms xmlrpc reply from http://xiaochen:36823/ time=1.084089ms xmlrpc reply from http://xiaochen:36823/ time=1.111031ms xmlrpc reply from http://xiaochen:36823/ time=1.095057ms
说明本机能够有效链接到/my_turtle节点。
总结
本博客中主要介绍了使用
$ roscore
启动ROS。
接着使用:
$ rosrun turtlesim turtlesim_node
启动对应包中的相应节点。
或者使用下述命令,修改节点的名字。
$ rosrun turtlesim turtlesim_node __name:=my_turtle
接着使用下述命令查看当前活动的节点列表:
$ rosnode list
并通过下述命令查看指定节点的信息:
$ rosnode info [nodeName]
最后,可以通过下述命令测试活动节点的连通性:
$ rosnode ping [nodeName]