ros2_control diff_drive_controller(一)

简介: ros2_control diff_drive_controller

系列文章目录


前言


一、轮式移动机器人运动学

       本页介绍不同轮式移动机器人的运动学。如需进一步参考,请参阅 Siciliano et.al - Robotics: 建模、规划和控制》和 Kevin M. Lynch and Frank C. Park - Modern Robotics: 机械、规划和控制》。

       轮式移动机器人可分为两类:

  • 全向机器人
  • 可在平面内向任意方向瞬时移动,以及
  • 非全向机器人
  • 不能在平面内任何方向上瞬时移动。

       利用车轮执行器的编码器对运动学模型进行前向积分 —— 被称为测距定位或被动定位或死算。我们只称其为测距(odometry)。

1.1 差速驱动机器人

       引用 Siciliano et.al - Robotics: 建模、规划和控制:

       严格意义上的独轮车(即装有单轮的车辆)是一种在静态条件下存在严重平衡问题的机器人。然而,有一些车辆在运动学上与独轮车相当,但从机械角度来看更加稳定。差速驱动机器人就是其中之一,它有两个轮子,每个轮子都是独立驱动的。

  • 是车轮轨迹(车轮之间的距离)。

1.1.1 前向运动学

       差速驱动模型的前进运动学可以通过上述独轮车模型计算得出,计算公式为

1.1.2 逆运动学

       通过以下方法可以计算出实现理想车身扭转所需的车轮速度:

1.1.3 里程计(Odometry)

       我们可以利用上述正向运动学方程,直接从编码器读数中计算出机器人的运动轨迹。

二、差分驱动控制器

       用于差速驱动移动机器人的控制器。

       它接收机器人本体的速度指令作为输入,并将其转换为差速驱动底座的车轮指令。

       通过硬件反馈计算并发布里程计(Odometry,运动轨迹)。

       有关移动机器人运动学的介绍和此处使用的术语,请参阅轮式移动机器人运动学。

2.1 其他特点

  • 实时安全实施。
  • 运动轨迹发布
  • 任务空间速度、加速度和颠簸限制
  • 指令超时后自动停止

2.2 控制器接口说明

2.2.1 参考资料

       (控制器尚未作为可链式控制器实施)

2.2.2 反馈

       作为反馈接口类型,使用关节的位置(hardware_interface::HW_IF_POSITION)或速度(hardware_interface::HW_IF_VELOCITY,如果参数 position_feedback=false)。

2.2.3 输出

       使用关节的速度(hardware_interface::HW_IF_VELOCITY)。

2.3 ROS 2 接口

2.3.1 订阅者

~/cmd_vel [geometry_msgs/msg/TwistStamped] 控制器的速度命令。

       控制器的速度指令。控制器提取线速度的 x 分量和角速度的 z 分量。其他分量上的速度将被忽略。

2.3.2 Publishers

~/odom [nav_msgs::msg::测距]

       这表示对机器人在自由空间中的位置和速度的估计。

/tf [tf2_msgs::msg::TFMessage] TF 树。

       TF 树。仅在 enable_odom_tf=true 时发布

~/cmd_vel_out [geometry_msgs/msg/TwistStamped] 控制器的速度命令。

       控制器的速度命令,其中应用了限制。仅在 publish_limited_velocity=true 时发布

2.3.3 参数

       该控制器使用 generate_parameter_library 来处理参数。位于 src 文件夹中的参数定义文件包含控制器使用的所有参数的说明。

left_wheel_names (字符串数组)

左侧车轮关节的名称

默认: {}

限制条件:

参数不为空

right_wheel_names (字符串数组)

右侧车轮关节的名称

默认: {}

限制条件: 参数不为空:

参数不为空

wheel_separation (双)

左右车轮之间的最短距离。如果此参数有误,机器人在弯道中将无法正常运行。

默认值:0.0

限制条件:

大于 0.0

wheel_radius (车轮半径,双)

轮子的半径,即轮子的大小,用于将线性速度转换为轮子旋转。如果该参数有误,机器人的移动速度会比预期的快或慢。

