【ROS】基础(一)

文章目录

  • 1 基本命令
    • 1.1 启动
    • 1.2 查看系统中的计算图
    • 1.3 rosnode
    • 1.4 rostopic
    • 1.5 rosmsg
    • 1.6 rosservice
    • 1.7 话题记录和复现:rosbag
  • 2 创建工作空间和编译功能包
    • 简明版
      • 单编
    • 2.1 创建工作空间
    • 2.2 创建功能包
    • 2.3 设置和检查环境变量
    • 2.4 功能包中的两个重要文件
      • 2.4.1 package.xml
      • 2.4.2 CMakeLists.txt
  • ROS安装问题
    • rosdep(安装系统依赖)
  • 古月居ROS机器人21讲
  • 查看CMakeLists.txt,确保声明顺序如下:
  • 3 ros的C++代码

1 基本命令

workspace(ROS的工作空间)
├── build(在工作空间中执行catkin_make时,会在build中创建一系列的中间编译文件和中间缓存文件)
├── devel(用于存储编译成功的目标可执行文件)
│ ├── setup.bash
└── src(用于存储新创建的程序包)
├── CMakeLists.txt
├── pkg1
│ ├── CMakeLists.txt
│ ├── include
│ ├── package.xml
│ └── src
├── pkg2
│ ├── CMakeLists.txt
│ ├── include
│ ├── package.xml
│ └── src
└── pkg3
├── CMakeLists.txt
├── include
├── package.xml
└── src

1.1 启动

# 1.启动ROS Master
roscore
# 2.启动小海龟仿真器
rosrun turtlesim turtlesim_node
# 3.启动海龟控制节点
rosrun turtlesim turtle_teleop_key

1.2 查看系统中的计算图

  • 可以清晰地了解系统节点间通信的部分信息。
  • teleop_turtle节点(键盘控制节点)通过cmd_vel(topic)向turtlesim节点(海归仿真器节点)发出消息,使得小海龟移动。
rqt_graph # 查看系统中的计算图

1.3 rosnode

# 显示节点列表
rosnode list

# 查看节点的具体信息
rosnode info /节点名

1.4 rostopic

# 显示topic列表
rostopic list

# 手动发布数据给topic
rostopic pub (参数) 话题名 消息数据结构 “具体数据”
rostopic pub -r 5 /turtle1/cmd_vel geometry_msgs/Twist "linear:
  x: 1.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0"

【ROS】基础(一)_第1张图片

1.5 rosmsg

# 查看消息数据结构
rosmsg show geometry_msgs/Twist

【ROS】基础(一)_第2张图片

1.6 rosservice

# 查看服务列表
rosservice list

# 在服务列表中,有个/spawn服务,可以产生一只新的海龟
rosservice call (参数) 服务名 “具体数据”

【ROS】基础(一)_第3张图片

1.7 话题记录和复现:rosbag

试想我们尝试让海龟以我们指定的路径移动了一回,我们想要把它 记录下来,拷贝到自己的实验室再复现出来,我们就可以使用话题记录功能。

# 比如我们使用之前打开的键盘操作器让海龟移动一圈并记录下来:
rosbag record -a -O 文件名

【ROS】基础(一)_第4张图片
重新开启roscore,开启海龟节点rosrun turtlesim turtlesim_node

# 复现之前的移动
rosbag play cmd_record

2 创建工作空间和编译功能包

工作空间(Workspace):存放工程开发相关文件的文件夹。类似一个IDE(例如Pycharm)新建一个工程,就是一个工作空间。包含4个文件夹:

  • src:代码空间(Source Space):放置功能包代码
  • build:编译空间(Build Space):编译过程中产生的中间文件,不用过多关注
  • devel:开发空间(Development Space):放置编译生成的可执行文件、库、脚本
  • install:安装空间(Install Space):存放可执行文件,与上面有一定重复
    【ROS】基础(一)_第5张图片

简明版

ROS工作空间结构(workspace):

src:代码空间
build:编译空间(编译产生中间文件)
devel:开发空间(编译生成可执行文件、库、脚本)
install:安装空间(安装库的空间,与devel部分冲突)

创建空间:

$ mkdir catkin_ws  //主目录下创建工作文件夹
$ cd catkin_ws
$ mkdir src  //创建代码编译空间
$ cd src
$ catkin_init_workspace //当前文件夹初始化,变成ros工作空间
$ cd ..
$ catkin_make  //编译ros,生成对应文件夹
$ catkin_make install  //产生install工作空间(可写可不写)

单编

每次都使用catkin_make的话效率十分低下,因为这种编译方法会编译工作空间下的所有的包

cd ~/catkin_ws/
catkin_make -DCATKIN_WHITELIST_PACKAGES=" beginner_tutorials"

如果需要编译两个或者多个只需要中间加分号即可:

catkin_make -DCATKIN_WHITELIST_PACKAGES="pkg1; pkg2",

创建功能包:

$ cd ~/catkin_ws/src
$ catkin_create_pkg test_pkg std_msgs rospy roscpp  //[test_pkg:包名 std_msgs rospy roscpp:依赖]

编译功能包:

$ cd ..   //回到catkin_ws目录
$ catkin_make  //编译

设置环境变量:
方案一(环境变量只适用于当前终端)

$ source devel/setup.bash
$ source ~/.bash 

方案二(适应于整个计算机)

$ echo "source ~/tutorial_ws/devel/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

检查环境变量:

