ROS 官网教程01-基础概念和操作

ROS 官网教程01-基础概念和操作

一、安装和配置ROS环境

1.1 安装 ROS

ROS安装选择介绍了不同ROS安装版本

序号 名称 发布时间 支持时间 操作系统支持
1 ROS Melodic Morenia 发布于2018年5月 LTS长期支持到2023年5月 建议在Ubuntu 18.04上安装
2 ROS Noetic Ninjemys 发布于2020年5月 最新的LTS长期支持到2025年5月 建议在Ubuntu 20.04上安装

可以通过如下命令查看系统版本,当前版本为 20.04,根据建议,安装了 ROS Noetic

❯❯ ~ sudo lsb_release -a
[sudo] password for parallels: 
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 20.04.3 LTS
Release:	20.04
Codename:	focal

Ubuntu 不同版本代号

  • Ubuntu 12.04 (LTS)代号为precise。
  • Ubuntu 14.04 (LTS)代号为trusty。
  • Ubuntu 15.04 代号为vivid。
  • Ubuntu 15.10 代号为wily。狡猾的
  • Ubuntu 16.04 (LTS)代号为xenial。好客的
  • Ubuntu 18.04 代号bionic 仿生的
  • Ubuntu 20.04 代号focal

ROS安装方法参考在 Ubuntu 上安装 ROS Noetic

1.2 管理环境

  • 环境变量管理用途
    ROS依赖于使用shell环境组合空间的概念,这使得针对不同版本的ROS或不同的软件包集开发变得更加容易。

  • 环境变量设置文件来源

    1. 用软件包管理器安装的ROS软件包已经提供了setup.*sh文件
    2. 在rosbuild workspaces中使用类似rosws的工具生成(rosbuild工具不再维护不推荐)
    3. 编译或安装catkin软件包时自动生成(catkin现在是组织代码的推荐方式,它使用更标准的CMake约定,并具有更大的灵活性)
  • 设置环境变量
    通过Ubuntu上的apt工具来安装ROS的,那么你将会在/opt/ros//目录中看到setup.*sh文件,以执行下面的source命令:

    $ source /opt/ros/noetic/setup.bash
    

    在每次打开终端时你都需要先运行上面这条后才能访问ROS相关的命令,为了避免这一繁琐过程,你可以事先在.bashrc文件中添加这条命令。

  • 测试是否正确配置了环境

    ❯❯ ~  17:00 printenv | grep ROS
    ROS_VERSION=1
    ROS_PYTHON_VERSION=3
    ROS_PACKAGE_PATH=/opt/ros/noetic/share
    ROSLISP_PACKAGE_DIRECTORIES=
    ROS_ETC_DIR=/opt/ros/noetic/etc/ros
    ROS_MASTER_URI=http://localhost:11311
    CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
    ROS_ROOT=/opt/ros/noetic/share/ros
    ROS_DISTRO=noetic
    

1.3 创建 ROS 空间

  • Catkin适用性
    • 操作方法只适用于ROS Groovy及更新版本
    • 对于ROS Fuerte及早期版本,请选择rosbuild。
  • 创建和构建一个 catkin 工作空间
    $ mkdir -p ~/catkin_ws/src
    $ cd ~/catkin_ws/
    $ catkin_make
    
    创建完,catkin_ws 目录结构如下(build子文件夹有删减)
    ❯ catkin_ws  17:18 tree
    ├── build
    │   ├── atomic_configure
    │   ├── bin
    │   ├── catkin
    │   ├── catkin_generated
    │   ├── CATKIN_IGNORE
    │   ├── catkin_make.cache
    │   ├── CMakeCache.txt
    │   ├── cmake_install.cmake
    │   ├── CTestConfiguration.ini
    │   ├── CTestCustom.cmake
    │   ├── CTestTestfile.cmake
    │   ├── gtest
    │   ├── Makefile
    │   └── test_results
    ├── devel
    │   ├── cmake.lock
    │   ├── env.sh
    │   ├── lib
    │   ├── local_setup.bash
    │   ├── local_setup.sh
    │   ├── local_setup.zsh
    │   ├── setup.bash
    │   ├── setup.sh
    │   ├── _setup_util.py
    │   └── setup.zsh
    └── src
        └── CMakeLists.txt -> /opt/ros/noetic/share/catkin/cmake/toplevel.cmake
    
    • src目录下创建一个CMakeLists.txt的链接。
    • source devel/setup.bash可将当前工作空间设置在环境最顶层
    • 要保证工作区被安装脚本正确覆盖,需确定ROS_PACKAGE_PATH环境变量包含你当前的工作空间目录:
    $ echo $ROS_PACKAGE_PATH
    /home/<username>/catkin_ws/src:/opt/ros/<distro>/share
    

