目录

1.1.安装ROS2

1.2.测试ROS2

1.3.Hello world小测试

1.3.1:创建工作空间并初始化

1.3.2:进入 src 创建 ros 包并添加依赖

1.3.3:进入 ros 包编辑 python 文件

1.3.3.1:新建 python 文件: (文件名自定义)

1.3.3.2:为 python 文件添加可执行权限

1.3.3.3:修改setup 文件

1.3.3.4:编译运行

1.4:Launch文件讲解

1.5:ROS2的相关指令总结

1.5.1:检查 ROS 2 环境

1.5.2:创建 ROS 2 工作空间

1.5.3:创建 ROS 2 功能包

1. 创建 Python 包

1.5.4:运行 ROS 2 节点

1.5.5:话题 topic 相关指令

1.5.6:节点 node 相关指令

1.5.7:服务 service 相关指令

1.5.8:参数 parameter 相关指令

1.5.9:接口 interface 相关指令

1.5.10:launch 启动文件

1.5.11:包 package 相关指令

1.5.12:常用调试指令

1.6:常见工作流程

详细文档可参考:https://www.autolabor.com.cn/book/ROSTutorials/

赵虚左老师的开发文档,非常的全面完善,本教程仅作为补充

默认条件Ubuntu22.04+ROS2 Humble版本

1.1.安装ROS2

由于本机已经安装好了ROS2,所以我提供几种安装途径:

1.Codex安装:这是我认为最方便省事的安装方法,相信GPT就完事

2.小鱼的ROS2一键安装教程:小鱼的一键安装系列 | 鱼香ROS

也是非常好用的教程,但是我在安装过程中遇到了国内代理的连接问题,导致安装失败,所以转战Codex进行安装

1.2.测试ROS2

第一步:退出虚拟环境,因为 ROS 2 Humble 是通过 Ubuntu 系统环境安装的,而虚拟环境,尤其是 conda 环境,会改掉很多系统路径,可能导致 ROS 2 用到错误的 Python、库文件或依赖。

conda decavite

第二步:ROS2位置以及版本

which ros2
echo $ROS_DISTRO

第三步:查看是否启动了ROS 节点

ros2 topic list

如果输出是

/parameter_events
/rosout

则表示没有启动任何 ROS 节点

1.3.Hello world小测试

ROS中的程序即便使用不同的编程语言,实现流程也大致类似,以当前HelloWorld程序为例,实现流程大致如下:

  1. 先创建一个工作空间;

  2. 再创建一个功能包;

  3. 编辑源文件;

  4. 编辑配置文件;

  5. 编译并执行。

1.3.1:创建工作空间并初始化

mkdir -p test/src
cd test
colcon build

编译成功后的结果是

src      放源码
build    编译过程文件
install  编译后的可执行文件、库、配置文件
log      编译日志

即使 Python 本身不用像 C++ 那样编译,ROS 2 仍然需要通过 colcon build 把包安装/注册到 install/ 目录中。

例如你的 Python 节点可能是:

src/my_package/my_package/my_node.py

如果没有编译安装,ROS 2 可能不知道这个 package 和 node 在哪里。

编译完成之后还需要

source install/setup.bash

否则 ROS 2 可能找不到这个包。


1.3.2:进入 src 创建 ros 包并添加依赖

果你想创建一个 ROS 2 Python 包,用:

cd ~/test/src
ros2 pkg create my_robot_control --build-type ament_python --dependencies rclpy std_msgs

这里:

ament_python         ROS 2 的 Python 构建类型
rclpy                ROS 2 的 Python 接口库
std_msgs             标准消息类型

然后同样编译:

cd ~/test
colcon build
source install/setup.bash

1.3.3:进入 ros 包编辑 python 文件

1.3.3.1:新建 python 文件: (文件名自定义)

import rclpy
from rclpy.node import Node


class MyNode(Node):
    def __init__(self):
        super().__init__('my_node')
        self.get_logger().info('ROS 2 Python node started.')


def main(args=None):
    rclpy.init(args=args)
    node = MyNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

1.3.3.2:为 python 文件添加可执行权限

chmod +x 自定义文件名.py

1.3.3.3:修改setup 文件

在里面找到:

entry_points={
    'console_scripts': [
    ],
},

改成:

entry_points={
    'console_scripts': [
        'my_node = my_robot_control.my_node:main',
    ],
},

意思是:

my_node                         = ros2 run 时使用的节点名
my_robot_control.my_node        = Python 文件路径
main                            = Python 文件里的 main() 函数

ROS 2 Python 包通过 setup.py 里的 console_scripts 注册可执行节点,setup.cfg 会告诉 setuptools 把脚本安装到对应位置,使 ros2 run 能找到它。

你的文件结构应该类似:

~/test_ws/src/my_robot_control/
├── package.xml
├── setup.py
├── setup.cfg
├── resource/
├── my_robot_control/
│   ├── __init__.py
│   └── my_node.py
└── test/

1.3.3.4:编译运行

 然后编译:

cd ~/test
colcon build
source install/setup.bash

运行:

ros2 run my_robot_control my_node

结果:

ros2 run my_robot_control my_node
[INFO] [1782115573.778399780] [my_node]: ROS 2 Python node started.

1.4:Launch文件讲解

一个程序中可能需要启动多个节点,比如:ROS 内置的小乌龟案例,如果要控制乌龟运动,要启动多个窗口,分别启动 roscore、乌龟界面节点、键盘控制节点。如果每次都调用 rosrun 逐一启动,显然效率低下,如何优化?

