Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
181ec27
Added sync-awf-latest.yaml
SakodaShintaro Jan 23, 2025
5b65cf0
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Mar 27, 2025
bc10be7
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Mar 28, 2025
cfae0e9
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Apr 3, 2025
f35a425
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Apr 3, 2025
f02df94
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Apr 19, 2025
7c25f43
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Apr 23, 2025
dbd54fb
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Apr 24, 2025
5c1c8ef
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Apr 24, 2025
b0f3ea6
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user May 1, 2025
ef356a6
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user May 1, 2025
b62d269
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user May 1, 2025
2743e95
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user May 1, 2025
005e61e
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user May 14, 2025
e63608a
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user May 21, 2025
e8ab1c4
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user May 22, 2025
70768cc
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user May 23, 2025
135ae57
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user May 28, 2025
d9c919a
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user May 29, 2025
26926bd
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jun 7, 2025
1707c73
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jun 16, 2025
ded0ac7
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jun 18, 2025
acd129e
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jun 20, 2025
9503b84
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jun 23, 2025
37012f5
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jun 24, 2025
1d995a3
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jun 26, 2025
698f44d
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jun 26, 2025
29f7ade
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jun 27, 2025
bd2bfdb
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jul 1, 2025
64a9b75
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jul 11, 2025
30fc6bf
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jul 18, 2025
3000f72
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jul 23, 2025
194541c
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jul 23, 2025
7e4ad23
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jul 30, 2025
6923edf
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jul 30, 2025
ddc87a8
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Jul 31, 2025
fcb2ded
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Aug 1, 2025
f412064
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Aug 4, 2025
5ed71fd
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Aug 4, 2025
969c760
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Aug 8, 2025
7d1b496
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Aug 12, 2025
923d268
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Aug 18, 2025
6d322ce
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Aug 18, 2025
df80c02
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Aug 19, 2025
50bd520
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Aug 26, 2025
8354995
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Aug 28, 2025
2cd06c6
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Sep 3, 2025
925452d
Merge remote-tracking branch 'awf/main' into awf-latest
actions-user Sep 4, 2025
d18db1a
separate validator func from generator
t4-adc Sep 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 26 additions & 0 deletions .github/workflows/sync-awf-latest.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: sync-awf-latest

on:
schedule:
- cron: 50 */1 * * * # every 1 hour (**:50)
workflow_dispatch:

jobs:
sync-awf-latest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
token: ${{ secrets.TOKEN_TO_MODIFY_WOKFLOW }}

Check warning on line 14 in .github/workflows/sync-awf-latest.yaml

View workflow job for this annotation

GitHub Actions / spell-check-differential

Unknown word (WOKFLOW)
fetch-depth: 0
- name: Commit Results
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"

git checkout awf-latest
git remote add awf https://github.com/autowarefoundation/autoware_tools
git fetch awf main
git rebase awf/main

git push origin awf-latest --force
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<arg name="vehicle_model" default="autoware_sample_vehicle"/>

<!-- flag -->
<arg name="mode" default="AUTO" description="select from AUTO, GUI, and VMB"/>
<arg name="mode" default="AUTO" description="select from AUTO, GUI, VMB and VALIDATION"/>
<arg name="rviz" default="true"/>
<arg name="centerline_source" default="optimization_trajectory_base" description="select from optimization_trajectory_base and bag_ego_trajectory_base"/>

Expand Down
3 changes: 3 additions & 0 deletions planning/autoware_static_centerline_generator/src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ int main(int argc, char * argv[])
node->save_map();
} else if (mode == "GUI") {
node->generate_centerline();
} else if (mode == "VALIDATION") {
node->load_centerline();
node->validate_centerline();
} else if (mode == "VMB") {
// Do nothing
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@
#include <memory>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>

#define RESET_TEXT "\x1B[0m"
Expand Down Expand Up @@ -343,6 +344,97 @@ void StaticCenterlineGeneratorNode::generate_centerline()
visualize_selected_centerline();
}

