ROS高效入门第二章 -- 基本概念和常用命令学习,基于小乌龟样例

1 资料

本节主要参考如下资料:
(1)《机器人操作系统(ROS)浅析》[美] Jason M. O’Kane 著 肖军浩 译
(2)《ROS机器人开发实践》胡春旭
(3)ros Tutorials 初级教程的1~9节:http://wiki.ros.org/cn/ROS/Tutorials
(4)喜欢视频的还可以看:
https://www.bilibili.com/video/av59458869/
古月·ROS入门21讲 | 一学就会的ROS机器人入门教程 前9节

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编程打基础。

猜你喜欢

转载自blog.csdn.net/cy1641395022/article/details/130205195
今日推荐