1 通信类型

1.1 Node

  • 运行
ros2 run <package_name> <executable_name>
  • 查看
ros2 node list 
ros2 node info <node_name>

1.2 Topic

  • Topic 分为 Publisher 和 Subscriber,多对多模型
  • 消息类型为:.msg 文件
  • 适用场景:基于异步流媒体数据
# 查看图形化节点
rqt_graph

# 查看所有 topic
ros2 topic list

# 查看正在发布的 topic
ros2 topic echo <topic_name>

# 查看 topic 的具体信息
ros2 topic info <topic_name>

# 使用 topic 发布数据
ros2 topic pub <topic_name> <msg_type> '<args>'

# 查看 topic 发布数据的频率
ros2 topic hz <topic_name>

1.3 Service

  • Service 分为 Server 和 Client,一对一模型
  • 文件类型:.srv 文件
  • 适用场景:基于同步 RPC 样式通信
# 查看 service
ros2 service list 
ros2 service list -t

# 判断类型
ros2 service type <service_name>

# 查找
ros2 service find <type_name>

# 展示
ros2 interface show <type_name>

# 回调
ros2 service call <service_name> <service_type> <arguments>

1.4 Parameters

  • 启动时添加参数
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
  • 从文件中添加参数
ros2 param load <node_name> <parameter_file>
  • 设置节点的参数
ros2 param set <node_name> <parameter_name> <value>
  • 将参数转存至文件中,node_name.yaml
ros2 param dump <node_name>
  • 查询
ros2 param list
ros2 param get <node_name> <parameter_name>

2 工作空间

2.1 创建工作空间

mkdir -p colcon_ws/src

2.2 创建软件包

ros2 pkg create --build-type ament-cmake <package_name>

2.3 安装依赖包

rosdep install -i --from-path src --rosdistro galactic -y

2.4 构建编译软件包

colcon build

2.5 编译选项

colcon build
    --packages-select <pkg_name> # 只编译指定包

    --symlink-install # 使用符合链接而不是复制文件

    --packages-ignore # 忽略指定包

    --continue-on-error    # 编译出错后,编译其他包

    --cmake-args # 传递参数给对应的package
    --ament-cmake-args
    --catkin-cmake-args

3 配置信息

3.1 package.xml

<name>
<version>
<description>
<maintainer email=””>
<license>                            # 许可证
<buildtool_depnd>                    # 编译工具依赖
<build_depend>                        # 编译依赖
    rclpy
    std_msg
    message_generation
<exec_depend>                        # 执行依赖
    turtlesim
    rclpy
    std_msgs
    message_runtime
    sensor_msgs
    open3d
    geometry_msgs            # tf2相关
    tf_transformations
    tf_ros
    launch                    # 启动文件
    launch_ros
<test_depend>                        # 测试依赖
<build_export_depend>                # 导出依赖
    ament_python
<run_depend>                    # 运行依赖

3.2 C++(CMakeLists.txt)

# 添加依赖包
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(example_interfaces REQUIRED)

# 添加可执行文件
add_executable(server src/add_two_ints_server.cpp)
ament_target_dependencies(server
  rclcpp example_interfaces)

add_executable(client src/add_two_ints_client.cpp)
ament_target_dependencies(client
  rclcpp example_interfaces)

# 安装可执行文件
install(TARGETS
  server
  client
  DESTINATION lib/${PROJECT_NAME})

3.3 Python(setup.py)

data_files
    启动文件: (os.path.join('share', package_name, "launch"), glob('launch/*.launch.py')),
    配置文件: (os.path.join('share', package_name, "config"), glob('config/*')),
    三维模型文件: (os.path.join('share', package_name, "resource"), glob('resource/*.ply')),
    机器人描述文件: (os.path.join('share', package_name), glob('urdf/*'))

entry_points
    节点名 = 包名.文件名:main

4 接口文件

4.1 接口的数据类型

类型名称 C++ Python DDS 类型
bool bool bool boolean
byte uint8_t bytes octet
char char str char
float32 float float float
float64 double float double
int8 int8_t int octet
uint8 uint8_t int octet
int16 int16_t int short
uint16 uint16_t int unsigned short
int32 int32_t int long
uint32 uint32_t int unsigned long
int64 int64_t int long long
uint64 uint64_t int unsigned long long
string std::string str string
wstring std::u16string str wstring

4.2 命名规则

