publish local pose topic
This commit is contained in:
parent
c5f2a11066
commit
855cf99c28
|
|
@ -23,7 +23,7 @@ class PathVisualizer : public rclcpp::Node
|
|||
public:
|
||||
PathVisualizer(const std::string& file_name);
|
||||
private:
|
||||
void odom_callback(const geometry_msgs::msg::Pose::SharedPtr msg);
|
||||
void localozation_callback(const geometry_msgs::msg::Pose::SharedPtr msg);
|
||||
void control();
|
||||
double quaternion_to_yaw(double x,
|
||||
double y,
|
||||
|
|
@ -39,24 +39,28 @@ private:
|
|||
int search_nearest_point();
|
||||
int findLookAheadPoint();
|
||||
int findClosestPoint(int forward_index_limit);
|
||||
|
||||
void publishPath();
|
||||
void publishVehiclePose();
|
||||
void publishVehicleTF();
|
||||
void publishHistoryPath();
|
||||
void publishVehicleInfo();
|
||||
// pub rviz info
|
||||
void publishPathRviz();
|
||||
void publishVehiclePoseRviz();
|
||||
void publishVehicleTFRviz();
|
||||
void publishHistoryPathRviz();
|
||||
void publishVehicleInfoRviz();
|
||||
void transformPathToVehicleStart();
|
||||
void densifyPath(double interval);
|
||||
void publishLocalPose();
|
||||
void publishOdomPath();
|
||||
|
||||
private:
|
||||
// 发布cmd_vel
|
||||
// topic pub
|
||||
rclcpp::Publisher<geometry_msgs::msg::Twist>::SharedPtr cmd_pub_;
|
||||
rclcpp::Publisher<geometry_msgs::msg::Pose>::SharedPtr local_pose_pub_;
|
||||
rclcpp::Publisher<nav_msgs::msg::Path>::SharedPtr odom_path_pub_;
|
||||
rclcpp::Publisher<visualization_msgs::msg::Marker>::SharedPtr vehicle_pub_;
|
||||
rclcpp::Publisher<visualization_msgs::msg::Marker>::SharedPtr path_pub_;
|
||||
rclcpp::Publisher<visualization_msgs::msg::Marker>::SharedPtr history_pose_pub_;
|
||||
rclcpp::Publisher<visualization_msgs::msg::Marker>::SharedPtr vehicle_info_pub_;
|
||||
|
||||
// 定位订阅
|
||||
// topic sub
|
||||
rclcpp::Subscription<geometry_msgs::msg::Pose>::SharedPtr odom_sub_;
|
||||
rclcpp::TimerBase::SharedPtr timer_;
|
||||
|
||||
|
|
|
|||
|
|
@ -10,15 +10,18 @@ has_pose_(false)
|
|||
RCLCPP_INFO(this->get_logger(),"PathVisualizer started");
|
||||
// pub
|
||||
cmd_pub_ = this->create_publisher<geometry_msgs::msg::Twist>("/twist_cmd_vel",10);
|
||||
path_pub_ =this->create_publisher<visualization_msgs::msg::Marker>("/planned_path",10);
|
||||
vehicle_pub_ = this->create_publisher<visualization_msgs::msg::Marker>("/vehicle_pose",10);
|
||||
history_pose_pub_ = this->create_publisher<visualization_msgs::msg::Marker>("/history_pose",10);
|
||||
vehicle_info_pub_ = this->create_publisher<visualization_msgs::msg::Marker>("/vehicle_text_info",10);
|
||||
local_pose_pub_ = this->create_publisher<geometry_msgs::msg::Pose>("/local_pose",10);
|
||||
odom_path_pub_ = this->create_publisher<nav_msgs::msg::Path>("/odom_path",10);
|
||||
path_pub_ =this->create_publisher<visualization_msgs::msg::Marker>("/rviz_planning_path",10);
|
||||
vehicle_pub_ = this->create_publisher<visualization_msgs::msg::Marker>("/rviz_vehicle_pose",10);
|
||||
history_pose_pub_ = this->create_publisher<visualization_msgs::msg::Marker>("/rviz_history_traj",10);
|
||||
vehicle_info_pub_ = this->create_publisher<visualization_msgs::msg::Marker>("/rviz_text_info",10);
|
||||
|
||||
// sub
|
||||
RCLCPP_INFO(this->get_logger(),"Start receving rtk pose data");
|
||||
odom_sub_ = this->create_subscription<geometry_msgs::msg::Pose>("/rtk_pose",10,std::bind(
|
||||
&PathVisualizer::odom_callback,this,std::placeholders::_1));
|
||||
&PathVisualizer::localozation_callback,this,std::placeholders::_1));
|
||||
// timer
|
||||
timer_ =this->create_wall_timer(std::chrono::milliseconds(50),std::bind(
|
||||
&PathVisualizer::control,this));
|
||||
// urdf pose
|
||||
|
|
@ -26,6 +29,8 @@ has_pose_(false)
|
|||
// path get
|
||||
downloadPathJson(path_url_,json_data_);
|
||||
loadPathFromJson(json_data_);
|
||||
|
||||
|
||||
}
|
||||
using json = nlohmann::json;
|
||||
static size_t curlWriteCallback(
|
||||
|
|
@ -242,7 +247,7 @@ bool PathVisualizer::loadPathFromJson(
|
|||
}
|
||||
}
|
||||
|
||||
void PathVisualizer::publishVehiclePose()
|
||||
void PathVisualizer::publishVehiclePoseRviz()
|
||||
{
|
||||
visualization_msgs::msg::Marker marker;
|
||||
marker.header.frame_id="odom";
|
||||
|
|
@ -263,12 +268,12 @@ void PathVisualizer::publishVehiclePose()
|
|||
marker.color.a=1.0;
|
||||
marker.color.r=1.0;
|
||||
marker.color.g=1.0;
|
||||
marker.color.b=0.0;
|
||||
marker.color.b=1.0;
|
||||
|
||||
// 位置
|
||||
marker.pose.position.x=x_;
|
||||
marker.pose.position.y=y_;
|
||||
marker.pose.position.z=0.1;
|
||||
marker.pose.position.z=0.4;
|
||||
|
||||
// yaw转四元数
|
||||
double cy = cos(yaw_/2.0);
|
||||
|
|
@ -280,39 +285,39 @@ void PathVisualizer::publishVehiclePose()
|
|||
marker.pose.orientation.w=cy;
|
||||
vehicle_pub_->publish(marker);
|
||||
|
||||
// 2. 车辆矩形框
|
||||
visualization_msgs::msg::Marker body;
|
||||
// 2. vehicle cube
|
||||
// visualization_msgs::msg::Marker body;
|
||||
|
||||
body.header.frame_id = "odom";
|
||||
body.header.stamp = this->now();
|
||||
body.ns = "vehicle";
|
||||
body.id = 1;
|
||||
body.type = visualization_msgs::msg::Marker::CUBE;
|
||||
body.action = visualization_msgs::msg::Marker::ADD;
|
||||
// body.header.frame_id = "odom";
|
||||
// body.header.stamp = this->now();
|
||||
// body.ns = "vehicle";
|
||||
// body.id = 1;
|
||||
// body.type = visualization_msgs::msg::Marker::CUBE;
|
||||
// body.action = visualization_msgs::msg::Marker::ADD;
|
||||
|
||||
// 车辆尺寸
|
||||
body.scale.x = 0.5; // 车长
|
||||
body.scale.y = 0.2; // 车宽
|
||||
body.scale.z = 0.3; // 高度
|
||||
// // 车辆尺寸
|
||||
// body.scale.x = 0.1; // 车长
|
||||
// body.scale.y = 0.1; // 车宽
|
||||
// body.scale.z = 0.3; // 高度
|
||||
|
||||
body.color.a = 0.8;
|
||||
body.color.r = 0.0;
|
||||
body.color.g = 0.0;
|
||||
body.color.b = 1.0;
|
||||
// 位置
|
||||
body.pose.position.x = x_;
|
||||
body.pose.position.y = y_;
|
||||
body.pose.position.z = 0.1;
|
||||
// 姿态
|
||||
body.pose.orientation.x = 0;
|
||||
body.pose.orientation.y = 0;
|
||||
body.pose.orientation.z = sy;
|
||||
body.pose.orientation.w = cy;
|
||||
// body.color.a = 0.8;
|
||||
// body.color.r = 0.0;
|
||||
// body.color.g = 0.0;
|
||||
// body.color.b = 1.0;
|
||||
// // 位置
|
||||
// body.pose.position.x = x_;
|
||||
// body.pose.position.y = y_;
|
||||
// body.pose.position.z = 0.1;
|
||||
// // 姿态
|
||||
// body.pose.orientation.x = 0;
|
||||
// body.pose.orientation.y = 0;
|
||||
// body.pose.orientation.z = sy;
|
||||
// body.pose.orientation.w = cy;
|
||||
|
||||
vehicle_pub_->publish(body);
|
||||
// vehicle_pub_->publish(body);
|
||||
|
||||
}
|
||||
void PathVisualizer::publishVehicleInfo(){
|
||||
void PathVisualizer::publishVehicleInfoRviz(){
|
||||
visualization_msgs::msg::Marker text;
|
||||
|
||||
text.header.stamp = this->get_clock()->now();
|
||||
|
|
@ -333,10 +338,8 @@ void PathVisualizer::publishVehicleInfo(){
|
|||
text.color.a = 0.8;
|
||||
text.color.r = 1.0;
|
||||
text.color.g = 1.0;
|
||||
text.color.b = 0.0;
|
||||
text.scale.z = 0.3;
|
||||
|
||||
text.color.a = 1.0;
|
||||
text.color.b = 1.0;
|
||||
text.scale.z = 0.2;
|
||||
|
||||
text.text =
|
||||
"X: " + std::to_string(x_) + "\n" +
|
||||
|
|
@ -344,7 +347,7 @@ void PathVisualizer::publishVehicleInfo(){
|
|||
"Yaw: " + std::to_string(yaw_);
|
||||
vehicle_info_pub_->publish(text);
|
||||
}
|
||||
void PathVisualizer::publishPath()
|
||||
void PathVisualizer::publishPathRviz()
|
||||
{
|
||||
visualization_msgs::msg::Marker path;
|
||||
path.header.frame_id="odom";
|
||||
|
|
@ -375,7 +378,7 @@ void PathVisualizer::publishPath()
|
|||
path_pub_->publish(path);
|
||||
|
||||
}
|
||||
void PathVisualizer::publishHistoryPath(){
|
||||
void PathVisualizer::publishHistoryPathRviz(){
|
||||
history_x_.push_back(x_);
|
||||
history_y_.push_back(y_);
|
||||
history_yaw_.push_back(yaw_);
|
||||
|
|
@ -407,8 +410,7 @@ void PathVisualizer::publishHistoryPath(){
|
|||
}
|
||||
history_pose_pub_->publish(history_pose);
|
||||
}
|
||||
void PathVisualizer::odom_callback(
|
||||
const geometry_msgs::msg::Pose::SharedPtr msg)
|
||||
void PathVisualizer::localozation_callback(const geometry_msgs::msg::Pose::SharedPtr msg)
|
||||
{
|
||||
double lat =msg->position.x;
|
||||
double lon =msg->position.y;
|
||||
|
|
@ -435,9 +437,9 @@ const geometry_msgs::msg::Pose::SharedPtr msg)
|
|||
msg->orientation.w
|
||||
);
|
||||
has_pose_=true;
|
||||
// 发布 TF
|
||||
publishVehicleTF();
|
||||
publishHistoryPath();
|
||||
// 发布 TF 与 path 可视化
|
||||
publishVehicleTFRviz();
|
||||
publishHistoryPathRviz();
|
||||
if(origin_set_ && !path_transed){
|
||||
transformPathToVehicleStart();
|
||||
path_transed=true;
|
||||
|
|
@ -445,7 +447,8 @@ const geometry_msgs::msg::Pose::SharedPtr msg)
|
|||
this->get_logger(),
|
||||
"Path transformation completed.");
|
||||
densifyPath(0.2);
|
||||
publishPath();
|
||||
publishPathRviz();
|
||||
publishOdomPath();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -454,8 +457,9 @@ void PathVisualizer::control()
|
|||
{
|
||||
if(!has_pose_)
|
||||
return;
|
||||
publishVehiclePose();
|
||||
publishVehicleInfo();
|
||||
publishVehiclePoseRviz();
|
||||
publishVehicleInfoRviz();
|
||||
publishLocalPose();
|
||||
target_index_= findClosestPoint(forward_index_limit_);
|
||||
int target =findLookAheadPoint();
|
||||
|
||||
|
|
@ -541,8 +545,7 @@ void PathVisualizer::control()
|
|||
);
|
||||
}
|
||||
|
||||
double PathVisualizer::normalize_angle(
|
||||
double angle)
|
||||
double PathVisualizer::normalize_angle(double angle)
|
||||
{
|
||||
while(angle>M_PI)
|
||||
angle-=2*M_PI;
|
||||
|
|
@ -583,7 +586,6 @@ int PathVisualizer::findLookAheadPoint()
|
|||
return i;
|
||||
}
|
||||
}
|
||||
|
||||
return path_x_.size()-1;
|
||||
}
|
||||
|
||||
|
|
@ -607,7 +609,22 @@ int PathVisualizer::findClosestPoint(int forward_index_limit)
|
|||
}
|
||||
return index;
|
||||
}
|
||||
void PathVisualizer::publishVehicleTF()
|
||||
void PathVisualizer::publishLocalPose()
|
||||
{
|
||||
geometry_msgs::msg::Pose local_pose;
|
||||
|
||||
local_pose.position.x = x_;
|
||||
local_pose.position.y = y_;
|
||||
|
||||
tf2::Quaternion orientation;
|
||||
orientation.setRPY(0, 0, yaw_);
|
||||
local_pose.orientation.x = orientation.x();
|
||||
local_pose.orientation.y = orientation.y();
|
||||
local_pose.orientation.z = orientation.z();
|
||||
local_pose.orientation.w = orientation.w();
|
||||
local_pose_pub_->publish(local_pose);
|
||||
}
|
||||
void PathVisualizer::publishVehicleTFRviz()
|
||||
{
|
||||
geometry_msgs::msg::TransformStamped transform;
|
||||
|
||||
|
|
@ -744,6 +761,39 @@ void PathVisualizer::densifyPath(double interval)
|
|||
path_y_.push_back(old_y.back());
|
||||
path_yaw_.push_back(old_yaw.back());
|
||||
}
|
||||
void PathVisualizer::publishOdomPath(){
|
||||
nav_msgs::msg::Path path_msg;
|
||||
|
||||
path_msg.header.stamp = this->now();
|
||||
path_msg.header.frame_id = "odom";
|
||||
|
||||
|
||||
path_msg.poses.reserve(path_x_.size());
|
||||
|
||||
for (size_t i = 0; i <path_x_.size(); ++i) {
|
||||
geometry_msgs::msg::PoseStamped pose;
|
||||
|
||||
pose.header.stamp = path_msg.header.stamp;
|
||||
pose.header.frame_id = "odom";
|
||||
|
||||
pose.pose.position.x = path_x_[i];
|
||||
pose.pose.position.y = path_y_[i];
|
||||
pose.pose.position.z = 0.0;
|
||||
|
||||
tf2::Quaternion q;
|
||||
q.setRPY(0.0, 0.0, path_yaw_[i]);
|
||||
|
||||
pose.pose.orientation.x = q.x();
|
||||
pose.pose.orientation.y = q.y();
|
||||
pose.pose.orientation.z = q.z();
|
||||
pose.pose.orientation.w = q.w();
|
||||
|
||||
path_msg.poses.push_back(pose);
|
||||
}
|
||||
|
||||
odom_path_pub_->publish(path_msg);
|
||||
|
||||
}
|
||||
int main(int argc, char *argv[]) {
|
||||
rclcpp::init(argc, argv);
|
||||
std::string file_name;
|
||||
|
|
|
|||
Loading…
Reference in New Issue