至此,环境已搭建好。

二、ROS文件系统导览

2.1 文件系统概念

  • 软件包(Packages):包是ROS代码的软件组织单元,每个软件包都可以包含程序库、可执行文件、脚本或其他构件。
  • Manifests (package.xml): 清单(Manifest)是对软件包的描述。它用于定义软件包之间的依赖关系,并记录有关软件包的元信息,如版本、维护者、许可证等。

2.2 文件系统工具

程序代码散落在许多ROS包中。使用Linux内置命令行工具(如ls和cd)来进行查找和导航可能非常繁琐,因此ROS提供了专门的命令工具来简化这些操作1

  • rospack = ros + pack(age) - rospack允许你获取软件包的有关信息。
    • 查找是否存在该报,存在返回地址 rospack find roscpp
  • roscd = ros + cd - 允许你直接切换目录(cd)到某个软件包或者软件包集当中
    • 切换到软件包 roscd roscpp
    • roscd只能切换到那些路径已经包含在ROS_PACKAGE_PATH环境变量中的软件包
    • 切换到软件包子目录roscd roscpp/cmake
    • 存储ROS日志文件的目录 roscd log,但若未执行任何 ROS 程序,系统会报错该目录不存在
  • rosls = ros + ls - 直接按软件包的名称执行 ls 命令(而不必输入绝对路径)
    • 查看roscpp_tutorials组成 rosls roscpp_tutorials

三、创建ROS软件包

3.1 创建 catkin 软件包

# 1. 根据 1.3 已经创建了一个空白的工作空间
$ cd ~/catkin_ws/src
# 2. catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
# 3. 生效工作区配置文件
$ . ~/catkin_ws/devel/setup.bash

3.2 查看软件包依赖关系

# 查看一级依赖
rospack depends1 beginner_tutorials
# 查看间接依赖
rospack depends beginner_tutorials
# 

beginner_tutorials 的一级依赖运行为catkin_create_pkg命令时作为参数的依赖包,同样可以在 package.xml 文件中查看

$ roscd beginner_tutorials
$ cat package.xml
<package>
...
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
...
</package>

3.3 catkin 软件包组成

  • 这个包必须有一个符合catkin规范的package.xml文件
  • 这个包必须有一个catkin版本的CMakeLists.txt文件
  • 每个包必须有自己的目录

最简单的软件包看起来就像这样:

my_package/
  CMakeLists.txt
  package.xml

package.xml的组成部分

  • 描述标签
  • 维护者标签
  • 许可证标签
  • 依赖项标签

最终 package.xml

<?xml version="1.0"?>
<package format="2">
  <name>beginner_tutorials</name>
  <version>0.1.0</version>
  <description>The beginner_tutorials package</description>
  <maintainer email="parallels@todo.todo">parallels</maintainer>
  <license>BSD</license>
  <url type="website">http://wiki.ros.org/beginner_tutorials</url>
  <author email="jane.doe@example.com">Jane Doe</author>
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>
</package>

四、构建ROS软件包

4.1 catkin_make 构建软件包

CMake工作流程

# 在CMake工作空间下
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make install  # (可选)

工作空间有多个软件包时,则需要每个 package 都需使用 cmake 编译

workspace_folder/        -- WORKSPACE
  src/                   -- SOURCE SPACE
    CMakeLists.txt       -- 'Toplevel' CMake file, provided by catkin
    package_1/
      CMakeLists.txt     -- CMakeLists.txt file for package_1
      package.xml        -- Package manifest for package_1
    ...
    package_n/
      CMakeLists.txt     -- CMakeLists.txt file for package_n
      package.xml        -- Package manifest for package_n

而多个 catkin 项目放在工作空间,可以通过 catkin_make 一起构建

# 在catkin工作空间下
$ catkin_make
$ catkin_make install  # (可选)

若catkin项目没有放在工作空间的 catkin/src 目录下,比如 my_src 下,可以这样使用 catkin_make:

# 在catkin工作空间下
$ catkin_make --source my_src
$ catkin_make install --source my_src  # (可选)

