ROS Bridge 笔记(05)— carla_ackermann_control 功能包(将Ackermann messages 转化为 CarlaEgoVehicleControl 消息)

官网:https://carla.readthedocs.io/projects/ros-bridge/en/latest/carla_ackermann_control/
参考:https://blog.csdn.net/dfman1978/article/details/125077551

carla_ackermann_control 包使用 Ackermann messages 控制 CARLA 车辆。该包将 Ackermann messages 转换为CarlaEgoVehicleControl 消息。

它从 CARLA 读取车辆信息,并将该信息传递给一个基于 PythonPID 控制器,称为 simple-pid ,以控制加速度和速度。

ros_bridge中,除了使用 manual_control包来直接使用键盘来控制仿真小车,还可以通过ackermann(阿克曼)来控制。在 carlaautoware联合仿真的过程中,autoware最终的控制信息是要转换为 ackermann控制指令,最后控制仿真车。

1. 配置参数

在使用 ROS 1ROS 2时,可以在 配置文件 中初始设置参数,在运行时通过 ROS 1 动态重新配置参数 dynamic_reconfigure

2. 测试控制消息

通过 topic /carla/<ROLE NAME>/ackermann_cmd 向小车发送命令来测试设置。例如,运行如下命令,将角色名为 ego_vehicle 的自我车辆以10米/秒的速度向前移动:

rostopic pub /carla/ego_vehicle/ackermann_cmd ackermann_msgs/AckermannDrive \
"{steering_angle: 0.0, steering_angle_velocity: 0.0, speed: 10, acceleration: 0.0, jerk: 0.0}" -r 10

或者让车辆以1.22弧度的角度转弯时向前移动:

rostopic pub /carla/ego_vehicle/ackermann_cmd ackermann_msgs/AckermannDrive \
"{steering_angle: 1.22, steering_angle_velocity: 0.0, speed: 10, acceleration: 0.0, jerk: 0.0}" -r 10

上面的命令执行后,通过 rostopic 命令查看,该 topic 在没有订阅者的情况下车辆是不会运动的。

wohu@wohu-pc:~/tool$ rostopic info /carla/ego_vehicle/ackermann_cmd
Type: ackermann_msgs/AckermannDrive

Publishers: 
 * /rostopic_16525_1657090091755 (http://wohu-pc:39319/)

Subscribers: None


wohu@wohu-pc:~/tool$ 

其中 /carla/ego_vehicle/ackermann_cmd就是发过来的 ackermann命令,节点对这个命令进行解析,然后转换成 ros_bridge节点可以识别的消息格式:/carla/ego_vehicle/vehicle_conttrol_cmd,发给 /carla_ros_bridge节点。


可以在 carla-ros-bridge/catkin_ws/src/ros-bridge/carla_ros_bridge/src/carla_ros_bridge/ego_vehicle.py代码里看到

self.control_subscriber = node.new_subscription(
    CarlaEgoVehicleControl,
    self.get_topic_prefix() + "/vehicle_control_cmd",
    lambda data: self.control_command_updated(data, manual_override=False),
    qos_profile=10)

self.manual_control_subscriber = node.new_subscription(
    CarlaEgoVehicleControl,
    self.get_topic_prefix() + "/vehicle_control_cmd_manual",
    lambda data: self.control_command_updated(data, manual_override=True),
            qos_profile=10)

真正的执行函数是 control_command_updated,其内容如下:

    def control_command_updated(self, ros_vehicle_control, manual_override):
        """
        Receive a CarlaEgoVehicleControl msg and send to CARLA

        This function gets called whenever a ROS CarlaEgoVehicleControl is received.
        If the mode is valid (either normal or manual), the received ROS message is
        converted into carla.VehicleControl command and sent to CARLA.
        This bridge is not responsible for any restrictions on velocity or steering.
        It's just forwarding the ROS input to CARLA

        :param manual_override: manually override the vehicle control command
        :param ros_vehicle_control: current vehicle control input received via ROS
        :type ros_vehicle_control: carla_msgs.msg.CarlaEgoVehicleControl
        :return:
        """
        if manual_override == self.vehicle_control_override:
            vehicle_control = VehicleControl()
            vehicle_control.hand_brake = ros_vehicle_control.hand_brake
            vehicle_control.brake = ros_vehicle_control.brake
            vehicle_control.steer = ros_vehicle_control.steer
            vehicle_control.throttle = ros_vehicle_control.throttle
            vehicle_control.reverse = ros_vehicle_control.reverse
            vehicle_control.manual_gear_shift = ros_vehicle_control.manual_gear_shift
            vehicle_control.gear = ros_vehicle_control.gear
            self.carla_actor.apply_control(vehicle_control)
            self._vehicle_control_applied_callback(self.get_id())

注释很清楚的说明了 接收 CarlaEgoVehicleControl消息,发送给 CARLA

self.carla_actor.apply_control(vehicle_control)

这个函数就是来控制仿真车辆。

3. 总结

该包将 Ackermann messages 转换为CarlaEgoVehicleControl 消息的,实际在 ROS Bridge 中使用的是 CarlaEgoVehicleControl 消息发送给 CARLA 的,所以如果是 ROSAutoware 对接那么就应该使用这个包,如果是和其它系统对接,比如 Apollo,那么只需要将 Apollo 的相应消息转化为 CarlaEgoVehicleControl 格式即可。

4. ROS API

4.1 Subscriptions

TopicTypeDescription
/carla//ackermann_cmdackermann_msgs.AckermannDriveSubscriber for steering commands

4.2 Publications

TopicTypeDescription
/carla//ackermann_control/control_infocarla_ackermann_control.EgoVehicleControlInfoThe current values used within the controller (useful for debugging)
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
你好,C知道!关于你提到的错误信息,出现这个错误是因为在安装过程中无法解析某些软件或堆栈的 rosdep 依赖项。具体来说,carla_ackermann_control 需要 ackermann_msgs,而 carla_ros_bridge 需要 derived_object_msgs,但是这些依赖项的 rosdep 定义无法找到。 为了解决这个问题,你可以尝试以下几个步骤: 1. 确保你的 ROS 环境正确设置。你可以通过运行以下命令来检查: ``` source /opt/ros/<YOUR_ROS_VERSION>/setup.bash ``` 将 `<YOUR_ROS_VERSION>` 替换为你正在使用的 ROS 版本。 2. 更新并安装所有可解析的依赖项。根据你的错误信息,所有可解决的依赖项都已经安装成功。因此,你可以继续进行后续步骤。 3. 尝试手动安装缺少的依赖项。在你的工作空间或 ROS 系统中,查找并安装 ackermann_msgs 和 derived_object_msgs 软件。你可以使用以下命令进行安装: ``` sudo apt-get install ros-<YOUR_ROS_VERSION>-ackermann-msgs sudo apt-get install ros-<YOUR_ROS_VERSION>-derived-object-msgs ``` 确保将 `<YOUR_ROS_VERSION>` 替换为你正在使用的 ROS 版本。 4. 重新编译并安装 carla_ackermann_controlcarla_ros_bridge 软件。运行以下命令: ``` catkin_make ``` 这将重新编译你的工作空间,并希望能够解决缺少依赖项的问题。 如果以上步骤没有解决问题,还请提供更多的错误信息和上下文,以便更好地帮助你解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wohu007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值