$ echo $ROS_PACKAGE_PATH:
输出:/home/tom/catkin_ws/src:/opt/ros/noetic/share

注:运行ros的py文件:
1.

$ rosrun learning_topic velocity_publisher.py 
提示错误:
/usr/bin/env: “python”: 没有那个文件或目录	

解决方法:python文件头加:

#!/usr/bin/env python3

2
python文件中出现汉语注释时:
需要在文件头部添加:

# -*- coding: utf-8 -*-

2.1 创建工作空间

创建

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace # 将当前文件夹变为工作空间,使其拥有工作空间的属性
  • 注1:“~/”意为当前用户名目录;“-p”意为递归创建目录,即直接创建多级目录。
  • 注2:src文件夹即代码空间,不能自行用别的名称代替

编译空代码的工作空间

# 要编译工作空间,先要回到工作空间的根目录。
cd ~/catkin_ws
catkin_make # catkin_make为编译指令,将src里的源码都进行编译。

【ROS】基础(一)_第6张图片
可以看到生成了build和devel两个新文件夹,devel存放了编译完成的内容。
这里没有生成install文件夹,要生成install文件夹,输入catkin_make install:

catkin_make install

【ROS】基础(一)_第7张图片

2.2 创建功能包

功能包是放置ROS源码的最小单元。
上面我们创建了一个空的工作空间,src文件夹里面没写东西,现在我们创建一个自己的功能包。
注意同一工作空间下,不允许存在同名功能包;不同工作空间下,允许存在同名功能包。

创建

catkin_create_pkg  [depend1] [depend2] [depend3]
# 为包名
# [depend]为依赖,即指明编译的时候需要ROS中的其他功能包,如需要调用python、C++库,就要指明rospy、roscpp。

我们创建功能包:

cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs rospy roscpp

【ROS】基础(一)_第8张图片
编译新的功能包

回到工作空间根目录,再编译一下。

cd ~/catkin_ws
catkin_make

2.3 设置和检查环境变量

设置
编译完功能包后,为了运行,先设置环境变量,以便系统找到我们的工作空间和功能包。

source ~/catkin_ws/devel/setup.bash

检查
echo为打开环境变量,通过 ROS_PACKAGE_PATH 查找所有ros功能包的路径。

echo $ROS_PACKAGE_PATH 

前面source了 devel/setup.bash ,现在就会包含这个路径:
【ROS】基础(一)_第9张图片

2.4 功能包中的两个重要文件

2.4.1 package.xml

使用xml语言描述功能包相关的信息:
【ROS】基础(一)_第10张图片

【ROS】基础(一)_第11张图片

2.4.2 CMakeLists.txt

描述功能包里的编译规则,使用CMake语法。
【ROS】基础(一)_第12张图片

ROS安装问题

  • 依赖问题

下列软件包有未满足的依赖关系:
ros-noetic-desktop-full : 依赖: ros-noetic-desktop 但是它将不会被安装
依赖: ros-noetic-perception 但是它将不会被安装
依赖: ros-noetic-simulators 但是它将不会被安装
依赖: ros-noetic-urdf-sim-tutorial 但是它将不会被安装
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。

根据报错,一路安装下去,我的是最后会有一个依赖项的保本过高,我降级了之后就能够安装了 下列软件包有未满足的依赖关系: libgpgme-dev : 依赖: libgpgme11 (= 1.10.0-1ubuntu2) 但是 1.10.0-1ubuntu2.1 正要被安装

提示依赖什么,就安装依赖库及其版本号(低的那个)!

rosdep(安装系统依赖)

rosdep安装系统依赖 && rosdepc

  • rosdep是ros一个命令行工具,用于安装系统依赖,具体地说,就是ros包的依赖。

rosdep的安装

Rosdep可以使用apt或pip进行安装
对于不同版本的ros,使用apt安装方法如下:

# ROS Noetic
sudo apt-get install python3-rosdep
# ROS Melodic and earlier
sudo apt-get install python-rosdep

建议使用apt进行安装,使用apt安装后rosdep可以自动地更新
使用pip安装

sudo pip install -U rosdep

也可以使用源代码安装rosdep,安装方法如下:(假设源代码被clone到了rosdep目录下)

git clone https://github.com/ros-infrastructure/rosdep
cd rosdep
source setup.sh

rosdep的初始化

安装或更新完rosdep后需要使用下面的命令初始化

sudo rosdep init
rosdep update

注意:rosdep update命令前不能加sudo


rosdep的使用

rosdep和catkin一样都可以用来构建ros包,使用方法如下:

rosdep install PACKAGE_NAME

rosdep的主要用途是安装工作空间中ros包的依赖,首先切换到工作空间下,然后运行下述命令即可安装该工作空间的所有依赖:

rosdep install --from-paths src --ignore-src -r -y

古月居ROS机器人21讲

【ROS学习笔记】1.Ubuntu的配置(虚拟机)和常用命令

【ROS学习笔记】2.ROS安装、关于ubuntu的环境变量

【ROS学习笔记】3.(理论)什么是ROS以及一些核心概念

【ROS学习笔记】4.玩转小海龟——ROS命令行工具

【ROS学习笔记】5.创建工作空间和编译功能包

查看CMakeLists.txt,确保声明顺序如下:

find_package()
catkin_package()
include_directories()
add_executable()
target_link_libraries()

3 ros的C++代码

ros::spin() 和 ros::spinOnce() 区别及详解

你可能感兴趣的:(c++)