对于catkin_make的高级用法,请参考catkin/commands/catkin_make

4.2 开始构建你的软件包

# 进入 catkin 工作空间
❯❯ catkin_ws  10:23 catkin_make
Base path: /home/parallels/catkin_ws
Source space: /home/parallels/catkin_ws/src
Build space: /home/parallels/catkin_ws/build
Devel space: /home/parallels/catkin_ws/devel
Install space: /home/parallels/catkin_ws/install
####
#### Running command: "cmake /home/parallels/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/parallels/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/parallels/catkin_ws/install -G Unix Makefiles" in "/home/parallels/catkin_ws/build"
####
-- Using CATKIN_DEVEL_PREFIX: /home/parallels/catkin_ws/devel
-- Using CMAKE_PREFIX_PATH: /home/parallels/catkin_ws/devel;/opt/ros/noetic
-- This workspace overlays: /home/parallels/catkin_ws/devel;/opt/ros/noetic
-- Found PythonInterp: /usr/bin/python3 (found suitable version "3.8.10", minimum required is "3") 
-- Using PYTHON_EXECUTABLE: /usr/bin/python3
-- Using Debian Python package layout
-- Using empy: /usr/lib/python3/dist-packages/em.py
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/parallels/catkin_ws/build/test_results
-- Forcing gtest/gmock from source, though one was otherwise available.
-- Found gtest sources under '/usr/src/googletest': gtests will be built
-- Found gmock sources under '/usr/src/googletest': gmock will be built
-- Found PythonInterp: /usr/bin/python3 (found version "3.8.10") 
-- Using Python nosetests: /usr/bin/nosetests3
-- catkin 0.8.10
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~  traversing 1 packages in topological order:
-- ~~  - beginner_tutorials
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'beginner_tutorials'
-- ==> add_subdirectory(beginner_tutorials)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/parallels/catkin_ws/build
####
#### Running command: "make -j2 -l2" in "/home/parallels/catkin_ws/build"
####

五、理解 ROS 节点

节点:ROS软件包中的一个可执行文件。节点组成通过话题、服务和动作与其他节点之间沟通2

**注:**节点是ROS中非常重要的一个概念,为了帮助初学者理解这个概念,这里举一个通俗的例子:

例如,咱们有一个机器人,和一个遥控器,那么这个机器人和遥控器开始工作后,就是两个节点。遥控器起到了下达指 令的作用;机器人负责监听遥控器下达的指令,完成相应动作。从这里我们可以看出,节点是一个能执行特定工作任 务的工作单元,并且能够相互通信,从而实现一个机器人系统整体的功能。在这里我们把遥控器和机器人简单定义为两个节点,实际上在机器人中根据控制器、传感器、执行机构等不同组成模块,还可以将其进一步细分为更多的节点,这个是根据用户编写的程序来定义的。)

Understanding nodes — ROS 2 Documentation: Foxy documentation
Understanding nodes — ROS 2 Documentation: Foxy documentation

:beetle:注意: 当打开一个新的终端时,环境将会重置,~/.bashrc文件将会生效。如果你在运行rosnode等命令时出现一些问题,那么可能需要将一些环境设置文件添加到~/.bashrc或手动source一下。

5.1 使用 roscore 和 rosnode

  1. roscore 运行所有 ROS 程序前首先要运行的命令
  2. 打开一个新终端,查看正在运行的节点 rosnode list
  3. 查看节点信息 rosnode info /rosout
❯❯ ~  11:01 rosnode list
/rosout
❯❯ ~  11:22 rosnode info /rosput
--------------------------------------------------------------------------------
Node [/rosput]
Publications: None

Subscriptions: None

Services: None

cannot contact [/rosput]: unknown node
❯❯ ~  11:22 rosnode info /rosout
--------------------------------------------------------------------------------
Node [/rosout]
Publications: 
 * /rosout_agg [rosgraph_msgs/Log]

Subscriptions: 
 * /rosout [unknown type]

Services: 
 * /rosout/get_loggers
 * /rosout/set_logger_level


contacting node http://parallels-Parallels-Virtual-Platform:32807/ ...
Pid: 666828

 

5.2 使用 rosrun 调出另一个节点

# rosrun [package_name] [node_name]
$ rosrun turtlesim turtlesim_node
[ INFO] [1659065048.445958101]: Starting turtlesim with node name /turtlesim
[ INFO] [1659065048.448815720]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]

