Skip to content

Commit 791fd51

Browse files
authored
feat(simple_planning_simulator): add control_mode server (#1061)
* add control-mode in simulator Signed-off-by: Takamasa Horibe <horibe.takamasa@gmail.com> * precommit Signed-off-by: Takamasa Horibe <horibe.takamasa@gmail.com> * update Signed-off-by: Takamasa Horibe <horibe.takamasa@gmail.com> * update readme Signed-off-by: Takamasa Horibe <horibe.takamasa@gmail.com> * update simulator Signed-off-by: Takamasa Horibe <horibe.takamasa@gmail.com> * fix typo Signed-off-by: Takamasa Horibe <horibe.takamasa@gmail.com>
1 parent 7593c2b commit 791fd51

12 files changed

+100
-60
lines changed

simulator/simple_planning_simulator/design/simple_planning_simulator-design.md

+13-5
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,24 @@ The purpose of this simulator is for the integration test of planning and contro
1717

1818
### input
1919

20-
- input/vehicle_control_command [`autoware_auto_msgs/msg/VehicleControlCommand`] : target command to drive a vehicle.
21-
- input/ackermann_control_command [`autoware_auto_msgs/msg/AckermannControlCommand`] : target command to drive a vehicle.
22-
- input/vehicle_state_command [`autoware_auto_msgs/msg/VehicleStateCommand`] : target state command (e.g. gear).
2320
- /initialpose [`geometry_msgs/msg/PoseWithCovarianceStamped`] : for initial pose
21+
- input/ackermann_control_command [`autoware_auto_msgs/msg/AckermannControlCommand`] : target command to drive a vehicle
22+
- input/manual_ackermann_control_command [`autoware_auto_msgs/msg/AckermannControlCommand`] : manual target command to drive a vehicle (used when control_mode_request = Manual)
23+
- input/gear_command [`autoware_auto_vehicle_msgs/msg/GearCommand`] : target gear command.
24+
- input/manual_gear_command [`autoware_auto_vehicle_msgs/msg/GearCommand`] : target gear command (used when control_mode_request = Manual)
25+
- input/turn_indicators_command [`autoware_auto_vehicle_msgs/msg/TurnIndicatorsCommand`] : target turn indicator command
26+
- input/hazard_lights_command [`autoware_auto_vehicle_msgs/msg/HazardLightsCommand`] : target hazard lights command
27+
- input/control_mode_request [`tier4_vehicle_msgs::srv::ControlModeRequest`] : mode change for Auto/Manual driving
2428

2529
### output
2630

2731
- /tf [`tf2_msgs/msg/TFMessage`] : simulated vehicle pose (base_link)
28-
- /vehicle/vehicle_kinematic_state [`autoware_auto_msgs/msg/VehicleKinematicState`] : simulated kinematic state (defined in CoM)
29-
- /vehicle/state_report [`autoware_auto_msgs/msg/VehicleStateReport`] : current vehicle state (e.g. gear, mode, etc.)
32+
- /output/odometry [`nav_msgs/msg/Odometry`] : simulated vehicle pose and twist
33+
- /output/steering [`autoware_auto_vehicle_msgs/msg/SteeringReport`] : simulated steering angle
34+
- /output/control_mode_report [`autoware_auto_vehicle_msgs/msg/ControlModeReport`] : current control mode (Auto/Manual)
35+
- /output/gear_report [`autoware_auto_vehicle_msgs/msg/ControlModeReport`] : simulated gear
36+
- /output/turn_indicators_report [`autoware_auto_vehicle_msgs/msg/ControlModeReport`] : simulated turn indicator status
37+
- /output/hazard_lights_report [`autoware_auto_vehicle_msgs/msg/ControlModeReport`] : simulated hazard lights status
3038

3139
## Inner-workings / Algorithms
3240

simulator/simple_planning_simulator/include/simple_planning_simulator/simple_planning_simulator_core.hpp

+22-15
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@
4242
#include "geometry_msgs/msg/twist.hpp"
4343
#include "nav_msgs/msg/odometry.hpp"
4444
#include "tier4_external_api_msgs/srv/initialize_pose.hpp"
45+
#include "tier4_vehicle_msgs/msg/control_mode.hpp"
46+
#include "tier4_vehicle_msgs/srv/control_mode_request.hpp"
4547

4648
#include <tf2_ros/buffer.h>
4749
#include <tf2_ros/transform_listener.h>
@@ -80,6 +82,8 @@ using geometry_msgs::msg::TransformStamped;
8082
using geometry_msgs::msg::Twist;
8183
using nav_msgs::msg::Odometry;
8284
using tier4_external_api_msgs::srv::InitializePose;
85+
using tier4_vehicle_msgs::msg::ControlMode;
86+
using tier4_vehicle_msgs::srv::ControlModeRequest;
8387

8488
class DeltaTime
8589
{
@@ -130,14 +134,18 @@ class PLANNING_SIMULATOR_PUBLIC SimplePlanningSimulator : public rclcpp::Node
130134
rclcpp::Publisher<PoseStamped>::SharedPtr pub_current_pose_;
131135

132136
rclcpp::Subscription<GearCommand>::SharedPtr sub_gear_cmd_;
137+
rclcpp::Subscription<GearCommand>::SharedPtr sub_manual_gear_cmd_;
133138
rclcpp::Subscription<TurnIndicatorsCommand>::SharedPtr sub_turn_indicators_cmd_;
134139
rclcpp::Subscription<HazardLightsCommand>::SharedPtr sub_hazard_lights_cmd_;
135140
rclcpp::Subscription<VehicleControlCommand>::SharedPtr sub_vehicle_cmd_;
136141
rclcpp::Subscription<AckermannControlCommand>::SharedPtr sub_ackermann_cmd_;
142+
rclcpp::Subscription<AckermannControlCommand>::SharedPtr sub_manual_ackermann_cmd_;
137143
rclcpp::Subscription<PoseWithCovarianceStamped>::SharedPtr sub_init_pose_;
138144
rclcpp::Subscription<Trajectory>::SharedPtr sub_trajectory_;
139145
rclcpp::Subscription<Engage>::SharedPtr sub_engage_;
140146

147+
rclcpp::Service<ControlModeRequest>::SharedPtr srv_mode_req_;
148+
141149
rclcpp::CallbackGroup::SharedPtr group_api_service_;
142150
tier4_api_utils::Service<InitializePose>::SharedPtr srv_set_pose_;
143151

@@ -156,13 +164,15 @@ class PLANNING_SIMULATOR_PUBLIC SimplePlanningSimulator : public rclcpp::Node
156164
VelocityReport current_velocity_;
157165
Odometry current_odometry_;
158166
SteeringReport current_steer_;
159-
VehicleControlCommand::ConstSharedPtr current_vehicle_cmd_ptr_;
160-
AckermannControlCommand::ConstSharedPtr current_ackermann_cmd_ptr_;
161-
GearCommand::ConstSharedPtr current_gear_cmd_ptr_;
167+
AckermannControlCommand current_ackermann_cmd_;
168+
AckermannControlCommand current_manual_ackermann_cmd_;
169+
GearCommand current_gear_cmd_;
170+
GearCommand current_manual_gear_cmd_;
162171
TurnIndicatorsCommand::ConstSharedPtr current_turn_indicators_cmd_ptr_;
163172
HazardLightsCommand::ConstSharedPtr current_hazard_lights_cmd_ptr_;
164173
Trajectory::ConstSharedPtr current_trajectory_ptr_;
165-
bool current_engage_;
174+
bool simulate_motion_; //!< stop vehicle motion simulation if false
175+
ControlMode current_control_mode_;
166176

167177
/* frame_id */
168178
std::string simulated_frame_id_; //!< @brief simulated vehicle frame id
@@ -195,20 +205,10 @@ class PLANNING_SIMULATOR_PUBLIC SimplePlanningSimulator : public rclcpp::Node
195205
*/
196206
void on_vehicle_cmd(const VehicleControlCommand::ConstSharedPtr msg);
197207

198-
/**
199-
* @brief set current_ackermann_cmd_ptr_ with received message
200-
*/
201-
void on_ackermann_cmd(const AckermannControlCommand::ConstSharedPtr msg);
202-
203208
/**
204209
* @brief set input steering, velocity, and acceleration of the vehicle model
205210
*/
206-
void set_input(const float steer, const float vel, const float accel);
207-
208-
/**
209-
* @brief set current_vehicle_state_ with received message
210-
*/
211-
void on_gear_cmd(const GearCommand::ConstSharedPtr msg);
211+
void set_input(const AckermannControlCommand & cmd);
212212

213213
/**
214214
* @brief set current_vehicle_state_ with received message
@@ -242,6 +242,13 @@ class PLANNING_SIMULATOR_PUBLIC SimplePlanningSimulator : public rclcpp::Node
242242
*/
243243
void on_engage(const Engage::ConstSharedPtr msg);
244244

245+
/**
246+
* @brief ControlModeRequest server
247+
*/
248+
void on_control_mode_request(
249+
const ControlModeRequest::Request::SharedPtr request,
250+
const ControlModeRequest::Response::SharedPtr response);
251+
245252
/**
246253
* @brief get z-position from trajectory
247254
* @param [in] x current x-position

simulator/simple_planning_simulator/include/simple_planning_simulator/vehicle_model/sim_model_delay_steer_acc.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class SimModelDelaySteerAcc : public SimModelInterface
111111
float64_t getVy() override;
112112

113113
/**
114-
* @brief get vehicle longiudinal acceleration
114+
* @brief get vehicle longitudinal acceleration
115115
*/
116116
float64_t getAx() override;
117117

simulator/simple_planning_simulator/include/simple_planning_simulator/vehicle_model/sim_model_delay_steer_acc_geared.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class SimModelDelaySteerAccGeared : public SimModelInterface
111111
float64_t getVy() override;
112112

113113
/**
114-
* @brief get vehicle longiudinal acceleration
114+
* @brief get vehicle longitudinal acceleration
115115
*/
116116
float64_t getAx() override;
117117

simulator/simple_planning_simulator/include/simple_planning_simulator/vehicle_model/sim_model_ideal_steer_acc.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class SimModelIdealSteerAcc : public SimModelInterface
7474
float64_t getVy() override;
7575

7676
/**
77-
* @brief get vehicle longiudinal acceleration
77+
* @brief get vehicle longitudinal acceleration
7878
*/
7979
float64_t getAx() override;
8080

simulator/simple_planning_simulator/include/simple_planning_simulator/vehicle_model/sim_model_ideal_steer_acc_geared.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class SimModelIdealSteerAccGeared : public SimModelInterface
7575
float64_t getVy() override;
7676

7777
/**
78-
* @brief get vehicle longiudinal acceleration
78+
* @brief get vehicle longitudinal acceleration
7979
*/
8080
float64_t getAx() override;
8181

simulator/simple_planning_simulator/include/simple_planning_simulator/vehicle_model/sim_model_ideal_steer_vel.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class SimModelIdealSteerVel : public SimModelInterface
7575
float64_t getVy() override;
7676

7777
/**
78-
* @brief get vehicle longiudinal acceleration
78+
* @brief get vehicle longitudinal acceleration
7979
*/
8080
float64_t getAx() override;
8181

simulator/simple_planning_simulator/include/simple_planning_simulator/vehicle_model/sim_model_interface.hpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class SimModelInterface
128128
virtual float64_t getVy() = 0;
129129

130130
/**
131-
* @brief get vehicle longiudinal acceleration
131+
* @brief get vehicle longitudinal acceleration
132132
*/
133133
virtual float64_t getAx() = 0;
134134

@@ -142,13 +142,18 @@ class SimModelInterface
142142
*/
143143
virtual float64_t getSteer() = 0;
144144

145+
/**
146+
* @brief get vehicle gear
147+
*/
148+
uint8_t getGear() const;
149+
145150
/**
146151
* @brief get state vector dimension
147152
*/
148153
inline int getDimX() { return dim_x_; }
149154

150155
/**
151-
* @brief get input vector demension
156+
* @brief get input vector dimension
152157
*/
153158
inline int getDimU() { return dim_u_; }
154159

simulator/simple_planning_simulator/launch/simple_planning_simulator.launch.py

+3
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,14 @@ def launch_setup(context, *args, **kwargs):
5454
],
5555
remappings=[
5656
("input/ackermann_control_command", "/control/command/control_cmd"),
57+
("input/manual_ackermann_control_command", "/vehicle/command/manual_control_cmd"),
5758
("input/gear_command", "/control/command/gear_cmd"),
59+
("input/manual_gear_command", "/vehicle/command/manual_gear_command"),
5860
("input/turn_indicators_command", "/control/command/turn_indicators_cmd"),
5961
("input/hazard_lights_command", "/control/command/hazard_lights_cmd"),
6062
("input/trajectory", "/planning/scenario_planning/trajectory"),
6163
("input/engage", "/vehicle/engage"),
64+
("input/control_mode_request", "/system/control_mode_request"),
6265
("output/twist", "/vehicle/status/velocity_status"),
6366
("output/odometry", "/localization/kinematic_state"),
6467
("output/steering", "/vehicle/status/steering_status"),

simulator/simple_planning_simulator/package.xml

+1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
<depend>tier4_api_utils</depend>
2828
<depend>tier4_autoware_utils</depend>
2929
<depend>tier4_external_api_msgs</depend>
30+
<depend>tier4_vehicle_msgs</depend>
3031
<depend>vehicle_info_util</depend>
3132

3233
<exec_depend>launch_ros</exec_depend>

simulator/simple_planning_simulator/src/simple_planning_simulator/simple_planning_simulator_core.cpp

+48-33
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ SimplePlanningSimulator::SimplePlanningSimulator(const rclcpp::NodeOptions & opt
7979
simulated_frame_id_ = declare_parameter("simulated_frame_id", "base_link");
8080
origin_frame_id_ = declare_parameter("origin_frame_id", "odom");
8181
add_measurement_noise_ = declare_parameter("add_measurement_noise", false);
82-
current_engage_ = declare_parameter<bool>("initial_engage_state");
82+
simulate_motion_ = declare_parameter<bool>("initial_engage_state");
8383

8484
using rclcpp::QoS;
8585
using std::placeholders::_1;
@@ -89,9 +89,16 @@ SimplePlanningSimulator::SimplePlanningSimulator(const rclcpp::NodeOptions & opt
8989
"/initialpose", QoS{1}, std::bind(&SimplePlanningSimulator::on_initialpose, this, _1));
9090
sub_ackermann_cmd_ = create_subscription<AckermannControlCommand>(
9191
"input/ackermann_control_command", QoS{1},
92-
std::bind(&SimplePlanningSimulator::on_ackermann_cmd, this, _1));
92+
[this](const AckermannControlCommand::SharedPtr msg) { current_ackermann_cmd_ = *msg; });
93+
sub_manual_ackermann_cmd_ = create_subscription<AckermannControlCommand>(
94+
"input/manual_ackermann_control_command", QoS{1},
95+
[this](const AckermannControlCommand::SharedPtr msg) { current_manual_ackermann_cmd_ = *msg; });
9396
sub_gear_cmd_ = create_subscription<GearCommand>(
94-
"input/gear_command", QoS{1}, std::bind(&SimplePlanningSimulator::on_gear_cmd, this, _1));
97+
"input/gear_command", QoS{1},
98+
[this](const GearCommand::SharedPtr msg) { current_gear_cmd_ = *msg; });
99+
sub_manual_gear_cmd_ = create_subscription<GearCommand>(
100+
"input/manual_gear_command", QoS{1},
101+
[this](const GearCommand::SharedPtr msg) { current_manual_gear_cmd_ = *msg; });
95102
sub_turn_indicators_cmd_ = create_subscription<TurnIndicatorsCommand>(
96103
"input/turn_indicators_command", QoS{1},
97104
std::bind(&SimplePlanningSimulator::on_turn_indicators_cmd, this, _1));
@@ -100,6 +107,12 @@ SimplePlanningSimulator::SimplePlanningSimulator(const rclcpp::NodeOptions & opt
100107
std::bind(&SimplePlanningSimulator::on_hazard_lights_cmd, this, _1));
101108
sub_trajectory_ = create_subscription<Trajectory>(
102109
"input/trajectory", QoS{1}, std::bind(&SimplePlanningSimulator::on_trajectory, this, _1));
110+
111+
srv_mode_req_ = create_service<tier4_vehicle_msgs::srv::ControlModeRequest>(
112+
"input/control_mode_request",
113+
std::bind(&SimplePlanningSimulator::on_control_mode_request, this, _1, _2));
114+
115+
// TODO(Horibe): should be replaced by mode_request. Keep for the backward compatibility.
103116
sub_engage_ = create_subscription<Engage>(
104117
"input/engage", rclcpp::QoS{1}, std::bind(&SimplePlanningSimulator::on_engage, this, _1));
105118

@@ -162,6 +175,10 @@ SimplePlanningSimulator::SimplePlanningSimulator(const rclcpp::NodeOptions & opt
162175
x_stddev_ = declare_parameter("x_stddev", 0.0001);
163176
y_stddev_ = declare_parameter("y_stddev", 0.0001);
164177
}
178+
179+
// control mode
180+
current_control_mode_.data = ControlMode::AUTO;
181+
current_manual_gear_cmd_.command = GearCommand::DRIVE;
165182
}
166183