官方给出的优化策略是使用 launch 文件,可以一次性启动多个 ROS 节点。

  1. 选定功能包右击 ---> 添加 launch 文件夹

  2. 选定 launch 文件夹右击 ---> 添加 launch 文件

  3. 编辑 launch 文件内容

  4. <launch>
        <node pkg="helloworld" type="demo_hello" name="hello" output="screen" />
        <node pkg="turtlesim" type="turtlesim_node" name="t1"/>
        <node pkg="turtlesim" type="turtle_teleop_key" name="key1" />
    </launch>
    

    node ---> 包含的某个节点

    pkg -----> 功能包

    type ----> 被运行的节点文件

    name --> 为节点命名

    output-> 设置日志的输出目标

  5. 运行 launch 文件

    roslaunch 包名 launch文件名

  6. 运行结果: 一次性启动了多个节点

1.5:ROS2的相关指令总结

1.5.1:检查 ROS 2 环境

查看是否安装 ROS 2:

which ros2

查看当前 ROS 2 发行版:

echo $ROS_DISTRO

查看系统中安装了哪些 ROS 版本:

ls /opt/ros

加载 ROS 2 Humble 环境:

source /opt/ros/humble/setup.bash

让每次打开终端自动加载:

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc

1.5.2:创建 ROS 2 工作空间

创建工作空间:

mkdir -p ~/test_ws/src
cd ~/test_ws

编译工作空间:

colcon build

加载当前工作空间:

source install/setup.bash

完整流程:

mkdir -p ~/test_ws/src
cd ~/test_ws
colcon build
source install/setup.bash

如果编译出错,清理后重新编译:

rm -rf build install log
colcon build

1.5.3:创建 ROS 2 功能包

1. 创建 Python 包

cd ~/test_ws/src
ros2 pkg create my_package --build-type ament_python --dependencies rclpy std_msgs

适合写 Python 节点。

创建后编译:

cd ~/test_ws
colcon build
source install/setup.bash

1.5.4:运行 ROS 2 节点

运行某个包中的节点:

ros2 run 包名 节点名

例如:

ros2 run demo_nodes_cpp talker

另开一个终端运行:

ros2 run demo_nodes_py listener

注意,每开一个新终端,都需要加载 ROS 2 环境:

source /opt/ros/humble/setup.bash
source ~/test_ws/install/setup.bash

1.5.5:话题 topic 相关指令

查看所有话题:

ros2 topic list

查看话题详细信息:

ros2 topic info /topic_name

查看某个话题正在发布的数据:

ros2 topic echo /topic_name

查看话题发布频率:

ros2 topic hz /topic_name

查看话题带宽:

ros2 topic bw /topic_name

手动发布话题:

ros2 topic pub /topic_name std_msgs/msg/String "{data: 'hello'}"

例如:

ros2 topic pub /chatter std_msgs/msg/String "{data: 'hello ros2'}"

1.5.6:节点 node 相关指令

查看当前所有节点:

ros2 node list

查看某个节点信息:

ros2 node info /node_name

例如:

ros2 node info /talker

1.5.7:服务 service 相关指令

查看所有服务:

ros2 service list

查看服务类型:

ros2 service type /service_name

查看某个服务的接口格式:

ros2 interface show 服务类型

调用服务:

ros2 service call /service_name 服务类型 "参数"

例如:

ros2 service call /clear std_srvs/srv/Empty "{}"

1.5.8:参数 parameter 相关指令

查看节点参数:

ros2 param list

查看某个节点的参数:

ros2 param list /node_name

获取参数值:

ros2 param get /node_name 参数名

设置参数值:

ros2 param set /node_name 参数名 参数值

例如:

ros2 param set /my_node use_sim_time true

1.5.9:接口 interface 相关指令

查看所有消息、服务、动作类型:

ros2 interface list

查看某个消息类型的结构:

ros2 interface show std_msgs/msg/String

查看某个服务类型的结构:

ros2 interface show std_srvs/srv/Empty

常见接口类型:

std_msgs/msg/String
std_msgs/msg/Int32
std_msgs/msg/Float64
geometry_msgs/msg/Twist
sensor_msgs/msg/Image
sensor_msgs/msg/JointState

1.5.10:launch 启动文件

运行 launch 文件:

ros2 launch 包名 launch文件名.py

例如:

ros2 launch my_robot_bringup bringup.launch.py

查看某个包路径:

ros2 pkg prefix 包名

查看某个包的可执行节点:

ros2 pkg executables 包名

1.5.11:包 package 相关指令

查看所有 ROS 2 包:

ros2 pkg list

查找某个包:

ros2 pkg list | grep 包名

查看包路径:

ros2 pkg prefix 包名

查看包中的可执行程序

ros2 pkg executables 包名

例如:

ros2 pkg executables demo_nodes_cpp

1.5.12:常用调试指令

查看 ROS 2 命令帮助:

ros2 --help

查看某个子命令帮助:

ros2 topic --help
ros2 node --help
ros2 service --help

查看当前环境变量:

printenv | grep ROS

查看 Python 路径:

which python3

查看 colcon 是否安装:

which colcon

如果没有 colcon:

sudo apt update
sudo apt install python3-colcon-common-extensions

1.6:常见工作流程

以后你创建一个 ROS 2 Python 包,可以这样做:

source /opt/ros/humble/setup.bash

mkdir -p ~/test_ws/src
cd ~/test_ws/src

ros2 pkg create my_robot_control --build-type ament_python --dependencies rclpy std_msgs

cd ~/test_ws
colcon build
source install/setup.bash

查看包是否创建成功:

ros2 pkg list | grep my_robot_control

运行节点:

ros2 run my_robot_control 节点名

最核心需要记住这几类:

source /opt/ros/humble/setup.bash
colcon build
source install/setup.bash
ros2 run 包名 节点名
ros2 launch 包名 launch文件.py
ros2 topic list
ros2 topic echo /话题名
ros2 node list
ros2 service list
ros2 pkg list
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