ROS中的命令行工具
ROS中为我们提供了丰富的命令行工具,帮助我们进行代码的编写,调试,测试,框架的搭建,数据的显示等等
大图如下,所有的命令大致可以分为四类,分别是运行相关命令,编译相关命令,包制作管理相关命令,项目创建相关命令
下面进行详细的讲解
ROS 运行相关命令
roscore
roscore用于启动一个ROS Master,直接输入命令即可启动
jack@ubuntu:~$ roscore
运行结果如下
rosrun
rosrun用于运行一个功能包中的某个节点,其后接两个参数,一个是功能包名,一个是要启动的节点名,例如我们下面打开turtlesim
功能包下的turtlesim_node
节点,这个节点的功能就是打开仿真的图像界面
jack@ubuntu:~$ rosrun turtlesim turtlesim_node
接下来我们打开turtlesim
功能包中的turtle_teleop_key
节点来进行键盘监听,从而使用键盘控制乌龟的运动
jack@ubuntu:~$ rosrun turtlesim turtle_teleop_key
rqt_graph
我们接下来使用rqt_graph命令来查看当前运行的各个节点之间的关系
rqt是ros中一系列基于qt开发的可视化工具,直接输入rqt_graph即可
jack@ubuntu:~$ rqt_graph
我们能够看到,我们目前一共运行了两个节点,这两个节点之间具有数据的传输
rosnode
rosnode命令是用于显示系统中所有节点信息的命令,其中又有多个参数可选
rosnode list
rosnode list用于输出当前所有运行的节点
jack@ubuntu:~$ rosnode list
这里我们能看到除了刚才rqt_graph中的节点外,还有一个rosout节点
rosout节点实际上是启动ros master时自动就会启动的节点,这个节点主要用于采集所有节点的日志信息,用于提交给其他命令用于显示的
rosnode info
我们能用rosnode info命令来查看某一个具体的节点的信息,例如
jack@ubuntu:~$ rosnode info /turtlesim
其中:
- Publication是当前节点发布的所有信息
- Subscription是当前节点订阅的所有信息
- Service是当前节点提供的服务
- 下面是进程号,主机号,底层通信机制等等一些我们并不是很关注的信息
rostopic
和rosnode类似,rostopic是一个用于查看当前系统运行的所有话题信息的命令,和rosnode一样,也有很多的参数可以选择
rostopic list
rostopic list用于显示当前所有的topic
jack@ubuntu:~$ rostopic list
rostopic pub
我们可以使用rostopic pub来向某一个topic发布数据
rostopic pub topic名 message名/数据结构名 要发布的数据结构内容
我们可以给rostopic pub后加-r参数来指定发布的频率
jack@ubuntu:~$ rostopic pub -r 10 turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 0.0
y: 1.0
z: 1.0
angular:
x: 1.0
y: 0.0
z: 1.0"
此外,由于我们的乌龟是二维平面的,因此我们为其设定x,y方向的角速度是没用的,同理设定z方向的线速度也是没用的
rosmsg
我们可以使用rosmsg来查看,message相关的信息
rosmsg show
我们可以用rosmsg show命令来查看某个message的结构,其后要加查看的消息名
jack@ubuntu:~$ rosmsg show geometry_msgs/Twist
rosservice
此外我们还可用rosservice来查看service相关的内容
rosservice list
我们可以用rosservice list来查看所有的service
jack@ubuntu:~$ rosservice list
当前所有的服务都是由我们的海龟仿真器提供的,即节点/turtlesim
提供的,还有一些服务则是rosout提供的,这个我们不用管
我们可以用rosnode info查询
rosservice call
我们上面查看了所有的service,就像上面我们向某一个topic发布message一样,我们可以使用rosservice call来请求某个服务
我们如果将rosservice理解为某个功能,则rosservice call就是启动这个功能
rosservice call后面加上需要请求的服务名,而有些服务在启动的时候需要带上参数,为此我们和msg一样两下tab
补全参数信息即可
我们请求/spawn
服务来作为验证,turtlesim这个节点提供的/spawn
服务的功能就是产生一个新的海龟,新的海龟在创建时需要新的海龟的位置信息(x,y坐标,左下角为0),初始转向和名字信息
jack@ubuntu:~$ rosservice call /spawn "x: 6.0
y: 2.0
theta: 0.0
name: 'jackTurtle'"
name: "jackTurtle"
我们运行之后海龟仿真器的界面上出现新的海龟
上面我们讲过,我们当前运行的所有服务一共有三个节点,除了rosout之外,负责小海龟仿真器运行的有turtlesim和teleop_turtle两个节点
这两个节点一个负责监听键盘输入,一个负责处理海龟的其他信息.这里我们新创建了一个海龟,并不会产生新的node,因为所有的海龟都是由turtlesim节点管理的,如下图
那么我们新增的海龟到底对什么产生了影响?
我们仔细分析下整个小海龟仿真器的内容,两个节点之间通过cmd_vel这个topic来传输键盘输入,我们新创建的海龟也能够通过键盘来控制,那么我们再查看下所有的topic
我们能够发现除了一开始的/turtle1的三个topic,还新增了/jackTurtle的三个topic
所以在小海龟仿真器中,海龟的具体表现形式就是topic,我们调用/spawn
服务来产生新的海龟的过程实际上就是创建新的topic
rosbag
通常来说我们在进行ROS开发的时候并不会每次修改完代码之后就在实体机上运行,因为这样会对机器造成很大的损耗,因此我们通常是只运行一次机器,然后将机器运行时候所有的数据保存下来,未来在仿真中进行测试
rosbag就是用于记录数据并在仿真中重现的工具
前面讲过,ROS中所有的数据的发布都是以topic的方式传输的,因此rosbag实际上记录的就是所有的topic
rosbag record
rosbag record命令用于记录所有的topic,其参数如下
rosbag record [-a] [-O]
- -a表示记录所有的topic
- -O表示将数据保存为一个压缩文件并指定名称
例如我们下面记录键盘控制的小海龟仿真
jack@ubuntu:~$ rosbag record -a -O turtleKeyboardRecord20201128
完成记录后Ctrl C
结束记录,记录的数据将保存在当前的工作目录里
rosbag play
rosbag play用于重现记录的数据
我们首先重新启动一个ROS Master,然后打开仿真器节点,不需要打开键盘节点
然后输入rosbag play命令,后面要加记录的数据包名
rosbag play turtleKeyboardRecord20201128
rosbag play
rosbag play用于重现记录的数据
我们首先重新启动一个ROS Master,然后打开仿真器节点,不需要打开键盘节点
然后输入rosbag play命令,后面要加记录的数据包名
rosbag play turtleKeyboardRecord20201128