# 在另一个新终端输入
❯❯ ~  11:24 rosnode list
/rosout
/turtlesim
❯❯ ~  11:24 rosnode info /turtlesim 
--------------------------------------------------------------------------------
Node [/turtlesim]
Publications: 
 * /rosout [rosgraph_msgs/Log]
 * /turtle1/color_sensor [turtlesim/Color]
 * /turtle1/pose [turtlesim/Pose]

Subscriptions: 
 * /turtle1/cmd_vel [unknown type]

Services: 
 * /clear
 * /kill
 * /reset
 * /spawn
 * /turtle1/set_pen
 * /turtle1/teleport_absolute
 * /turtle1/teleport_relative
 * /turtlesim/get_loggers
 * /turtlesim/set_logger_level

contacting node http://parallels-Parallels-Virtual-Platform:46477/ ...
Pid: 667294
Connections:
 * topic: /rosout
    * to: /rosout
    * direction: outbound (47805 - 127.0.0.1:54948) [24]
    * transport: TCPROS

# 重新分配节点名称
$ rosrun turtlesim turtlesim_node __name:=my_turtle
# 在另一个新终端输入
❯❯ ~  11:25 rosnode list
/my_turtle
/rosout
❯❯ ~  11:26 rosnode ping /my_turtle 
rosnode: node is [/my_turtle]
pinging /my_turtle with a timeout of 3.0s
xmlrpc reply from http://parallels-Parallels-Virtual-Platform:45429/	time=0.354767ms
xmlrpc reply from http://parallels-Parallels-Virtual-Platform:45429/	time=0.339270ms
xmlrpc reply from http://parallels-Parallels-Virtual-Platform:45429/	time=0.329971ms

在 ubuntu 中,可以使用 Ctrl+Shift+C 可以关掉节点。

六、理解 ROS 话题和消息

6.1 引例 - 通过键盘控制乌龟移动

  1. 运行 roscore,若上一节未退出,则即可,重复输入启动命令,会报错
  2. 打开 turtlesim 包下的 turtlesim_node 节点,rosrun turtlesim turtlesim_node
  3. 通过键盘控制 turtle,rosrun turtlesim turtle_teleop_key, 按键盘上方向键,可以控制乌龟移动

:warning: 注意:请选中turtle_teleop_key的终端窗口(是中断窗口而非图形界面窗口)以确保按键输入能够被捕获。

  1. rosrun rqt_graph rqt_graph ,使用rqt_graph来显示当前运行的节点和话题。

以上,建立了两个节点,而turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来相互通信的。turtle_teleop_key在话题上发布键盘按下的消息,turtlesim订阅该话题以接收消息。

$ rostopic -h
rostopic is a command-line tool for printing information about ROS Topics.

Commands:
	rostopic bw	display bandwidth used by topic
	rostopic delay	display delay of topic from timestamp in header
	rostopic echo	print messages to screen
	rostopic find	find topics by type
	rostopic hz	display publishing rate of topic    
	rostopic info	print information about active topic
	rostopic list	list active topics
	rostopic pub	publish data to topic
	rostopic type	print topic or field type

Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h

6.2 话题和话题消息类型

命令

# rostopic list - 列出当前已被订阅和发布的所有话题。
# rostopic type - 查看所发布话题的消息类型

使用

❯❯ ~  11:27 rostopic list -v

Published topics:
 * /rosout_agg [rosgraph_msgs/Log] 1 publisher
 * /rosout [rosgraph_msgs/Log] 2 publishers
 * /turtle1/pose [turtlesim/Pose] 2 publishers
 * /turtle1/color_sensor [turtlesim/Color] 2 publishers

Subscribed topics:
 * /rosout [rosgraph_msgs/Log] 1 subscriber
 * /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers

# 查看 /turtle1/cmd_vel 话题上,发布的消息类型
❯❯ ~  13:13 rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
# 使用rosmsg查看消息的详细信息
❯❯ ~  13:15 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

6.3 发布话题消息和频率

命令

# rostopic pub [topic] [msg_type] [args] - 把数据发布到当前某个正在广播的话题上
# rostopic hz [topic] - 报告数据发布的速率

使用

❯ ~  13:21 rostopic pub -h
Usage: rostopic pub /topic type [args...]

