定制差速驱动车辆模型#
1. 介绍#
目前,Autoware 假定车辆使用带有 阿克曼 转向的阿克曼运动学模型.
因此,Autoware 采用阿克曼命令格式作为控制模块的输出
(参见 阿克曼驱动ROS消息定义 了解阿克曼命令的概述,
和 阿克曼控制命令结构体
在 Autoware 中使用以获取更多详细信息).
然而,遵循差速驱动运动学模型,可以将 Autoware 与车辆集成.小型移动机器人常用.差速器车辆可以是四轮或两轮,如下图所示.
2. 方法#
将 Autoware 与差速驱动车辆一起使用的一种简单方法是创建一个 车辆接口 包,将 阿克曼 命令转换为 差速驱动 命令.
以下是您需要考虑的两点:
- 为差速驱动车辆创建
vehicle_interface包 - 设置适当的
wheel_base
2.1 为差速器驱动车辆创建车辆接口包#
Autoware 中的 阿克曼 命令由两个主要控制输入组成:
- 转向角 (\(\omega\))
- 速度 (\(v\))
相反,典型的 差速驱动 命令由以下输入组成:
- 左轮速度 (\(v_l\))
- 右轮速度 (\(v_r\))
因此,将 阿克曼 命令转换为 差速驱动 命令的一种方法是使用以下公式:
其中 \(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 可能会向前和向后驱动差速器驱动车辆,即使车辆可以以使用纯旋转运动的简单轨迹进行停车.