阿克曼控制
简介
在 Ubuntu 20.04 上完成 CARLA 与 ROS 桥接后,通过 ackermann_msgs/AckermannDrive 消息向主车发布阿克曼控制命令(目标速度 + 转向角)。本文提供两种方式:先用 rostopic pub 命令行快速验证直行、转向与停止,再编写 Python 发布节点以固定频率持续发送控制指令。
说明:下文命令中的
~指你的主目录,请按实际安装位置调整路径。
环境要求
- Ubuntu 20.04
- ROS Noetic
- CARLA(安装目录
~/CARLA_0.9.13;若通过 apt 系统安装则位于/opt/carla-simulator) - carla-ros-bridge(工作区
~/carla-ros-bridge/catkin_ws,已编译)
配套代码
本教程对应的代码位于仓库 src/ground/ackermann_publisher/ 目录,与下面各步骤的命令一一对应:
| 步骤 | 代码文件 |
|---|---|
| 安装依赖 | src/ground/ackermann_publisher/install_deps.sh |
| 启动 CARLA | src/ground/ackermann_publisher/start_carla.sh |
| 启动 ROS 桥与主车 | src/ground/ackermann_publisher/start_bridge.sh |
| 发布直行命令 | src/ground/ackermann_publisher/drive_straight.sh |
| 发布转向命令 | src/ground/ackermann_publisher/drive_turn.sh |
| 发布停止命令 | src/ground/ackermann_publisher/stop.sh |
| 创建发布功能包 | src/ground/ackermann_publisher/create_pkg.sh |
| Python 发布节点(第六步代码) | src/ground/ackermann_publisher/ackermann_pub.py |
| 编译并运行 | src/ground/ackermann_publisher/build_run.sh |
第一步:安装依赖
# 阿克曼消息包
sudo apt install ros-noetic-ackermann-msgs
# PID依赖(carla_ackermann_control用)
pip install simple-pid
第二步:启动 CARLA(终端 1)
cd ~/CARLA_0.9.13
./CarlaUE4.sh
apt 系统安装时将目录替换为
/opt/carla-simulator。
等待 CARLA 窗口加载出地图画面。
第三步:加载环境并启动 bridge(终端 2)
# 先加载环境
source /opt/ros/noetic/setup.bash
source ~/carla-ros-bridge/catkin_ws/devel/setup.bash
# 启动 bridge 并生成一辆 ego 车
roslaunch carla_ros_bridge carla_ros_bridge_with_example_ego_vehicle.launch
运行成功后,CARLA 窗口会生成主车,manual control 面板显示 ego_vehicle running。
第四步:rostopic 发布阿克曼命令(终端 3)
先加载环境:
source /opt/ros/noetic/setup.bash
source ~/carla-ros-bridge/catkin_ws/devel/setup.bash
直行:速度 3 m/s,转角 0 rad,以 10 Hz 发布:
rostopic pub /carla/ego_vehicle/ackermann_cmd ackermann_msgs/AckermannDrive "{speed: 3.0, steering_angle: 0.0, steering_angle_velocity: 0.0, acceleration: 0.0, jerk: 0.0}" -r 10
转向:速度 2 m/s,转角 0.3 rad:
rostopic pub /carla/ego_vehicle/ackermann_cmd ackermann_msgs/AckermannDrive "{speed: 2.0, steering_angle: 0.3, steering_angle_velocity: 0, acceleration: 0, jerk: 0}" -r 10
停止:目标速度 0:
rostopic pub /carla/ego_vehicle/ackermann_cmd ackermann_msgs/AckermannDrive "{speed: 0.0, steering_angle: 0.0}" -r 10
第五步:创建发布功能包(终端 4)
cd ~/carla-ros-bridge/catkin_ws/src
catkin_create_pkg ackermann_publisher rospy ackermann_msgs
cd ackermann_publisher
mkdir scripts
cd scripts
touch ackermann_pub.py
chmod +x ackermann_pub.py
第六步:编写 Python 发布节点
编辑 ackermann_pub.py:
#!/usr/bin/env python3
# ackermann_pub.py
import rospy
from ackermann_msgs.msg import AckermannDrive
if __name__ == "__main__":
# 1. 初始化节点
rospy.init_node("simple_ackermann_publisher")
# 2. 创建发布器:话题名、消息类型、队列长度
pub = rospy.Publisher("/carla/ego_vehicle/ackermann_cmd", AckermannDrive, queue_size=10)
# 3. 设置发布频率 10Hz
rate = rospy.Rate(10)
rospy.loginfo("Ackermann发布节点启动,开始发送控制指令")
while not rospy.is_shutdown():
# 构造阿克曼消息
drive_msg = AckermannDrive()
drive_msg.speed = 2.0 # 速度 m/s
drive_msg.steering_angle = 0.2 # 转向角 rad,正数向右,负数向左
drive_msg.steering_angle_velocity = 0
drive_msg.acceleration = 0
drive_msg.jerk = 0
pub.publish(drive_msg)
rospy.loginfo(f"发送: speed={drive_msg.speed}, steer={drive_msg.steering_angle}")
rate.sleep()
第七步:编译并运行
cd ~/carla-ros-bridge/catkin_ws
catkin_make
source devel/setup.bash
source /opt/ros/noetic/setup.bash
rosrun ackermann_publisher ackermann_pub.py
节点启动后以 10 Hz 持续发送 speed=2.0、steer=0.2 的阿克曼命令,主车按该速度与转角行驶。
运行效果
完整操作截图:CARLA 主车已生成、bridge 启动参数、三条 rostopic 命令与 Python 节点循环发送日志(Ctrl+C 正常退出):

AckermannDrive 字段说明
| 字段 | 类型 | 含义 | 示例 |
|---|---|---|---|
speed |
float32 | 目标速度(m/s) | 3.0 直行;0.0 停止 |
steering_angle |
float32 | 目标转向角(rad),正数向右、负数向左 | 0.3 右转;-0.3 左转 |
steering_angle_velocity |
float32 | 转向角速度(rad/s) | 0.0 |
acceleration |
float32 | 目标加速度(m/s²) | 0.0 |
jerk |
float32 | 加加速度(m/s³) | 0.0 |
常见问题
-
apt install提示找不到ros-noetic-ackermann-msgs:先执行sudo apt update,并确认已正确安装 ROS Noetic 软件源。 -
rostopic pub报错话题不存在:确认终端 3 已source桥接环境,且终端 2 的roslaunch正常运行、主车已生成。 -
rosrun找不到ackermann_pub.py:确认脚本已chmod +x且位于功能包scripts/目录内,并在catkin_make后重新source devel/setup.bash。 -
启动时报错
KeyError: 'simple_pid':simple-pid 2.0.x 与 carla-ros-bridge 不兼容,卸载后换装兼容版本:
# 1. 卸载不兼容的 2.0.1
pip3 uninstall simple-pid -y
# 2. 安装兼容旧版 0.2.2
pip3 install simple-pid==0.2.2