当前位置: 首页 > article >正文

ros_bridge ackermann控制

在ros_bridge中,除了使用manual_control包来直接使用键盘来控制仿真小车,还可以通过ackermann(阿克曼)来控制。在carla和autoware联合仿真的过程中,autoware最终的控制信息是要转换为ackermann控制指令,最后控制仿真车。
消息的整个流程如下图所示
在这里插入图片描述

/carla_ackerman_control_ego_vehicle

这个节点用来生成ackermann节点。

self.speed_controller = PID(Kp=0.0,Ki=0.0,Kd=0.0,sample_time=0.05,output_limits=(-1., 1.))self.accel_controller = PID(Kp=0.0,Ki=0.0,Kd=0.0,sample_time=0.05,output_limits=(-1, 1))

这个节点是使用PID来控制速度和加速度

rospy.set_param("/carla/" + self.role_name + "/ackermann_control/speed_Kp",rospy.get_param("/carla/ackermann_control/speed_Kp", 0.05))rospy.set_param("/carla/" + self.role_name + "/ackermann_control/speed_Ki",rospy.get_param("/carla/ackermann_control/speed_Ki", 0.00))rospy.set_param("/carla/" + self.role_name + "/ackermann_control/speed_Kd",rospy.get_param("/carla/ackermann_control/speed_Kd", 0.50))rospy.set_param("/carla/" + self.role_name + "/ackermann_control/accel_Kp",rospy.get_param("/carla/ackermann_control/accel_Kp", 0.05))rospy.set_param("/carla/" + self.role_name + "/ackermann_control/accel_Ki",rospy.get_param("/carla/ackermann_control/accel_Ki", 0.00))rospy.set_param("/carla/" + self.role_name + "/ackermann_control/accel_Kd",rospy.get_param("/carla/ackermann_control/accel_Kd", 0.05))self.reconfigure_server = Server(EgoVehicleControlParameterConfig,namespace="/carla/" + self.role_name + "/ackermann_control",callback=(lambda config, level: CarlaAckermannControl.reconfigure_pid_parameters(self, config, level)))

这个用来设置ackermann的各种参数,并且定义了一个参数服务器

订阅消息

self.control_subscriber = rospy.Subscriber("/carla/" + self.role_name + "/ackermann_cmd",AckermannDrive, self.ackermann_command_updated)# current status of the vehicleself.vehicle_status_subscriber = rospy.Subscriber("/carla/" + self.role_name + "/vehicle_status",CarlaEgoVehicleStatus, self.vehicle_status_updated)# vehicle infoself.vehicle_info_subscriber = rospy.Subscriber("/carla/" + self.role_name + "/vehicle_info",CarlaEgoVehicleInfo, self.vehicle_info_updated)

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

/carla/ego_vehicle/ackermann_cmd topic发布消息格式是ackermann_msgs/AckermannDrive

float32 steering_angle //转向角
float32 steering_angle_velocity //转向角的速度
float32 speed //向前的速度
float32 acceleration //加速度
float32 jerk //变加速度

如果想要控制车辆的行驶,就可以发送这个消息。autoware就是发送这个消息来控制车辆的行驶。
也可以手动发送

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

图片中的/rostopic_1058_xxx 这个节点就是手动发送的数据
另外两个是订阅车的信息和车的状态

发布消息

 # to send command to carlaself.carla_control_publisher = rospy.Publisher("/carla/" + self.role_name + "/vehicle_control_cmd",CarlaEgoVehicleControl, queue_size=1)# report controller infoself.control_info_publisher = rospy.Publisher("/carla/" + self.role_name + "/ackermann_control/control_info",EgoVehicleControlInfo, queue_size=1)

ackermann节点发布两个消息:

  • CarlaEgoVehicleContorl 车里的控制消息

在这里插入图片描述

  • CarlaEgoVehicleInfo
    这个是车辆的静态信息,主要是定义车辆的物理属性

