2026/5/21 14:53:12
网站建设
项目流程
用笔记本做网站服务器,公司新建了网站以前的就网站可以全部删除吗,济宁网站建设培训,网站建设英文版自动驾驶代码-Ros移植Apollo规划方案#xff0c;可编译运行#xff0c;包含autoware的Lanelet2框架。
帮助大家快速入门实践。
完善代码#xff0c;加功能等。移植Apollo规划算法到ROS生态这件事#xff0c;咱们搞自动驾驶的多少都心动过。毕竟Apollo的规划模块在业界算是扛…自动驾驶代码-Ros移植Apollo规划方案可编译运行包含autoware的Lanelet2框架。 帮助大家快速入门实践。 完善代码加功能等。移植Apollo规划算法到ROS生态这件事咱们搞自动驾驶的多少都心动过。毕竟Apollo的规划模块在业界算是扛把子但真要把它塞进ROS框架里跑起来光环境配置就能劝退一票人。今天咱们整点实在的直接带大家把手弄脏用Lanelet2地图玩转移植后的规划模块。先看环境配置这个拦路虎。拿Ubuntu 20.04来说装完ROS Noetic后记得先拉取Lanelet2的定制分支git clone --branch ros_compatible https://github.com/your_fork/lanelet2.git这步别直接用官方仓库有些ROS消息类型得魔改。编译时候CMakeLists里要特别注意protobuf版本Apollo用的v3.19.4和ROS默认的经常打架。我一般在工程顶层CMake加上find_package(Protobuf REQUIRED 3.19.4 EXACT) include_directories(${Protobuf_INCLUDE_DIRS})编译出错大概率是这里版本没卡死。移植的核心在规划器接口适配。Apollo原生的ReferenceLineProvider在ROS里得换成Lanelet2的地图服务。看这个路径转换函数void convertLaneletPath(const lanelet::LaneletPath path, std::vectorcommon::PathPoint* points) { for (const auto p : path) { auto centerline p.centerline(); for (const auto pt : centerline) { points-emplace_back(pt.x(), pt.y(), pt.z()); // 这里注意Apollo的z轴处理方式不同 if (!points-empty()) { auto last points-back(); last.set_s(common::util::Distance(last, points-back())); } } } }这段代码的坑在于s值计算——Apollo用累积距离而Lanelet2默认用投影。建议在转换时重算s值否则后续规划会出鬼畜轨迹。调试时最有用的是把规划结果可视化。在ROS里搞个Rviz插件比Apollo的cyber_monitor方便多了def publish_debug_markers(ego_pose, trajectory): marker_array MarkerArray() marker Marker() marker.type Marker.LINE_STRIP marker.scale.x 0.1 marker.color.a 0.8 marker.color.r 1.0 for point in trajectory: p Point() p.x point.x p.y point.y marker.points.append(p) marker_array.markers.append(marker) debug_pub.publish(marker_array)这个可视化技巧能救命上次我靠它发现横向加速度突变是因为坐标系转换时漏了个旋转矩阵。自动驾驶代码-Ros移植Apollo规划方案可编译运行包含autoware的Lanelet2框架。 帮助大家快速入门实践。 完善代码加功能等。功能扩展方面推荐先加个紧急制动触发逻辑。在Apollo的Planner基类里插个钩子class EmergencyBrakeDecider : public Decider { public: void UpdateBrakeStatus(const LocalizationEstimate localization) override { if (collision_checker_.ImminentCollision()) { trajectory_-mutable_trajectory_point(i)-set_v(0.0); // 这里需要同步修改steer角度防止甩尾 adjustSteeringForEmergency(trajectory_); } } };注意直接置零速度会导致控制模块震荡最好做个平滑衰减。实测加个tanh衰减曲线比阶跃信号稳得多。最后说下怎么验证效果。用LGSVL仿真时别急着上复杂场景先在直道上测试变道逻辑。观察规划模块输出的曲率连续性突然跳变多半是Frenet坐标系转换没对齐。有个邪门技巧——把规划周期从100ms改成150ms有时反而更顺可能跟控制模块的预测时域有关。移植完别以为就完事了真正的挑战在性能调优。曾经有个内存泄漏坑了我两周最后发现是Protobuf的重复注册导致的。建议用Valgrind跑个压力测试valgrind --leak-checkfull --show-leak-kindsall ./planning_node遇到alloc次数异常飙升的情况重点检查回调函数里的对象创建有没有用智能指针包好。代码虽然能跑了但真要实用还得处理地图更新的问题。下次咱们可以聊聊怎么在Lanelet2动态加载局部地图避开高精地图全量加载的内存坑。