主要内容

自动化停车剂用品在Matlab中的ROS

此示例显示如何分发自动化停车剂代客(自动驾驶工具箱)在ROS网络中的各个节点中的应用。根据您的系统,使用MATLAB®或Simulink®的ROS和ROS 2网络提供此示例。金宝app这里显示的示例使用ROS和MATLAB。有关其他示例,请参阅:

概述

这个例子是延伸的自动化停车剂代客(自动驾驶工具箱)示例在自动驾驶工具箱™。一个典型的自治应用程序有以下组件。

为简单起见,本例集中讨论规划、控制和简化的车辆模型。该示例使用预先录制的数据替换本地化信息。

这个应用程序演示了将各种功能划分为ROS节点的典型方法。下面的图片显示了如何将上面的示例划分为不同的节点。每个节点:规划、控制和车辆是一个ROS节点,实现如下所示的功能。节点之间的互连显示了在每个节点互连上使用的主题。

设置

首先,加载行为规划器和路径分析仪使用的路由计划和给定的CostMap。行为规划师,路径规划器,路径分析仪,横向和逻辑控制器由辅助类实现,该辅助类是使用此示例辅助功能调用的设置。

exampleHelperROSValetSetupGlobals;

初始化的全局被组织为全局结构中的字段,代客

DISP(VALET)
Maplayers:[1×1 struct] costmap:[1×1车辆触控图] VeLicledims:[1×1车辆ledimensions] Maxsteeringangle:35数据:[1×1结构] RoutePlan:[4×3表]电阻:[4 12 0]车辆[1×1 examplehelperrosvaletvehiclipmulator] Beufforealplanner:[1×1 examplehelperrosvaletbehavioralplanner] motionplanner:[1×1 pathplannerrrt]守门:[56 11 0] Refpath:[1×1驾驶.Path]过渡:[14×3双]方向:[522×1双] CurrentVel:0近似分析:0.1000 Numsmoothapse:522 MAXSPEED:5 StartSpeed:0 Endpeed:0发出:[522×3双] CumLength:[522×1双]曲率:[522×1双]曲线:[522×1双] Sampletime:0.1000 LONController:[1×1 examplehelperrosvaletlongitudinalController] ControlRate:[1×1 examplehelperrosvaletfixedrate] PathAnalyzer:[1×1 examplehelperrosvaletpathanalyzer]花束:[36 44 90]

初始化ROS网络。

玫瑰聊;
启动ROS核心 ... ..................................................................................用时5.3625秒。

在http://192.168.0.10:60903上初始化ROS master。使用NodeURI http://sbd508773glnxa64:42335/初始化全局节点/matlab_global_node_49911
masterHost ='localhost'

应用程序中的功能分布在ROS节点中。这个例子使用了三个ROS节点:planningNodeControlNode.,vehicleNode

规划

规划节点基于当前车辆位置计算每个路径段。此节点负责生成平滑路径并发布网络路径。

该节点发布以下主题:

  • / smoothpath

  • / velprofile

  • /方向

  • /速度

  • / nextgoal

该节点订阅以下主题:

  • / currentvel

  • / currentpose

  • / desiredvel

  • / reachgoal

收到一个/ reachgoal消息时,节点运行examplehelperros2valetplannercallback.Callback,它计划下一个部分。

创建规划节点

planningNode = ros。节点('规划', masterHost);

为规划节点创建发布者。为ROS网络上不存在的主题指定发布者或订阅者的消息类型。

规划。PathPub = ros。出版商(planningNode' / smoothpath ''std_msgs / float64multiarray');plann.velpub = ros.publisher(Cranchnnode,'/ valprofile''std_msgs / float64multiarray');规划。DirPub = ros。出版商(planningNode' /方向''std_msgs / float64multiarray');规划。SpeedPub = ros。出版商(planningNode'/速度''std_msgs / float64multiarray');规划。NxtPub = ros。出版商(planningNode'/ nextgoal'“geometry_msgs / Pose2D”);

为计划者创建订阅者,planningNode

规划。CurVelSub = ros。订户(planningNode' / currentvel '“std_msgs / Float64”);规划。CurPoseSub = ros。订户(planningNode' / currentpose '“geometry_msgs / Pose2D”);规划。DesrVelSub = ros。订户(planningNode'/ lausendvel'“std_msgs / Float64”);

创建用户,GoalReachSub,要听的/ reachgoal规划节点的主题并指定回调动作。

GoalReachSub = ros。订户(planningNode' / reachgoal ''std_msgs / bool');GoaleReachSub.NewMessageFCN = @(〜,msg)examplehelperrosvaletplannercallback(msg,planning,gromet);

控制

控制节点负责纵向和横向控制器。该节点发布以下主题:

  • / steeringangle.

  • / accelcmd

  • / decelcmd

  • / vehdir

  • / reachgoal

该节点订阅以下主题:

  • / smoothpath

  • /方向

  • /速度

  • / currentpose

  • / currentvel

  • / nextgoal

  • / velprofile

