ROS学习笔记
从小海龟说起
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
使用三个terminal分别使用以上三个指令可以创造一个可以用键盘控制的小海龟,三个终端的目的是为了让三条指令同时运行,在ROS中,所有的软件都组织成为包(软件包/功能包)的形式。比如在前面的代码中,turtlesim是一个包,而turtlesim_node以及turtle_teleop_key是turtlesim包中的可执行文件。所有的ROS软件都是一个软件包的一部分。
查看软件包和定位软件包
rospack list
rospack list | wc -l
# 返回软件包的个数
每个包由一个package.xml定义,该文件定义关于包的细节,包含package.xml的目录成为软件包目录,
# rospack find package-name
# 找到一个包的目录,包的名称也可以用Tab键补全
rospack find turtlesim
# rosls package-name
# 查看软件包目录下的文件
rosls turtlesim
rosls turtlesim/images
# roscd package-name
# 切换当前目录至此软件包目录下
roscd turtlesim/images/
eog box-turtle.png
节点管理
ROS的目标是使来自不同的程序员设计的节点同时运行,他们彼此几乎相互独立,但是我们又要求他们能够彼此通信,ROS中实现通信的关键部分就是ROS节点管理器,要启动节点管理器,使用如下命令
roscore
在turtlesim中我们使用过这个命令,不带任何参数,也无需任何配置。节点管理器应该在使用ROS的全部时间内保持运行,我们需要先在terminal启动roscore然后运行其他程序,在其他程序均完成后,在roscore的终端输出Ctrl+c停止节点管理器。
节点
在turtlesim中,我们创建了两个节点
- 节点一是turtlesim_node的实例化,这个节点创建turtlesim窗口和模拟海龟运动
- 节点二使turtle_teleop_key的实例化,这个节点捕捉键盘事件,并转换为运动命令,然后将命令发送给turtle_sim节点
启动节点使用如下命令
# rosrun package-name executalbe-name
rosrun turtlesim turtlesim_node
# 获得运行节点列表
rosnode list
# 该命令的输出为(在turtle_sim的例子下)
/rosout
/teleop_turtle
/turtlesim
# 其中rosout是一个特殊的节点,通过roscore自动启动,功能类似控制台程序中的标准输出
# 查看节点
# rosnode info node-name
rosnode info /teleop_turtle
# 终止节点
# rosnode kill node-name
rosnode kill /teleop_turtle
话题和消息
ROS中,消息有组织的存放在话题里,这个机制可以描述为:当一个节点想要分享信息时,它会发布消息到对应的一个或者多个话题,当一个节点要接受信息时,它就会订阅它所需要的一个或者过个话题。
# 查看ros中的发布/订阅关系
rqt_graph
所有的节点都向话题/rosout发布消息,该话题由同名节点/rosout节点订阅。在turtlesim例中,当你按下一个键时,/teleop_turtle节点会以消息的形式将这些运 动控制命令发布到话题/turtle1/cmd_vel;与此同时,因为turtlesim_node订阅了该话题,因此它会接收到这个些消息,控制海龟按照该预定的速度移动。
# 获得当前活跃话题
rostopic list
# 打印某个话题下的消息内容
# rostopic echo topic-name
rostopic echo /turtle1/cmd_vel
# 测量某个话题发布频率以及占用贷款
rostopic hz topic-name
rostopic bw topic-name
# 查看话题
# rostopic info topic-name
rostopic info /tutle1/color_sensor
# 查看某种类型消息的详情
#rosmsg show message-type-name
rosmsg show turtlesim/Color
rosmsg show geometry_msgs/Twist
# 用命令行发布消息
#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]'
理解消息类型的命名:ROS中,每条消息类型都属于一个包,消息类型名总会包含一个斜杠,斜杠前的名字就是包含他的包,如turtlesim/Color
问题检查
roswtf
编写ROS程序
所有的ROS软件,都被组织成包,在编写之前,创建一个容纳功能包的工作区。然后创建一个功能包
# 创建功能包
# catkin_create_pkg package-name
catkin_create_pkg agitr
写一个这样的函数是简单的,但是我们必须要根据cpp文件的一些特定对其txt进行相应的配置,以使得该文件能够被正确的配置。