默认值: 0.0

限制条件:

大于 0.0

wheel_separation_multiplier(车轮分离倍增器,双)

车轮分离校正系数(TODO(destogl): 请帮我正确描述)

默认值:1.0

left_wheel_radius_multiplier(左车轮半径乘数,double)

左侧车轮半径与 wheel_radius 参数中的标称值不同时的修正系数。

默认值:1.0

right_wheel_radius_multiplier(右车轮半径乘数,双)

当右侧车轮半径与 wheel_radius 参数中的标称值不同时的修正系数。

默认值:1.0

tf_frame_prefix_enable (bool)

启用或禁用在 tf 帧 id 上附加 tf_prefix。

默认值:true

tf_frame_prefix (字符串)

(可选)附加到 tf 框架的前缀,发布前将添加到 odom_id 和 base_frame_id 中。如果参数为空,将使用控制器的命名空间。

默认值:""

odom_frame_id (字符串)

用于里程测量的框架名称。控制器发布里程计时,该框架是 base_frame_id 的父框架。

默认值:"odom

base_frame_id (字符串)

作为里程测量框架子框架的机器人基本框架的名称。

默认值:"base_link

pose_covariance_diagonal(对角线双数组)

机器人编码器输出的姿态的轨迹协方差。这些值应根据机器人的轨迹测量样本数据进行调整,但这些值是一个很好的起点: [0.001, 0.001, 0.001, 0.001, 0.001, 0.01].

默认值:{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}。

twist_covariance_diagonal(扭转协方差对角线)(双数组)

机器人速度编码器输出的扭转协方差。这些值应根据机器人的轨迹测量样本数据进行调整,但这些值是一个很好的起点: [0.001, 0.001, 0.001, 0.001, 0.001, 0.01].

默认值:{0.0, 0.0, 0.0, 0.0, 0.0, 0.0}

open_loop (bool)

如果设置为 "true",机器人的运动轨迹将根据指令值而非反馈值计算。

默认值:假