Options:
  -h, --help            show this help message and exit
  -v                    print verbose output
  -r RATE, --rate=RATE  publishing rate (hz).  For -f and stdin input, this
                        defaults to 10.  Otherwise it is not set.
  -1, --once            publish one message and exit
  -f FILE, --file=FILE  read args from YAML file (Bagy)
  -l, --latch           enable latching for -f, -r and piped input.  This
                        latches the first message.
  -s, --substitute-keywords
                        When publishing with a rate, performs keyword ('now'
                        or 'auto') substitution for each message
  --use-rostime         use rostime for time stamps, else walltime is used
#  -1, --once            publish one message and exit 发布一次后退出
❯❯ ~  13:30 rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0,0.0,0.0]' '[0.0,0.0,-1.8]'
publishing and latching message for 3.0 seconds
#   -r 1  1Hz 一次发布消息
❯❯ ~  13:30 rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1  -- '[2.0,0.0,0.0]' '[0.0,0.0,-1.8]'

6.4 显示话题数据(数字和图形)

关于话题上发布的数据,可以通过下面两种方式查看:

# rostopic echo /topic- 显示在某个话题上发布的数据
❯❯ ~  13:34 rostopic echo /turtle1/cmd_vel
linear: 
  x: 2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: -1.8
---
linear: 
  x: 2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: -1.8
---
linear: 
  x: 2.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: -1.8

经过 6-1 到 6-3 到此步骤后,更新 6-1 第四步骤画出的节点图,如下:

image-20220729134700825
image-20220729134700825

# rosrun rqt_plot rqt_plot - 以滚动时间图显示某个话题上的数据

显示 /turtle1/pose/y 和 /turtle1/pose/x

ROS/Tutorials/UnderstandingTopics/rqt_plot.png
ROS/Tutorials/UnderstandingTopics/rqt_plot.png

显示 /turtle1/pose/theta

ROS/Tutorials/UnderstandingTopics/rqt_plot2.png
ROS/Tutorials/UnderstandingTopics/rqt_plot2.png

七、理解 ROS 服务和参数

7.1 调用服务(输入服务参数)

服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)

$ 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

list命令显示turtlesim节点提供了9个服务:reset, clear, spawn, kill, turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, turtlesim/set_logger_level。同时还有两个与rosout节点有关的服务:/rosout/get_loggers/rosout/set_logger_level

示例: /clear 服务

# 查询 /clear 服务类型
rosservice type /clear  
# rosservice call [service] [args]
$ rosservice call /clear

示例: /spawn 服务

# 查询/spawn 服务数据类型和详细信息
❯❯ ~  14:23 rosservice type /spawn
turtlesim/Spawn
❯❯ ~  14:25 rosservice type /spawn | rossrv show
float32 x
float32 y
float32 theta
string name
---
string name
# 调用服务
❯❯ ~  14:26 rosservice call /spawn 2 2 0.2 ""
name: "turtle2"

7.2 参数(设置、获取、保存和加载)

$ rosparam list
/rosdistro
/roslaunch/uris/host_nxt__43407
/rosversion
/run_id
/turtlesim/background_b
/turtlesim/background_g
/turtlesim/background_r

设置和获得参数

rosparam set [param_name]
rosparam get [param_name]

现在我们修改背景颜色的红色通道值:

$ rosparam set /turtlesim/background_r 150

上述指令修改了参数的值,现在我们==需要调用clear服务使得参数的修改能生效==:

$ rosservice call /clear
$ rosparam get /turtlesim/background_g 
 rosparam get /

保存和加载参数

rosparam dump [file_name] [namespace]
rosparam load [file_name] [namespace]

在这里,我们将所有的参数写入params.yaml文件:

$ rosparam dump params.yaml

你甚至可以将yaml文件重载入新的命名空间,例如copy_turtle

$ rosparam load params.yaml copy_turtle
$ rosparam get /copy_turtle/turtlesim/background_b

八、使用 roslaunch

  1. 切换工作目录,并创建 launch 文件夹
$ roscd beginner_tutorials
$ mkdir launch
$ cd launch

:warning:**注意:**存放launch文件的目录不一定非要命名为launch,事实上都不用非得放在目录中,roslaunch命令会自动查找经过的包并检测可用的启动文件。然而,这种推荐的标准做法被认为是“最佳实践”。

  1. 创建 turtlemimic.launch 文件
<launch>

    <group ns="turtlesim1">
    	<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
    </group>

    <group ns="turtlesim2">
    	<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
    </group>

    <node pkg="turtlesim" name="mimic" type="mimic">
        <remap from="input" to="turtlesim1/turtle1"/>
        <remap from="output" to="turtlesim2/turtle1"/>
    </node>