void StaticCenterlineGeneratorNode::load_centerline()
{
// declare planning setting parameters
const auto lanelet2_input_file_path = declare_parameter<std::string>("lanelet2_input_file_path");
if (lanelet2_input_file_path == "") {
throw std::invalid_argument("The `lanelet2_input_file_path` is empty.");
}

// process
load_map(lanelet2_input_file_path);
const auto start_lanelet_id = declare_parameter<int64_t>("start_lanelet_id");
const auto end_lanelet_id = declare_parameter<int64_t>("end_lanelet_id");
const auto route = plan_route_by_lane_ids(start_lanelet_id, end_lanelet_id);
const auto lanelet_sequence = get_lanelet_sequence_from_param();
const auto [centerline, lane_ids] = get_centerline_from_lane_ids(lanelet_sequence);
centerline_handler_ = CenterlineHandler(CenterlineWithRoute{centerline, route});
centerline_handler_.add_centerline_lane_ids(lane_ids);

visualize_selected_centerline();
}

std::vector<lanelet::Id> StaticCenterlineGeneratorNode::get_lanelet_sequence_from_param()
{
const auto lanelet_sequence_str =
autoware::universe_utils::getOrDeclareParameter<std::string>(*this, "lanelet_sequence");
std::vector<lanelet::Id> lanelet_sequence;
if (!lanelet_sequence_str.empty()) {
std::vector<std::string> tokens;
boost::split(tokens, lanelet_sequence_str, boost::is_any_of(","), boost::token_compress_on);
for (const auto & token : tokens) {
lanelet_sequence.push_back(std::stoll(token));
}
}
return lanelet_sequence;
}

std::pair<std::vector<TrajectoryPoint>, std::vector<lanelet::Id>>
StaticCenterlineGeneratorNode::get_centerline_from_lane_ids(
const std::vector<lanelet::Id> & lane_ids) const
{
std::vector<TrajectoryPoint> centerline_points;
std::vector<lanelet::Id> lane_ids_for_points;

for (size_t i = 0; i < lane_ids.size(); ++i) {
const auto id = lane_ids[i];
const auto lanelet = route_handler_ptr_->getLaneletsFromId(id);

const auto & centerline = lanelet.centerline();
for (size_t j = 0; j < centerline.size(); ++j) {
// skip duplicated points
if (!centerline_points.empty() && j == 0 && i > 0) {
const auto & prev = centerline_points.back().pose.position;
const auto & curr = centerline[j];
if (prev.x == curr.x() && prev.y == curr.y() && prev.z == curr.z()) {
continue;
}
}

TrajectoryPoint pt;
// position
pt.pose.position.x = centerline[j].x();
pt.pose.position.y = centerline[j].y();
pt.pose.position.z = centerline[j].z();

// orientation
double yaw = 0.0;
if (centerline.size() >= 2) {
if (j < centerline.size() - 1) {
double dx = centerline[j + 1].x() - centerline[j].x();
double dy = centerline[j + 1].y() - centerline[j].y();
yaw = std::atan2(dy, dx);
} else if (j > 0) {
double dx = centerline[j].x() - centerline[j - 1].x();
double dy = centerline[j].y() - centerline[j - 1].y();
yaw = std::atan2(dy, dx);
}
}
tf2::Quaternion q;
q.setRPY(0, 0, yaw);
pt.pose.orientation = tf2::toMsg(q);

centerline_points.push_back(pt);
lane_ids_for_points.push_back(id);
}
}
if (centerline_points.empty()) {
throw std::runtime_error("The centerline is empty.");
}
return {centerline_points, lane_ids_for_points};
}