1.字段名称必须是小写字母和数字字符,并带有下划线以分隔单词。
2.字段名称必须以字母字符开头,不能以下划线结尾,且永远不能有两个连续的下划线。

4.3 设置默认值

uint8 x 42
int16 y -2000
string full_name "John Doe"
int32[] samples [-200, -100, 0, 100, 200]

4.4 设置常量

int32 X=123
int32 Y=-123
string FOO="foo"
string EXAMPLE='bar'

4.5 创建接口包

ros2 pkg create --build-type ament_cmake tutorial_interfaces

4.6 创建接口目录

mkdir msg
mkdir srv
mkdir action

4.7 定义接口

  • msg 目录下的 Num.msg 文件
int num
  • srv 目录下的 AddThreeInts.srv 文件
int64 a
int64 b
int64 c
---
int64 sum
  • action 目录下的 Fibonacci.action 文件
int32 order
---
int32[] sequence
---
int32[] partial_sequence

4.8 CMakeLists.txt 构建

find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Num.msg"
  "srv/AddThreeInts.srv"
  "action/Fibonacci.action"
)

4.9 package.xml 添加依赖

<build_depend>rosidl_default_generators</build_depend>

<exec_depend>rosidl_default_runtime</exec_depend>

<depend>action_msgs</depend>

<member_of_group>rosidl_interface_packages</member_of_group>

4.10 构建软件包

colcon build --packages-select tutorial_interfaces

5 rclpy

5.1 初始化

# 初始化节点
rclpy.init()

# 启动节点
rclpy.spin()

# 启动一个节点
rclpy.spin_once()

# 启动节点直至工作完成
rclpy.spin_until_future_complete()

# 获取执行程序
rclpy.get_global_executor()

# 关闭节点
rclpy.shutdown()

5.2 Node

# 导包
from rclpy.node import Node

# 添加等待
add_waitable

# 统计节点发布者数量
count_publishers(topic_name)

# 统计节点订阅者数量
count_subscribers(topic_name)

# 销毁节点
destroy_node()

5.3 Topic

  • Publisher
# 创建发布者
Node.create_publisher(
    msg_type,                      # 数据类型
    topic,                             # 发布名
    qos_profile,                    #
)

# 设置为活动状态
assert_liveliness()

# 销毁
destroy()

# 获取该发布者的订阅者数量
get_subscription_count()

# 发布数据
publish(msg)
  • Subscription
# 创建订阅者
Node.create_subscription(
    msg_type,                        # 数据类型
    topic,                            # 订阅名
    callback(),                    # 回调函数
    qos_profile
)

5.4 Services

  • Client
# 创建客户端
Node.create_client(
    srv_type,                    #
    srv_name,                    #
    qos_profile                #
)

# 发出请求
call(request)

# 异步请求
call_async(request)

# 删除请求
remove_pending_request()

# 检查服务是否准备就绪
service_is_ready()

# 等待服务启动
wait_for_service()
  • Service
# 创建服务端
Node.create-service(
    srv_type,
    srv_name,
    qos_profile
)
send_response()

5.5 Actions

  • Action Client
# 导包
from rclpy.action import ActionClient

ActionClient(
    action_type,
    action_name,
)

# 添加等待
add_to_wait_set(wait_set)

# 销毁
destroy()

# 实体编号
get_num_entities()

# 是否就绪
is_ready(wait_set)

# 发送
send_goal(goal)

# 异步发送
send_goal_async()

# 检查服务端是否准备就绪
server_is_ready()

# 等待服务端就绪
wait_for_server()
  • Action Server
ActionServer(
    action_type,
    action_name,
    callback,
)
# 添加等待
add_to_wait_set(wait_set)

# 销毁
destroy()

# 实体编号
get_num_entities()

# 是否就绪
is_ready(wait_set)

# 发送
send_goal(goal)

# 异步发送
send_goal_async()

# 检查服务端是否准备就绪
server_is_ready()

# 等待服务端就绪
wait_for_server()

5.6 Timer

# 导包
from rclpy.timer import Rate,Timer

Rate(timer,*,context)

Timer(
    callback,
    callback_group,
    timer_period_ns,
    clock,
    *,
    context=None
)
cancel()
destroy()
is_canceled()
is_ready()
reset()
time_since_last_call()
time_until_next_call()

5.7 Context

init()

ok()

# 添加要在关机时调用的回调
on_shutdown()

shutdown()

try_shutdown()

6 启动文件

6.1 启动文件类型