</launch>
  • 行 3 - 行 9:创建两个分组,以 namespace标签区分,其中一个名为turtulesim1,另一个名为turtlesim2,两个分组中都有相同的名为sim的turtlesim节点。这样可以让我们同时启动两个turtlesim模拟器,而不会产生命名冲突。

  • 行 11 - 行 14:在这里我们启动模仿节点,话题的输入和输出分别重命名为turtlesim1turtlesim2,这样就可以让turtlesim2模仿turtlesim1了。

  1. roslaunch 启动
$ 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]’

image-20220729152733787
image-20220729152733787

  1. 节点图查看Launch 操作
ROS/Tutorials/UsingRqtconsoleRoslaunch/mimiclaunch.jpg

九、创建ROS消息和服务

9.1 创建 msg

roscd beginner_tutorials
mkdir msg
echo "int64 num" > msg/Num.msg

为了确保msg文件能被转换为C++、Python和其他语言的源代码,还需要如下操作:

  1. 打开 package.xml,添加如下两行
  <build_depend>message_generation</build_depend>
  <exebc_depend>message_runtime</exec_depend>
  1. 打开 CMakeLists.txt 文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了
# 不要直接复制这一大段,只需将message_generation加在括号闭合前即可
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)
  1. 打开 CMakeLists.txt 文件中,作如下修改,确保导出消息的运行时依赖关系
catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)
add_message_files(
  FILES
  Num.msg
)

9.2 使用 rosmsg

创建消息后,可以通过 rosmsg show 命令看看 ROS 能否识别它

# rosmsg show [message type]
$ rosmsg show beginner_tutorials/Num
  • beginner_tutorials -- 定义消息的软件包
  • Num -- 消息的名称 Num

如果不记得msg在哪个包中,也可以省略包名称。尝试:

$ rosmsg show Num

你会看到:

[beginner_tutorials/Num]:
int64 num

9.3 创建 srv

$ roscd beginner_tutorials
$ mkdir srv

从另一个包复制现有的srv定义,而不是手动创建新的srv。

# roscp [package_name] [file_to_copy_path] [copy_path]
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

为了确保msg文件能被转换为C++、Python和其他语言的源代码,还需要如下操作:

1、2 项操作和[创建 msg](#创建 msg)处一致

  1. 添加所需的服务依赖项
add_service_files(
  FILES
  AddTwoInts.srv
)

9.4 使用 rossrv

创建服务后,可以通过 rossrv show 命令看看 ROS 能否识别它

# rossrv show [message type]
$ rossrv show beginner_tutorials/AddTwoInts
  • beginner_tutorials -- 定义消息的软件包
  • AddTwoInts -- 服务的名称 AddTwoInts

如果不记得srv在哪个包中,也可以省略包名称。尝试:

$ rossrv show AddTwoInts

你会看到:

[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

10.5 msg 和 srv 的一般步骤

如果没做过上面的教程,请先修改下CMakeLists.txt

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

取消注释,然后添加任意你的消息用到的包含.msg文件的软件包(本例中为std_msgs),如下所示:

generate_messages(
  DEPENDENCIES
  std_msgs
)

现在我们已经创建了一些新消息,所以需要重新make一下软件包:

# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make
$ cd -

msg目录中的任何.msg文件都将生成所有支持语言的代码。

  • C++消息的头文件将生成在~/catkin_ws/devel/include/beginner_tutorials/

  • Python脚本将创建在~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg

  • Lisp文件则出现在~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/

类似地,srv目录中的任何.srv文件都将生成支持语言的代码。对于C++,头文件将生成在消息的头文件的同一目录中。对于Python和Lisp,会在msg目录旁边的srv目录中。

消息格式的完整规范在消息描述语言中。

如果你正在构建使用新消息的C++节点,则还需要声明节点和消息之间的依赖关系,参见catkin消息和服务构建文档

  1. http://wiki.ros.org/rosbash

  2. [What is a ROS Node? - The Robotics Back-End (roboticsbackend.com)](https://roboticsbackend.com/what-is-a-ros-node/#:~:text=A ROS node%2C according to,%2C services%2C actions%2C etc.)

posted @ 2022-07-31 11:36  Oddpage  阅读(1029)  评论(0编辑  收藏  举报