收到一个/ velprofile消息时,节点运行examplehelperros2valetcontrolcallball.回调,它向车辆发送控制消息

创建一个控制器,ControlNode.,并在节点中设置发布商和订阅者。

CONTROLNODE = ROS.NODE('控制', masterHost);对控制器的%发布商control.steringpub = ros.publisher(ControlNode,'/ steeringangle'“std_msgs / Float64”);控制。AccelPub = ros。出版商(controlNode'/ accelcmd'“std_msgs / Float64”);控制。DecelPub = ros。出版商(controlNode'/ decelcmd'“std_msgs / Float64”);控制。VehDirPub = ros。出版商(controlNode'/ vehdir'“std_msgs / Float64”);控制。VehGoalReachPub = ros。出版商(controlNode' / reachgoal ');ControlNode的%订阅者control.pathsub = ros.subscriber(ControlNode,' / smoothpath ');control.dirsub = ros.subscriber(ControlNode,' /方向');控制。SpeedSub = ros。订户(controlNode'/速度');control.curpossub = ros.subscriber(ControlNode,' / currentpose ');control.curvelsub = ros.subscriber(ControlNode,' / currentvel ');控制。NextGoalSub = ros。订户(controlNode'/ nextgoal');%为控制节点创建/ valProfile的订户并提供回调函数。VelProfSub = ros。订户(controlNode'/ valprofile');VelProfSub。NewMessageFcn = @(~,msg)exampleHelperROSValetControlCallback(msg, control, valet);

车辆

Vehicle节点负责仿真车辆模型。该节点发布以下主题:

  • / currentvel

  • / currentpose

该节点订阅以下主题:

  • / accelcmd

  • / decelcmd

  • / vehdir

  • / steeringangle.

收到一个/ steeringangle.消息,车辆模拟器在回调函数中运行,examplehelperrosvaletvehiclecallball

%创建车辆节点。vehicleNode = ros。节点(“汽车”, masterHost);为车辆节点创建发布者。车辆。CurVelPub = ros。出版商(vehicleNode' / currentvel ');车辆。CurPosePub = ros。出版商(vehicleNode' / currentpose ');为车辆节点创建订阅者。车辆。AccelSub = ros。订户(vehicleNode'/ accelcmd');车辆.decelsub = ros.subscriber(vehiclenode,'/ decelcmd');车辆。DirSub = ros。订户(vehicleNode'/ vehdir');%创建订户/转向|运行车辆模拟器%的回调。SteeringSub = ros。订户(vehicleNode'/ steeringangle'...@(~,味精)exampleHelperROSValetVehicleCallback(味精、车辆、代客));

初始化模拟

初始化仿真,发送第一速度信息和当前姿态信息。此消息导致规划器启动规划循环。

curVelMsg = getROSMessage (vehicle.CurVelPub.MessageType);curVelMsg。数据= valet.vehicleSim.getVehicleVelocity;发送(车辆。CurVelPub curVelMsg);curPoseMsg = getROSMessage (vehicle.CurPosePub.MessageType);curPoseMsg。X = valet.currentPose (1);curPoseMsg。Y = valet.currentPose (2); curPoseMsg.Theta = valet.currentPose(3); send(vehicle.CurPosePub, curPoseMsg); reachMsg = getROSMessage(control.VehGoalReachPub.MessageType); reachMsg.Data = true; send(control.VehGoalReachPub, reachMsg);

主循环

主循环等待行为普朗纳说车辆到达了预停地点。

尽管~ reachedDestination (valet.behavioralPlanner)暂停(1);结束%显示车辆仿真图。showFigure (valet.vehicleSim);

公园机动

停车机动回调与正常驾驶机动略有不同。的回调函数/ velprofile/ reachgoal订阅者。

VelProfSub。NewMessageFcn = @(~,msg)exampleHelperROSValetParkControlCallback(msg, control, valet);GoalReachSub。NewMessageFcn = @(~,msg)exampleHelperROSValetParkManeuver(msg, planning, valet);暂停(1);reachMsg = getROSMessage (control.VehGoalReachPub.MessageType);reachMsg。数据= false;发送(控制。VehGoalReachPub reachMsg);%收到来自| /达达的消息|主题使用子标力。这个%等待直到收到新消息。显示图。机动车%已完成全自动代客操作。收到(GoaleReachsub);examplehelperrosvaletclosefigures;snapnow;

删除模拟器并通过清除发布者,订阅者和节点句柄来关闭所有节点。

删除(valet.vehicleSim);%清除上面创建的变量。清楚(“管家”);GoalReachSub。NewMessageFcn = [];VelProfSub。NewMessageFcn = [];清楚('规划''cillingnode'“GoalReachSub”);清楚('控制''ControlNode'“VelProfSub”);清楚(“汽车”“vehicleNode”“SteeringSub”);清楚(“curPoseMsg”“curVelMsg”'returmsg');清楚(“masterHost”);%关闭ROS网络。rosshutdown;
使用NodeURI http://sbd508773glnxa64:42335/关闭全局节点/matlab_global_node_49911