ROS2基础
1.helloworld案例
1.创建功能包(C++)
终端下,进入ws00_helloworld/src目录,使用如下指令创建一个C ++ 功能包:
ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld
执行完毕,在src目录下将生成一个名为pkg01_helloworld_cpp的目录,且目录中已经默认生成了一些子级文件与文件夹。
2.编辑源文件
进入pkg01\_helloworld\_cpp/src目录,该目录下有一helloworld.cpp文件,修改文件内容如下:
#include "rclcpp/rclcpp.hpp"int main(int argc, char ** argv)
{// 初始化 ROS2rclcpp::init(argc,argv);// 创建节点auto node = rclcpp::Node::make_shared("helloworld_node");// 输出文本RCLCPP_INFO(node->get_logger(),"hello world!");// 释放资源rclcpp::shutdown();return 0;
}
3.编译执行
在终端进入ws_helloworld下,执行:
colcon build
. install/setup.bash
ros2 run pkg01_helloworld_cpp helloworld
程序执行,在终端下将输出文本:"hello world!"。
4.创建功能包(Python)
ros2 pkg create pkg02_helloworld_py --build-type ament_python --dependencies rclpy --node-name helloworld
5.编辑源文件
进入pkg02_helloworld_py/pkg02_helloworld_py目录,该目录下有一helloworld.py文件,修改文件内容如下:
import rclpydef main():# 初始化 ROS2rclpy.init()# 创建节点node = rclpy.create_node("helloworld_py_node")# 输出文本node.get_logger().info("hello world!")# 释放资源rclpy.shutdown()if __name__ == '__main__':main()
6.编译执行
终端下进入到工作空间,执行如下指令:
colcon build
. install/setup.bash
ros2 run pkg02_helloworld_py helloworld
7.运行优化
每次终端中执行工作空间下的节点时,都需要调用. install/setup.bash
指令,使用不便,优化策略是,可以将该指令的调用添加进~/setup.bash
,操作格式如下:
echo "source /{工作空间路径}/install/setup.bash" >> ~/.bashrc
示例:
echo "source /home/ros2/ws00_helloworld/install/setup.bash" >> ~/.bashrc
以后再启动终端时,无需手动再手动刷新环境变量。
8.定向构建
colcon build --packages-select 文件名
9.功能包
功能包是ROS2应用程序的核心,但是功能包不能直接构建,必须依赖于工作空间,一个ROS2工作空间的目录结构如下:
WorkSpace --- 自定义的工作空间。|--- build:存储中间文件的目录,该目录下会为每一个功能包创建一个单独子目录。|--- install:安装目录,该目录下会为每一个功能包创建一个单独子目录。|--- log:日志目录,用于存储日志文件。|--- src:用于存储功能包源码的目录。|-- C++功能包|-- package.xml:包信息,比如:包名、版本、作者、依赖项。|-- CMakeLists.txt:配置编译规则,比如源文件、依赖项、目标文件。|-- src:C++源文件目录。|-- include:头文件目录。|-- msg:消息接口文件目录。|-- srv:服务接口文件目录。|-- action:动作接口文件目录。|-- Python功能包|-- package.xml:包信息,比如:包名、版本、作者、依赖项。|-- setup.py:与C++功能包的CMakeLists.txt类似。|-- setup.cfg:功能包基本配置文件。|-- resource:资源目录。|-- test:存储测试相关文件。|-- 功能包同名目录:Python源文件目录。
另外,无论是Python功能包还是C++功能包,都可以自定义一些配置文件相关的目录。
|-- C++或Python功能包|-- launch:存储launch文件。|-- rviz:存储rviz2配置相关文件。|-- urdf:存储机器人建模文件。|-- params:存储参数文件。|-- world:存储仿真环境相关文件。|-- map:存储导航所需地图文件。|-- ......
10.操作命令
ROS2的文件系统核心是功能包,我们可以通过编译指令colcon
和ROS2内置的工具指令ros2
来实现功能包的创建、编译、查找与执行等相关操作。
1.创建
新建功能包语法如下:
ros2 pkg create 包名 --build-type 构建类型 --dependencies 依赖列表 --node-name 可执行程序名称
格式解释:
- --build-type:是指功能包的构建类型,有cmake、ament_cmake、ament_python三种类型可选,默认ament_camke;
- --dependencies:所依赖的功能包列表;
- --node-name:可执行程序的名称,会自动生成对应的源文件并生成配置文件。
2.编译
编译功能包语法如下:
colcon build
或
colcon build --packages-select 功能包列表
前者会构建工作空间下的所有功能包,后者可以构建指定功能包。
3.查找
在ros2 pkg
命令下包含了多个查询功能包相关信息的参数。
ros2 pkg executables [包名] # 输出所有功能包或指定功能包下的可执行程序。
ros2 pkg list # 列出所有功能包
ros2 pkg prefix 包名 # 列出功能包路径
ros2 pkg xml # 输出功能包的package.xml内容
4.执行
执行命令语法如下:
ros2 run 功能包 可执行程序 参数