position_feedback (位置反馈)(bool

是否有来自硬件的位置反馈。

默认值: true

enable_odom_tf (bool)

发布 odom_frame_id 和 base_frame_id 之间的转换。

默认值:true

cmd_vel_timeout (double)

超时时间(以秒为单位),超时后 cmd_vel 主题上的输入命令将被视为已关闭。

默认值:0.5

publish_limited_velocity (bool)

发布限制速度值。

默认值:false

velocity_rolling_window_size (int)

用于计算里程测量中使用的平均速度的滚动窗口大小。

默认值:10

publish_rate (双)

里程测量和 TF 信息的发布速率(赫兹)。

默认值:50.0

linear.x

线性 x 轴的关节限位结构。限制器忽略位置限制。详情请参阅 ros2_control 资源库中的 joint_limits 包。

linear.x.has_velocity_limits (bool)

默认值:false

linear.x.has_acceleration_limits (bool) (线性.x.有加速度限制)

默认值:false

linear.x.has_jerk_limits (bool) (线性.x.有加速度限制)

默认值:false

linear.x.max_velocity (double) 线性.x.最大速度(双倍

默认值: std::numeric_limits::quiet_NaN()

linear.x.min_velocity (双倍)

默认值: std::numeric_limits::quiet_NaN()

linear.x.max_acceleration (双)

默认值: std::numeric_limits::quiet_NaN()

linear.x.min_acceleration (double)

默认值: std::numeric_limits::quiet_NaN()

linear.x.max_jerk (double)

默认值: std::numeric_limits::quiet_NaN()

linear.x.min_jerk (double)

默认值: std::numeric_limits::quiet_NaN()

angular.z

围绕 Z 轴旋转的关节限位结构。限制器忽略位置限制。详情请参阅 ros2_control 软件仓库中的 joint_limits 软件包。

angular.z.has_velocity_limits (bool)

默认:false

angular.z.has_acceleration_limits (bool)

默认值:false

angular.z.has_jerk_limits (bool)

默认值:false

angular.z.max_velocity (double)

默认值: std::numeric_limits::quiet_NaN()

angular.z.min_velocity (double)

默认值: std::numeric_limits::quiet_NaN()

angular.z.max_acceleration (double)

默认值: std::numeric_limits::quiet_NaN()

angular.z.min_acceleration (double)

默认值: std::numeric_limits::quiet_NaN()

angular.z.max_jerk (double)

默认值: std::numeric_limits::quiet_NaN()

angular.z.min_jerk (double)

默认值: std::numeric_limits::quiet_NaN()

该控制器的参数文件示例可在 test 目录中找到:

test_diff_drive_controller:
  ros__parameters:
    left_wheel_names: ["left_wheels"]
    right_wheel_names: ["right_wheels"]
    wheel_separation: 0.40
    wheel_radius: 0.02
    wheel_separation_multiplier: 1.0
    left_wheel_radius_multiplier: 1.0
    right_wheel_radius_multiplier: 1.0
    odom_frame_id: odom
    base_frame_id: base_link
    pose_covariance_diagonal: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    twist_covariance_diagonal: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
    position_feedback: false
    open_loop: true
    enable_odom_tf: true
    cmd_vel_timeout: 0.5 # seconds
    publish_limited_velocity: true
    velocity_rolling_window_size: 10
    linear.x.has_velocity_limits: false
    linear.x.has_acceleration_limits: false
    linear.x.has_jerk_limits: false
    linear.x.max_velocity: 0.0
    linear.x.min_velocity: 0.0
    linear.x.max_acceleration: 0.0
    linear.x.max_jerk: 0.0
    linear.x.min_jerk: 0.0
    angular.z.has_velocity_limits: false
    angular.z.has_acceleration_limits: false
    angular.z.has_jerk_limits: false
    angular.z.max_velocity: 0.0
    angular.z.min_velocity: 0.0
    angular.z.max_acceleration: 0.0
    angular.z.min_acceleration: 0.0
    angular.z.max_jerk: 0.0
    angular.z.min_jerk: 0.0

ros2_control diff_drive_controller(二)+https://developer.aliyun.com/article/1585405

目录
相关文章
|
1月前
|
机器人 Docker 容器
ros2_control diff_drive_controller(二)
ros2_control diff_drive_controller(一)
23 3
|
4月前
|
传感器 人工智能 算法
ROS机器人操作系统
ROS机器人操作系统
135 1
|
1月前
|
存储 Ubuntu 数据可视化
Sawyer 机器人 ROS SDK 配置(三)
Sawyer 机器人 ROS SDK 配置(三)
37 5
|
1月前
|
存储 Ubuntu 数据可视化
Sawyer 机器人 ROS SDK 配置(二)
Sawyer 机器人 ROS SDK 配置(二)
21 0
|
1月前
|
存储 网络协议 机器人
Sawyer 机器人 ROS SDK 配置(一)
Sawyer 机器人 ROS SDK 配置
33 0
|
3月前
|
机器学习/深度学习 传感器 算法
强化学习(RL)在机器人领域的应用,尤其是结合ROS(Robot Operating System)和Gazebo(机器人仿真环境)
强化学习(RL)在机器人领域的应用,尤其是结合ROS(Robot Operating System)和Gazebo(机器人仿真环境)
135 2
|
3月前
|
机器人 定位技术 C++
技术笔记:ROS中测试机器人里程计信息
技术笔记:ROS中测试机器人里程计信息
|
4月前
|
NoSQL 机器人 Windows
ROS机器人编程技术控制两只小海龟的编队运动
ROS机器人编程技术控制两只小海龟的编队运动
133 1
|
4月前
|
机器人 Python Windows
ROS机器人编程技术应用与实践
ROS机器人编程技术应用与实践
59 1
|
4月前
|
机器人 Unix C++
ROS机器人编程技术架构命令应用
ROS机器人编程技术架构命令应用
67 1

推荐镜像

更多