Skip to content

定制差速驱动车辆模型#

1. 介绍#

目前,Autoware 假定车辆使用带有 阿克曼 转向的阿克曼运动学模型. 因此,Autoware 采用阿克曼命令格式作为控制模块的输出 (参见 阿克曼驱动ROS消息定义 了解阿克曼命令的概述, 和 阿克曼控制命令结构体 在 Autoware 中使用以获取更多详细信息).

然而,遵循差速驱动运动学模型,可以将 Autoware 与车辆集成.小型移动机器人常用.差速器车辆可以是四轮或两轮,如下图所示.

differential_vehicle

四轮和两轮车型的差速器车辆示例.

2. 方法#

将 Autoware 与差速驱动车辆一起使用的一种简单方法是创建一个 车辆接口 包,将 阿克曼 命令转换为 差速驱动 命令. 以下是您需要考虑的两点:

  • 为差速驱动车辆创建 vehicle_interface
  • 设置适当的 wheel_base

2.1 为差速器驱动车辆创建车辆接口包#

Autoware 中的 阿克曼 命令由两个主要控制输入组成:

  • 转向角 (\(\omega\))
  • 速度 (\(v\))

相反,典型的 差速驱动 命令由以下输入组成:

  • 左轮速度 (\(v_l\))
  • 右轮速度 (\(v_r\))

因此,将 阿克曼 命令转换为 差速驱动 命令的一种方法是使用以下公式:

\[ v_l = v - \frac{l\omega}{2}, v_r = v + \frac{l\omega}{2} \]

其中 \(l\) 表示车轮踏面.

以下是 .cpp 代码段示例,用于将 阿克曼 模型运动学转换为微分模型:

...
void convert_ackermann_to_differential(
  autoware_auto_control_msgs::msg::AckermannControlCommand & ackermann_msg
  my_vehicle_msgs::msg::DifferentialCommand & differential_command)
{
    differential_command.left_wheel.velocity =
      ackermann_msg.longitudinal.speed - (ackermann_msg.lateral.steering_tire_angle * my_wheel_tread) / 2;
    differential_command.right_wheel.velocity =
      ackermann_msg.longitudinal.speed + (ackermann_msg.lateral.steering_tire_angle * my_wheel_tread) / 2;
}
...

有关其他因素的信息 在创建 vehicle_interface 包时需要考虑, 请参阅 创建车辆接口页面.

2.2 设置适当的 wheel_base#

差速驱动车辆不一定有前后轮,这意味着轴距(前后轮车轴之间的水平距离)无法定义.但是,Autoware 希望在 vehicle_info.param.yaml 中设置 wheel_base 并带有一些值. 因此,您需要为 wheel_base 设置一个伪值.

wheel_base 的适当伪值取决于车辆的大小.将其设置为与 wheel_tread 相同的值是一种可能的选择.

警告

  • 如果 wheel_base 值设置得太小,则车辆可能会出现意外行为.例如,车辆可能会超出计算路径的边界.
  • 相反,如果 wheel_base 设置得太大,车辆的运动范围将受到限制.原因是 Autoware 的 规划(Planning) 模块将根据假设的车辆长度计算出过于保守的轨迹.

3. 已知问题#

运动模型不兼容#

由于 Autoware 假定车辆使用转向系统,因此无法利用差速驱动系统运动模型的灵活性.

例如,当使用 freespace_planner 模块规划停车作时,Autoware 可能会向前和向后驱动差速器驱动车辆,即使车辆可以以使用纯旋转运动的简单轨迹进行停车.