ROS基本概念和常用命令学习--小乌龟样例
1 资料
本节主要参考如下资料:
(1)《机器人操作系统(ROS)浅析》[美] Jason M. O’Kane 著 肖军浩 译
(2)《ROS机器人开发实践》胡春旭
(3)ros Tutorials 初级教程的1~9节:http://wiki.ros.org/cn/ROS/Tutorials
(4)喜欢视频的还可以看:古月·ROS入门21讲 | 一学就会的ROS机器人入门教程 前9节
本系列博客汇总:ROS高效入门系列。
2 整理输出
2.1 ros版本选择和环境搭建
(1)ros的发版历史:http://wiki.ros.org/Distributions
(2)推荐的ros版本:ROS Noetic Ninjemys,LTS到2025.5,使用ubuntu20.04
补充:建议使用Virtual Box,搞个ubuntu20.04的虚拟机,成本最低,效率最高!
(3)第一种安装方式(非常方便快捷,推荐!):
wget http://fishros.com/install -O fishros && sudo ./fishros
相关博客:
https://blog.csdn.net/KIK9973/article/details/118755045
(4)第二种安装方式(官网):http://wiki.ros.org/cn/Installation/Ubuntu
(5)安装后,验证ros版本,检查是否安装成功:
printenv | grep ROS
cat ~/.bashrc
2.2 跑起来小乌龟样例
(1)小乌龟是机器人的代称,掌故可以看本人的ROS高效入门第一章 – ROS历史与现状
(2)ROS自带一个小乌龟仿真程序:turtlesim,用这个样例可以把ros相关的概念和命令,快速学一遍!
在安装了ros的ubuntu中,开三个终端,分别执行:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
移动小乌龟时,光标一定放在turtle_teleop_key窗口!
2.3 ROS Packages软件包
(1)在ros中,所有软件都被组织成软件包packages,每个软件包都有一个清单文件package.xml,描述软件包,一个CMakeLists.txt,用来构建软件包。
因此,软件包可以定义为:ROS能找到且包含package.xml的目录。
(2)package.xml的详细解释见
http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage
(3)小乌龟样例的软件包为turtlesim,包含turtlesim_node和turtle_teleop_key两个可执行程序
(4)ROS操作软件包的命令:
// 创建,构建软件包并使能
cd ~/catkin_ws
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
catkin_make
source ~/catkin_ws/devel/setup.bash // 将工作空间添加到ROS环境中
rospack list
rospack find turtlesim
rosls turtlesim
roscd turtlesim
rospack depends turtlesim
(5)catkin_make的解释和复杂用法见:
http://wiki.ros.org/cn/ROS/Tutorials/BuildingPackages
http://wiki.ros.org/catkin/commands/catkin_make
catkin_make源码:
https://github.com/ros/catkin/blob/kinetic-devel/bin/catkin_make
2.4 ROS节点管理器和节点
(1)ROS架构图
(2)节点管理器Master,负责管理各节点,实现分布式通信。
启动命令:
roscore
(3)ROS程序的运行实例被称为节点(node)
启动命令:
rosrun package-name executable-name
// 例如2.2节的
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
// 节点重命名
rosrun turtlesim turtlesim_node __name:=my_turtle
节点调试命令:
rosnode list
rosnode info node-name
rosnode kill node-name
rosnode cleanup
2.5 话题Topic和消息msg
(1)话题通信机制
在ROS中,msg有组织地存放在话题topic里。消息传递的理念是:
当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或者多个话题;当一个节点想要接收信息时,它就会订阅(subscribe)它所需要的一个或者多个话题。
节点间是松耦合的,每个节点都不需要显式知道其他节点的存在与否。
ROS节点管理器负责确保发布节点和订阅节点能找到对方。
而且消息是直接地从发布节点传递到订阅节点,中间并不经过节点管理器转交。
(2)可视化查看节点和话题
rosrun rqt_graph rqt_graph
rosrun rqt_plot rqt_plot
(3)消息和话题调试命令
rostopic list
rostopic echo topic-name
rostopic hz topic-name
rostopic bw topic-name
rostopic info topic-name
rostopic type topic-name
rosmsg show message-type-name
// 手动发送消息
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]’
// 对整个拓扑体检
roswtf
(4)消息类型的命名方式
2.6 服务service
(1)服务是一种带有应答(请求和回复)的通信机制,是C/S模式,是同步通信,是一对一的,而话题是异步通信,是广播通信。
(2)服务调试参数
rosservice list
rosservice type [service]
rosservice call [service] [args]
rosservice info [service]
rosservice type /spawn | rossrv show
rossrv show service-data-type-name
rosservice call [service] request-content
rosservice call /spawn 3 3 0 Mikey
2.7 参数param
(1)参数类似于ROS中的全局变量,由ROS Master(参数服务器)进行管理。由于允许节点主动查询其感兴趣的参数的值,它们适用于配置那些不会随时间频繁变更的信息。
参数服务器能够存储整型(integer)、浮点(float)、布尔(boolean)、字典(dictionaries)和列表(list)等数据类型。rosparam使用YAML标记语言的语法。
(2)调试命令
rosparam list
rosparam set [param_name]
rosparam get [param_name]
//修改turtlesim背景颜色为黄色,参数值修改后,需要调用服务/clear才能生效
rosparam set /turtlesim/background_r 255
rosparam set /turtlesim/background_g 255
rosparam set /turtlesim/background_b 0
rosservice call /clear
//获取所有参数
rosparam get /
// 命名空间不是必须
rosparam dump [file_name] [namespace]
rosparam load [file_name] [namespace]
2.8 ROS日志和rqt_console
(1)ROS开发了一套日志系统,支持编程调用,支持可视化查看,这里主要讲后者。分为如下级别,
Fatal (致命)
Error (错误)
Warn (警告)
Info (信息)
Debug (调试)
(2)小乌龟样例中,有个/rosout节点,负责接收各个节点发来的/rosout topic,
并聚合该topic,以/rosout_agg topic发送出去,rqt_console作为一个节点,订阅该日志聚合topic。
rosrun rqt_console rqt_console
设置log等级(点击刷新后,使能):
rosrun rqt_logger_level rqt_logger_level
让小乌龟撞墙,就能看到warn日志,如下
2.9 launch文件和roslaunch
(1)上面的小乌龟样例,都是用roscore和rosrun手动起的,占用窗口多,也比较麻烦。真实的系统,一般都是用launch文件启动,这种启动方式,不需要单独启动节点管理器,而且能一把拉起来多个节点。
(2)launch文件使用XML描述,后缀用.launch,一般在某个软件包的根目录创建launch目录,存放启动文件
cd ~/catkin_ws
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
source devel/setup.bash
roscd beginner_tutorials
mkdir launch
cd launch
touch turtlemimic.launch
turtlemimic.launch内容粗解释:
<launch>
// 此处我们创建了两个分组,并以命名空间(namespace)标签来区分,
// 其中一个名为turtulesim1,另一个名为turtlesim2,两个分组中都有相同的名为sim的turtlesim节点。
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
// 启动模仿节点,话题的输入和输出分别重命名为turtlesim1和turtlesim2,这样就可以让turtlesim2模仿turtlesim1了
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
</launch>
启动和测试
roslaunch beginner_tutorials turtlemimic.launch
rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
(3)关于roslaunch文件更具体的语法规则看《机器人操作系统(ROS)浅析》第六章
总结
利用小乌龟样例,把这些都操作一遍,并记下这些概念,为后面更深入的ROS编程打基础。