CenterlineWithRoute StaticCenterlineGeneratorNode::generate_whole_centerline_with_route()
{
if (!route_handler_ptr_) {
Expand Down Expand Up @@ -491,26 +583,18 @@ LaneletRoute StaticCenterlineGeneratorNode::plan_route_by_lane_ids(
}();

// plan route
const auto lanelet_sequence_str =
autoware::universe_utils::getOrDeclareParameter<std::string>(*this, "lanelet_sequence");
if (lanelet_sequence_str.empty()) {
return plan_route(start_pose, end_pose);
// lanelet_sequenceパラメータがあればそれを使う
const auto lanelet_sequence = get_lanelet_sequence_from_param();
if (!lanelet_sequence.empty()) {
return plan_route_from_lanelet_sequence(lanelet_sequence);
} else {
return plan_route_from_lanelet_sequence(lanelet_sequence_str);
return plan_route(start_pose, end_pose);
}
}

LaneletRoute StaticCenterlineGeneratorNode::plan_route_from_lanelet_sequence(
const std::string & lanelet_sequence_str) const
const std::vector<lanelet::Id> & lanelet_sequence) const
{
std::vector<lanelet::Id> lanelet_sequence;
std::vector<std::string> tokens;
boost::split(tokens, lanelet_sequence_str, boost::is_any_of(","), boost::token_compress_on);
for (const auto & token : tokens) {
lanelet_sequence.push_back(std::stoll(token));
}

// create route from lanelet sequence
LaneletRoute route;
route.start_pose = utils::get_center_pose(*route_handler_ptr_, lanelet_sequence.front());
route.goal_pose = utils::get_center_pose(*route_handler_ptr_, lanelet_sequence.back());
Expand Down Expand Up @@ -783,6 +867,11 @@ void StaticCenterlineGeneratorNode::validate_centerline()
centerline_lane_id_map_order.push_back(centerline_lane_id);

const auto lanelet = route_handler_ptr_->getLaneletsFromId(centerline_lane_id);
if (lanelet.centerline().empty()) {
std::cerr << "Warning: lanelet id " << centerline_lane_id << " has no centerline."
<< std::endl;
continue;
}
for (const auto & point : lanelet.rightBound()) {
boost::geometry::append(
lanelet_right_bound_map.at(centerline_lane_id), Point2d(point.x(), point.y()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ struct CenterlineHandler
}
void clear_centerline_lane_ids() { centerline_lane_ids.clear(); }
void add_centerline_lane_id(const lanelet::Id lane_id) { centerline_lane_ids.push_back(lane_id); }
void add_centerline_lane_ids(const std::vector<lanelet::Id> & ids) { centerline_lane_ids = ids; }
std::vector<lanelet::Id> get_centerline_lane_ids() const { return centerline_lane_ids; }

std::optional<CenterlineWithRoute> whole_centerline_with_route{std::nullopt};
Expand All @@ -109,6 +110,7 @@ class StaticCenterlineGeneratorNode : public rclcpp::Node
public:
explicit StaticCenterlineGeneratorNode(const rclcpp::NodeOptions & node_options);
void generate_centerline();
void load_centerline();
void connect_centerline_to_lanelet();
void validate_centerline();
void save_map();
Expand All @@ -125,10 +127,11 @@ class StaticCenterlineGeneratorNode : public rclcpp::Node
LaneletRoute plan_route(
const geometry_msgs::msg::Pose & start_center_pose,
const geometry_msgs::msg::Pose & end_center_pose);
LaneletRoute plan_route_from_lanelet_sequence(const std::string & lanelet_sequence_str) const;

LaneletRoute plan_route_from_lanelet_sequence(
const std::vector<lanelet::Id> & lanelet_sequence) const;
void on_plan_route(
const PlanRoute::Request::SharedPtr request, const PlanRoute::Response::SharedPtr response);
std::vector<lanelet::Id> get_lanelet_sequence_from_param();

// plan centerline
CenterlineWithRoute generate_whole_centerline_with_route();
Expand All @@ -139,6 +142,10 @@ class StaticCenterlineGeneratorNode : public rclcpp::Node

void visualize_selected_centerline();

// validation pre-process
std::pair<std::vector<TrajectoryPoint>, std::vector<lanelet::Id>> get_centerline_from_lane_ids(
const std::vector<lanelet::Id> & lane_ids) const;

// parameter
template <typename T>
T getRosParameter(const std::string & param_name)
Expand Down
Loading