ROS机器人操作系统学习记录

Robot Operating System

  • linux和ROS系统的安装
  • linux命令行基础操作
    • 1.基本指令
    • 2. ps:ubuntu与windows互传文件的3种方法
  • C++和python基础
    • 1.python基础
    • 2. C++基础
    • 3. Vim的简单使用
  • ROS简介
    • 1.ROS是什么
    • 2.ROS的目标
    • 3.ROS的核心
      • (1)节点(Node)——执行单元
      • (2)节点管理器(ROS Master)——控制中心
      • (3)话题(Topic)—— 异步通信机制
      • (4)消息(Message)——话题数据
      • (5)服务(Service)——同步通信机制
      • (6)Topic和Service
      • (7)参数(Parameter)——全局共享字典
      • (8)文件系统
    • 4.ROS的工作机制
    • 5.ROS的系统架构
  • ROS基本命令行工具的使用
    • 1.ROS “hello world”小乌龟模拟实验步骤
    • 2.基本指令
      • a.可视化工具==rqt==
      • b.rosnode相关指令
        • rosnode list
        • rosnode info (+某节点)
        • rosnode ping (+某节点)
        • rosnode machine (+某节点)
        • rosnode kill (+某节点)
        • rosnode cleanup (+某节点)
      • c.话题指令rostopic(使用主题与节点交互)
        • rostopic list (查看主题清单)
        • rostopic echo查看节点通过话题发出的消息
        • rostopic pub (-r 频率)发布主题
    • 3.结合小海龟实验的运用
  • 创建工作空间和功能包
    • 创建工作空间
    • 创建功能包
  • 发布者Publisher的编程实现
  • 订阅者Subsciber的编程实现
  • 话题信息的定义和使用
  • 客户端Client的编程实现
  • 服务端Serve的编程实现
  • 参数的使用和编程方法
  • ROS中的坐标系管理系统
  • tf坐标系广播与监的听的编程实现
  • launch启动文件的使用方法
  • 常用可视化工具的使用
  • ROS移动机器人实战

linux和ROS系统的安装

参考链接: 古月·ROS入门21讲 | 一学就会的ROS机器人入门教程.

linux命令行基础操作

参考链接:Linux入门基础命令.

1.基本指令

Ctrl+Alt+t		:	打开终端
Ctrl+d		:关闭终端
(指令 --help)		:	显示指令的说明
pwd		:	显示当前工作目录
cd(+目录):	进入目录
cd ..		:	进入上一级目录
cd -		:	显示上一次访问的目录
clear	:	清除屏幕
ls		:	显示目录下内容
mkdir aaa		:	在当前目录下创建aaa目录,相对路径;
mkdir ./bbb		:	在当前目录下创建bbb目录,相对路径;
mkdir /ccc		:	在根目录下创建ccc目录,绝对路径;
touch	:	创建文件
rm -r	:	删除目录或文件

sudo apt-get update

2. ps:ubuntu与windows互传文件的3种方法

参考文章链接:ubuntu与windows互传文件的3种方法

mv 原先目录 文件的名称   mv tomcat001 tomcat 
mv	/aaa /bbb		:    将根目录下的aaa目录,移动到bbb目录下(假如没有bbb目录,则重命名为bbb);
mv	bbbb usr/bbb	:	将当前目录下的bbbb目录,移动到usr目录下,并且修改名称为bbb;
mv	bbb usr/aaa		:	将当前目录下的bbbb目录,移动到usr目录下,并且修改名称为aaa;

C++和python基础

(下载前设置软件源:清华或者阿里云)
编译器安装

sudo apt-get install g++
sudo apt-get install python

1.python基础

学习网站: 菜鸟教程.

2. C++基础

学习链接: l小甲鱼C++快速入门.

3. Vim的简单使用

参考链接:vim编辑器编写c代码步骤.

ROS简介

1.ROS是什么

ROS(Robot Operating System,下文简称“ROS”)是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。
简要解释ROS:

  1. 通道:ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系。

  2. 工具:ROS提供了大量的工具组合用以配置、启动、自检、调试、可视化、登录、测试、终止分布式计算系统。

  3. 强大的库:ROS提供了广泛的库文件实现以机动性、操作控制、感知为主的机器人功能。

  4. 生态系统:ROS的支持与发展依托着一个强大的社区。ros.org尤其关注兼容性和支持文档,提供了一套“一站式”的方案使得用户得以搜索并学习来自全球开发者数以千计的ROS程序包。

2.ROS的目标