167184
void SimplePlanningSimulator::initialize_vehicle_model()
@@ -241,7 +258,15 @@ void SimplePlanningSimulator::on_timer()
241258
{
242259
const float64_t dt = delta_time_.get_dt(get_clock()->now());
243260

244-
if (current_engage_) {
261+
if (current_control_mode_.data == ControlMode::AUTO) {
262+
vehicle_model_ptr_->setGear(current_gear_cmd_.command);
263+
set_input(current_ackermann_cmd_);
264+
} else {
265+
vehicle_model_ptr_->setGear(current_manual_gear_cmd_.command);
266+
set_input(current_manual_ackermann_cmd_);
267+
}
268+
269+
if (simulate_motion_) {
245270
vehicle_model_ptr_->update(dt);
246271
}
247272
}
@@ -299,27 +324,22 @@ void SimplePlanningSimulator::on_set_pose(
299324
response->status = tier4_api_utils::response_success();
300325
}
301326

302-
void SimplePlanningSimulator::on_ackermann_cmd(
303-
const autoware_auto_control_msgs::msg::AckermannControlCommand::ConstSharedPtr msg)
327+
void SimplePlanningSimulator::set_input(const AckermannControlCommand & cmd)
304328
{
305-
current_ackermann_cmd_ptr_ = msg;
306-
set_input(
307-
msg->lateral.steering_tire_angle, msg->longitudinal.speed, msg->longitudinal.acceleration);
308-
}
329+
const auto steer = cmd.lateral.steering_tire_angle;
330+
const auto vel = cmd.longitudinal.speed;
331+
const auto accel = cmd.longitudinal.acceleration;
309332

310-
void SimplePlanningSimulator::set_input(const float steer, const float vel, const float accel)
311-
{
312333
using autoware_auto_vehicle_msgs::msg::GearCommand;
313334
Eigen::VectorXd input(vehicle_model_ptr_->getDimU());
335+
const auto gear = vehicle_model_ptr_->getGear();
314336

315337
// TODO(Watanabe): The definition of the sign of acceleration in REVERSE mode is different
316338
// between .auto and proposal.iv, and will be discussed later.
317339
float acc = accel;
318-
if (!current_gear_cmd_ptr_) {
340+
if (gear == GearCommand::NONE) {
319341
acc = 0.0;
320-
} else if (
321-
current_gear_cmd_ptr_->command == GearCommand::REVERSE ||
322-
current_gear_cmd_ptr_->command == GearCommand::REVERSE_2) {
342+
} else if (gear == GearCommand::REVERSE || gear == GearCommand::REVERSE_2) {
323343
acc = -accel;
324344
}
325345

@@ -339,17 +359,6 @@ void SimplePlanningSimulator::set_input(const float steer, const float vel, cons
339359
vehicle_model_ptr_->setInput(input);
340360
}
341361

342-
void SimplePlanningSimulator::on_gear_cmd(const GearCommand::ConstSharedPtr msg)
343-
{
344-
current_gear_cmd_ptr_ = msg;
345-
346-
if (
347-
vehicle_model_type_ == VehicleModelType::IDEAL_STEER_ACC_GEARED ||
348-
vehicle_model_type_ == VehicleModelType::DELAY_STEER_ACC_GEARED) {
349-
vehicle_model_ptr_->setGear(current_gear_cmd_ptr_->command);
350-
}
351-
}
352-
353362
void SimplePlanningSimulator::on_turn_indicators_cmd(
354363
const TurnIndicatorsCommand::ConstSharedPtr msg)
355364
{
@@ -368,7 +377,16 @@ void SimplePlanningSimulator::on_trajectory(const Trajectory::ConstSharedPtr msg
368377

369378
void SimplePlanningSimulator::on_engage(const Engage::ConstSharedPtr msg)
370379
{
371-
current_engage_ = msg->engage;
380+
simulate_motion_ = msg->engage;
381+
}
382+
383+
void SimplePlanningSimulator::on_control_mode_request(
384+
const ControlModeRequest::Request::SharedPtr request,
385+
const ControlModeRequest::Response::SharedPtr response)
386+
{
387+
current_control_mode_ = request->mode;
388+
response->success = true;
389+
return;
372390
}
373391

374392
void SimplePlanningSimulator::add_measurement_noise(
@@ -504,7 +522,7 @@ void SimplePlanningSimulator::publish_control_mode_report()
504522
{
505523
ControlModeReport msg;
506524
msg.stamp = get_clock()->now();
507-
if (current_engage_) {
525+
if (current_control_mode_.data == ControlMode::AUTO) {
508526
msg.mode = ControlModeReport::AUTONOMOUS;
509527
} else {
510528
msg.mode = ControlModeReport::MANUAL;
@@ -514,12 +532,9 @@ void SimplePlanningSimulator::publish_control_mode_report()
514532

515533
void SimplePlanningSimulator::publish_gear_report()
516534
{
517-
if (!current_gear_cmd_ptr_) {
518-
return;
519-
}
520535
GearReport msg;
521536
msg.stamp = get_clock()->now();
522-
msg.report = current_gear_cmd_ptr_->command;
537+
msg.report = vehicle_model_ptr_->getGear();
523538
pub_gear_report_->publish(msg);
524539
}
525540

simulator/simple_planning_simulator/src/simple_planning_simulator/vehicle_model/sim_model_interface.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,4 @@ void SimModelInterface::getInput(Eigen::VectorXd & input) { input = input_; }
3838
void SimModelInterface::setState(const Eigen::VectorXd & state) { state_ = state; }
3939
void SimModelInterface::setInput(const Eigen::VectorXd & input) { input_ = input; }
4040
void SimModelInterface::setGear(const uint8_t gear) { gear_ = gear; }
41+
uint8_t SimModelInterface::getGear() const { return gear_; }

0 commit comments

Comments
 (0)