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