ROS 的主要目标是为机器人研究和开发提供代码复用的支持。ROS是一个分布式的进程(也就是“节点”)框架,这些进程被封装在易于被分享和发布的程序包和功能包中。ROS也支持一种类似于代码储存库的联合系统,这个系统也可以实现工程的协作及发布。这个设计可以使一个工程的开发和实现从文件系统到用户接口完全独立决策(不受ROS限制)。同时,所有的工程都可以被ROS的基础工具整合在一起。
ROS的首要目标是提供一套统一的开源程序框架,用以在多样化的现实世界与仿真环境中实现对机器人的控制。

3.ROS的核心

ROS的核心是节点(node)。节点是一小段用Python或C++写成的程序,用来执行某个相对简单的任务或进程。多个节点之间互相传递信息(message),并可以独立控制启动或终止。某一节点可以面向其它节点针对特定标题(topic)发布信息或提供服务(service)。

例如:现有以节点将传感器读数传递至机器人控制器,在“/head_sonar标题“下存在一条信息包含有变量值“0.5“,即意味着传感器检测到的当前物体距离为0.5米。任何一个想要知道该传感器读数的节点都只要订阅(subscribe)/head_sonar标题即可。为了便于使用该读数,针对该订阅者的节点会定义一个回调函数,每当有新的信息传递到订阅者标题时,即执行该函数。上述流程的运行频率取决于发布者节点(publisher node)更新信息的频率。

此外,节点还可以用来定义一个或多个服务(service)。ROS中服务的作用是在接收到来自其它节点的请求时回复该节点或执行某项任务。例如:控制LED灯的开关是一个服务;移动机器人在给定起始和目标位置的条件下返回导航路线规划也是一个服务。

(1)节点(Node)——执行单元

1.执行具体任务的进程,独立运行的可执行文件
2.不同节点可使用不同的编程语言,可分布式运行在不同主机
3.节点在系统中的名称必须唯一

(2)节点管理器(ROS Master)——控制中心

:为节点提供命名和注册服务
:跟踪和记录话题就/通信服务,辅助节点相互查找,建立连接
:提供参数服务器,节点使用服务器存储和检索运行时的参数

(3)话题(Topic)—— 异步通信机制

:节点间用来传输数据的重要总线
:使用发布/订阅模型,数据有发布者传输到订阅者,同一个话题的订阅者可以不唯一;

(4)消息(Message)——话题数据

:具有一定的类型和数据结构,包括ROS提供的标准用户自定义类型
:使用编程语言无关的.msg文件定义,编译过程生成对应的代码文件

(5)服务(Service)——同步通信机制

:使用客户端/服务器(C/S)模型,客户端发送请求数据,服务端完成处理后返回应答数据;
:使用编程语言无关的.src文件定义请求和应答数据结构,编译过程中生成对应的代码文件

(6)Topic和Service

ROS机器人操作系统学习记录_第1张图片

(7)参数(Parameter)——全局共享字典

:可通过网络访问的共享,多变量字典
:节点使用此服务器来存储和检索运行时的参数
:适合存储静态,非二进制的配置参数,不适合存储动态配置的数据

(8)文件系统

ROS机器人操作系统学习记录_第2张图片
元功能包
功能包
功能包清单

4.ROS的工作机制

参考文章:ROS是什么

5.ROS的系统架构

参考文章: ROS的系统架构.

ROS基本命令行工具的使用

//2022.4.6

1.ROS “hello world”小乌龟模拟实验步骤

  先后打开终端分别输入命令(打开Ctrl+Alt+t)
  注意,每输入一个命令都需要重新打开一个终端。
  因为这里的每一条命令都会对终端占用。
1启动ROS Master
roscore

2 启动小乌龟仿真器
rosrun turtlesim turtlesim_node

3 启动小乌龟控制节点
rosrun turtlesim turtle_teleop_key
这个终端窗口必须置顶才能键盘控制

rqt_graph//打开节点图可以更直观地看到这两个节点间传递消息的主题(基于QT的可视化工具)

  turtlesim是一个功能包;先打开turtlesim_node节点(小乌龟);再打开turtle_teleop_key节点(键盘控制)

ps:

/teleop_tutle:键盘控制节点
/turtlesim:仿真器节点
/turtle/cmd_vel:一个话题
键盘控制节点将输入的指令打包成话题传给仿真器节点
roscore指令是在运行ROS操作系统首先运行的指令;
rosrun指令(启动新节点)是运行ROS某个功能包的某个节点的指令,后面加的参数是功能包名和节点名;

运行成功如图:
ROS机器人操作系统学习记录_第3张图片

按下Tab键可以查看功能包包含的节点ROS机器人操作系统学习记录_第4张图片

2.基本指令

a.可视化工具rqt

(1)rqt_graph

rqt_graph

显示当前正在运行的节点关系图