在这里插入图片描述
发布的/carla/eog_vehicle/vehicle_congrol_cmd消息是被/carla_ros_bridge 节点下的ego_vehicle.py文件接收

 self.control_subscriber = rospy.Subscriber(self.get_topic_prefix() + "/vehicle_control_cmd",CarlaEgoVehicleControl,lambda data: self.control_command_updated(data, manual_override=False))
    def control_command_updated(self, ros_vehicle_control, manual_override):"""Receive a CarlaEgoVehicleControl msg and send to CARLAThis function gets called whenever a ROS CarlaEgoVehicleControl is received.If the mode is valid (either normal or manual), the received ROS message isconverted 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_brakevehicle_control.brake = ros_vehicle_control.brakevehicle_control.steer = ros_vehicle_control.steervehicle_control.throttle = ros_vehicle_control.throttlevehicle_control.reverse = ros_vehicle_control.reverseself.carla_actor.apply_control(vehicle_control)self._vehicle_control_applied_callback(self.get_id())

注释书说的很清楚,接收CarlaEgoVehicleControl消息,发送给carla。
self.carla_actor.apply_control(vehicle_control)这个函数就是来控制仿真车辆。

在图中还有/carla_ego_vehicle_ego_vehicle节点,这个节点是用来生成车辆和传感器的。
是静态的,并不参与数据的传输和处理。车辆相关的传感器和控制之类的都是在/carla_ros_bridge
这个节点中,这个节点会通过world对象,拿到/carla_ego_vehicle_ego_vehicle节点生产的传感器
和车辆,在bridge.py文件中,把传感器和对应的ros_bridge对象进行绑定。
在bridge.py文件中,绑定的是在

def _create_actor(self, carla_actor):

函数中。

/carla_ros_bridge文件目录
在这里插入图片描述
车辆数据的绑定和订阅和发布消息就是在ego_vehicle.py文件中,图中的/carla_ego_vehicle/vehicle_info和
/carla_ego_vehicle/vehicle_status消息就是在ego_vehicle.py文件中发布的。

http://www.lryc.cn/news/2420511.html

相关文章:

  • 微信推出“微信圈子”,玩起来原来这么爽?
  • 数据库——概念模型(CDM)、逻辑模型(LDM)、物理模型(PDM)
  • vnc远程控制linux密码,使用VNC实现LINUX与windows的相互远程控制
  • 《WinForm开发系列之控件篇》Item2 BindingNavigator
  • 会声会影x4素材_会声会影2020旗舰版Corel VideoStudio Ultimate 2020中文版
  • hadoop集群搭建(一)(超详细)
  • 网络爬虫:爬取网页数据
  • 一文全面讲清操作系统,附各类操作系统(windows、macOS 、ChromeOS等应知应会)
  • xcode 升级到4.5 version file compare功能无法使用的问题
  • 三级网络技术应付式速成考试笔记(汇总)
  • 很高兴大家下载rapid-framework
  • Ubuntu 安装Sougou Pinyin输入法
  • InoReader—— 轻便快捷的在线 RSS 阅读器
  • Web开发设计:DisplayTag应用指南
  • 硬币面值组合(C++)(枚举)
  • 帝国CMS二次开发入门教程
  • 回发或回调参数无效。 问题的解决和思考
  • dreamweaver4.0--9.0序列码全(学习参考)(仅供记忆用)
  • 创建视图簇SE54并SE93赋予事务代码
  • 哔哩下载姬(downkyi)v1.4.0 B站视频下载工具 哔哩哔哩视频解析
  • 对Gamma校正的理解
  • use sentences perfectly
  • 爬虫登陆实战 --- QQ音乐扫码登陆!真不难!
  • 逻辑非运算“!”,双重非运算
  • [技巧攻略] Zombie Cafe攻略 僵尸咖啡厅图文详解+刷级攻略
  • Node.js可以做什么
  • 理解P值
  • 09、Swift中的class
  • 淘宝宝贝详情页设计指南:从构思到实现,打造高转化率的页面
  • 详解箭头函数和普通函数的区别以及箭头函数的注意事项、不适用场景