1.Python 文件
2.XML 文件
3.YAML 文件

6.2 Python 启动

  • 命令
ros2 launch <pkg_name> xxx_launch.py
  • 参数
package="pkg_name",                        # 包名
executable="exec_name",                    # 可执行文件
name="node_name",                        # 节点名
output="screen"                            # 确保在控制台输出
emulate_tty=True,                        # 确保在控制台输出
parameters=[                            # 参数字典列表
    {"my_parameter": "earth"}
]
node_executable
namespace                    # 命名空间
node_name:
node_namespace
exec_name

remappings                    # 重映射

通过os模块找到文件
import os
from ament_index_python.packages import get_package_share_directory

para_dir = os.path.join(get_package_share_directory(“pkg_name”), “…”)

6.3 launch类层次

launch
    LaunchDescription                        # 最终返回

    actions
        DeclareLaunchArgument                # 启动参数
        IncludeLaunchDescription            # 导入启动文件
        ExecuteProcess                        # 运行指定命令
        TimerAction                    

    conditions
        IfCondition

    substitutions
        LaunchConfiguration                    # 导入启动文件中的参数
        PathJoinSubstitution                # 链接路径
        TextSubstitution                    # 参数值
        PythonExpression

    launch_description_sources
        PythonLaunchDescriptionSource        # Python启动文件

lauch_ros
    actions
        Node                                # 节点

    FindPackageShare                        # 查找软件包

7 URDF文件

7.1 简介

URDF是统一机器人描述格式,用于在ROS中指定机器人的几何形状和组织。

7.2 语法

7.2.1 简介语法

material    color

link
    geometry

    origin

    material

joint
    parent

    child

    origin

    limit

    axis

7.2.2 完整语法

<robot>
    # 描述:
    # 参数:name=""
    # 子节点:
        <link>
            # 描述:
            # 参数:name=""
            # 子节点:
                <visual>
                    # 描述:
                    # 参数:
                    # 子节点:
                        <geometry>
                            # 描述
                            # 参数
                            # 子节点:
                                <cylinder />
                                    # 描述:
                                    # 参数:
                                        # length="0.6"
                                        # radius="0.2"
                                <box />
                                    # 描述
                                    # 参数:size="0.6 0.1 0.2"
                                <mesh />
                                    # 描述
                                    # 参数:filename="package://urdf_tutorial/meshes/l_finger_tip.dae"
                        <collision>
                            # 描述:碰撞元素,优先处理
                            # 参数
                            # 子节点
                                <geometry>
                        <inertial>
                            # 描述
                            # 参数
                            # 子节点:
                                <mass />
                                    # 描述:质量
                                    # 参数:value=10
                                <inertia />
                                    # 描述:惯性
                                    # 参数:i+"xyz的笛卡尔积"(共9个)="0.4"
                        <origin />
                            # 描述:
                            # 参数:
                                # rpy="0 1.5 0"
                                # xyz="0 0 -0.3"
                        <material />
                            # 描述
                            # 参数:name="blue"
        <joint>
            # 描述
            # 参数:
                # name=""
                # type=""
                    # fixed
                    # prismatic
            # 子节点
                <parent />
                    # 描述
                    # 参数:link=""
                <child />
                    # 描述:
                    # 参数:link=""
                <origin />
                    # 描述:
                    # 参数:xyz="0 -0.2 0.25"
                <limit />
                    # 描述
                    # 参数:
                        # effort="1000.0"    最大力
                        # lower="-0.38"      关节上限(弧度)
                        # upper="0"          关节下限(弧度)
                        # velocity="0.5"     最大速度
                <axis />
                    # 描述:按?轴旋转
                    # 参数:xyz="0 0 1",沿Z轴旋转
        <material>
            # 描述:
            # 参数:name="blue"
            # 子节点:
                <color />
                    # 描述:
                    # 参数:rgba="0 0 0.8 1"

7.3 示例

7.3.1 安装依赖库

sudo apt install ros-foxy-joint-state-publisher-gui ros-foxy-joint-state-publisher
sudo apt install ros-foxy-xacro

7.3.2 下载源代码

cd ~/dev_ws
git clone -b ros2 https://github.com/ros/urdf_tutorial.git src/urdf_tutorial

7.3.3 编译源代码

colcon build --packages-select urdf_tutorial

7.3.4 运行示例

ros2 launch urdf_tutorial display.launch.py model:=urdf/01-myfirst.urdf

results matching ""

    No results matching ""