(2)rqt_plot

rqt_plot

b.rosnode相关指令

list和info比较常用

rosnode list

rosnode list:获取正在运行的节点
ps:/rosout:这个节点始终是有的,随着roscore的运行而运行;

rosnode info (+某节点)

rosnode info node1:查看节点“node1”的具体信息

rosnode ping (+某节点)

rosnode machine (+某节点)

rosnode kill (+某节点)

rosnode cleanup (+某节点)

c.话题指令rostopic(使用主题与节点交互)

rostopic list (查看主题清单)

 rostopic list

rostopic echo查看节点通过话题发出的消息

rostopic echo

rostopic pub (-r 频率)发布主题

3.结合小海龟实验的运用

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
rqt_graph

ROS机器人操作系统学习记录_第5张图片
图片表示两个节点话题进行通讯;

rosnode list

在这里插入图片描述
/rosout:这个节点始终是有的,随着roscore的运行而运行;

rosrun info /turtlesim
Publications: (发布的话题)
 * /rosout [rosgraph_msgs/Log]
 * /turtle1/color_sensor [turtlesim/Color]
 * /turtle1/pose [turtlesim/Pose]

Subscriptions: (订阅的话题)
 * /turtle1/cmd_vel [geometry_msgs/Twist]

Services: (提供的服务)
 * /clear
 * /kill
 * /reset
 * /spawn
 * /turtle1/set_pen
 * /turtle1/teleport_absolute
 * /turtle1/teleport_relative
 * /turtlesim/get_loggers
 * /turtlesim/set_logger_level

rostopic list
//列出当前话题
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
//Tab键补全
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist(消息结构) "linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0" 
(linear线速度angular角速度)
rostopic pub -r 10 加频率实现循环
rosmsg show geometry_msgs/Twist查看消息结构
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z
rosservice list服务列表
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn产生
/teleop_turtle/get_loggers
/teleop_turtle/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level
rosservice call 服务名
//请求服务

召唤第二只小海龟

rosservice call /spawn "x: 2.0
y: 2.0
theta: 2.0
name: 'turtle2'" 
name: "turtle2"

保存数据
== -a是全部保存 -大o是以压缩包形式保存==
== Enter后要加Ctrl+C==

rosbag record -a -O 压缩包名

播放数据

rosbag play 压缩包名

创建工作空间和功能包

创建工作空间

一共要创建4个文件夹(主工作空间下)
src:代码空间
build:编译空间
devel:开发空间
install:安装空间
1.mkdir 一个工作空间workspace1(自定义文件名)
2.cd workspace并mkdir src(放工程包和源码,只能叫src)
3.catkin_init_workspace(指令)初始化
4.cd到workspace1,输入catkin_make(指令),会创建出bulid和devel文件夹
5.输入catkin_make install,会创建出install文件夹

简而言之
1.mkdir 自定义文件夹(现在的根目录)
2.根目录下分别输入catkin_make和catkin_make install命令创建bulid,devel和install文件夹
3.根目录下mkdir src文件夹,用catkin_init_workspace命令初始化src文件夹

创建功能包

发布者Publisher的编程实现

#include "ros/ros.h"
#include "std_msgs/String.h"
#include 
int main(int argc, char *argv[])
{
    /* code */
    ros::init(argc,argv,"erGouZi");

    ros::NodeHandle nh;

    ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);

    std_msgs::String msg;

    ros::Rate rate(10);

    int count = 0;

    while(ros::ok())
    {
        count++;
        //msg.data = "hello";
        std::stringstream ss;
        ss << "hello" << count;
        msg.data = ss.str();
        pub.publish(msg);
        ROS_INFO("%s",ss.str().c_str());

        rate.sleep();
    }

    return 0;
}

订阅者Subsciber的编程实现

#include "ros/ros.h"
#include "std_msgs/String.h"

//using namespace ros;

void doMsg(const std_msgs::String:: ConstPtr &msg){
    ROS_INFO("cuihua dingyue de shuju:%s",msg->data.c_str());
}


int main(int argc, char *argv[])
{
    /* code */
    ros::init(argc,argv,"cuiHua");

    ros::NodeHandle nh;
    ros::Subscriber sub = nh.subscribe("fang",10,doMsg);

    ros::spin();
    return 0;
}

话题信息的定义和使用

客户端Client的编程实现

服务端Serve的编程实现

参数的使用和编程方法

ROS中的坐标系管理系统

tf坐标系广播与监的听的编程实现

launch启动文件的使用方法

常用可视化工具的使用

ROS移动机器人实战

你可能感兴趣的:(ROS,python,c++,人工智能,物联网,嵌入式硬件)