typedef std::shared_ptr<Frame> Ptr理解

slam14讲


重点摘出来的一句

typedef std::shared_ptr<Frame> Ptr;//这是关于typedef的用法,定义新类型,在Frame类中不占据内存,只是定义了一个新类型,封装在了类中,便于使用。
//在里程计中,会构建比较多的类,也就有相应的封在类中的类型,在初始化新类的时候调用该类型即可,使用方便
//关于typedef定义了一种新类型的详细理解可参考:https://blog.csdn.net/hai008007/article/details/80651886
class Frame
{
public:
    typedef std::shared_ptr<Frame> Ptr;
    unsigned long                  id_;         // id of this frame
    double                         time_stamp_; // when it is recorded
    SE3                            T_c_w_;      // transform from world to camera
    Camera::Ptr                    camera_;     // Pinhole RGBD Camera model 
    Mat                            color_, depth_; // color and depth image
}

下面是编写的一个测试用例,说明typedef仅仅是在类里面定义了一种新类型,不代表成员变量

指针Ptr指向的test对象的首地址和test对象中的成员变量i的地址是相同的,test类在实例化为test2时不会给typedef定义的新类型分配空间的
此外,指针访问类对象的成员变量是用’->'进行访问的。
测试用例

补充:
在使用std::shared_ptr时编译过程报错,“unique_ptr’ in namespace ‘std’ does not name a template type”
这可能是由于C++编译器的问题,导致shared_ptr存在的位置不同,可以改成如下代码,编译可通过
不太清楚slam14讲中为什么是在std命名空间内

#include <boost/shared_ptr.hpp>
typedef boost::shared_ptr<Frame> Ptr;

另(有混淆的知识点)
函数指针指向函数
数组指针:指向数组的指针
指针数组:指向指针的数组
需要明确优先级顺序:需要明确一个优先级顺序:()>[]>*

(*p)[n]//根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;
 *p[n]//根据优先级,先看[],则p是一个数组,*修饰数组元素,这个数组的元素是指针类型,共n个元素,这是“指针的数组”,即指针数组。

参考:https://blog.csdn.net/mick_hu/article/details/100931034

已知 typedef std::shared_ptr<BevMapInfo> BevMapInfoPtr; struct BevMapInfo { cem::message::common::Header header; int32_t frame_id = 0; uint16_t lanemarkers_num = 0; uint16_t edge_num = 0; bool is_local_pose = false; bool is_on_highway = false; MapType map_type = MapType::UNKOWN_MAP; RoadClass road_class = RoadClass::UNKNOWN; std::vector<BevLaneMarker> lanemarkers = {}; // lane std::vector<BevLaneMarker> edges = {}; std::vector<BevLaneInfo> lane_infos = {}; // lane center std::vector<BevLaneMarker> stop_lines = {}; std::vector<BevLaneMarker> crosswalks = {}; std::vector<BevLaneMarker> arrows = {}; std::vector<BevLaneMarker> junctions = {}; std::vector<BevLaneMarker> diversion_zone = {}; std::vector<CrossPoint> cross_points = {}; BevMapRouteInfo route = {}; cem::message::env_model::EnvInfo env_info; std::string debug_infos = ""; }; struct BevLaneInfo { uint64_t id = 0; uint64_t section_id = 0; uint64_t left_lane_id = 0; uint64_t right_lane_id = 0; uint64_t road_id = 0; uint64_t junction_id = 0; uint32_t left_lane_marker_id = 0; uint32_t right_lane_marker_id = 0; uint32_t number_of_points = 0; uint32_t position = 0; uint32_t connect_score = 0; double length = 0; double speed_limit = 0; // uint: m/s float width = 0.0f; float start_dx = 0; float end_dx = 0; float conf = 0.0f; std::vector<uint64_t> left_lane_boundary_ids = {}; std::vector<uint64_t> right_lane_boundary_ids = {}; std::vector<uint64_t> left_road_boundary_ids = {}; std::vector<uint64_t> right_road_boundary_ids = {}; std::vector<uint64_t> previous_lane_ids = {}; std::vector<uint64_t> next_lane_ids = {}; std::vector<uint64_t> stopline_ids = {}; std::vector<cem::message::common::Point2DF> line_points = {}; std::shared_ptr<std::vector<Eigen::Vector2f>> geos = std::make_shared<std::vector<Eigen::Vector2f>>(); BevLaneDirection direction = BevLaneDirection::DIRECTION_UNKNOWN; BevLaneType lane_type = BevLaneType::LANE_TYPE_UNKNOWN; BevArrowType arrow_type = BevArrowType::ARROW_UNKNOWN; BevTurnType plan_turn_type = BevTurnType::OTHER_UNKNOWN; BevLaneConnectType connect_type = BevLaneConnectType::NORMAL; BevLaneIntersectionType intersection_type = BevLaneIntersectionType::IS_TYPE_INVALID; BevLanePositionToCrossPoint position_to_cross_point = BevLanePositionToCrossPoint::UNKNOWN; SplitTopoExtendType split_topo_extend = SplitTopoExtendType::TOPOLOGY_SPLIT_NONE; MergeTopoExtendType merge_topo_extend = MergeTopoExtendType::TOPOLOGY_MERGE_NONE; MergeInfoExtend merge_info_extend; KDTreeUtil::IndexedGeos indexed_geos{}; bool is_horizontal_lane = false; bool is_blocked = false; bool is_flow_map = false; bool is_virtual = false; bool is_junction_lane = false; bool is_mounted = false; bool is_compensation = false; bool is_bev_topo_connected = false; BevAction navi_action = BevAction::UNKNOWN; BevTrafficLightState trafficlight_state = BevTrafficLightState::TL_COLOR_UNKNOWN; uint32_t traffic_light_num = 0; uint32_t traffic_light_obj_id{0}; uint32_t traffic_light_seq_num{0}; std::vector<uint64_t> traffic_stop_lines = {}; std::vector<uint64_t> traffic_crosswalks = {}; uint32_t stay_prev_counter{0}; byd::msg::orin::routing_map::LaneInfo::TrafficSetReason traffic_set_reason{byd::msg::orin::routing_map::LaneInfo::UNKNOWN_STATE}; bool is_default_arrow = false; bool operator<(const BevLaneInfo& other) const { if (id != other.id) { return id < other.id; } } }; enum class BevLaneType { LANE_TYPE_UNKNOWN = 0, LANE_TYPE_MAIN = 1, LANE_TYPE_SIDE = 2, LANE_TYPE_EMERGENCY = 3, LANE_TYPE_OTHER = 4, LANE_TYPE_BLOCKED = 5, LANE_TYPE_EMERGENCY_STOP = 6, LANE_TYPE_VIRTUAL_JUNCTION = 7, LANE_TYPE_HARBOR_STOP = 8 }; const std::vector<uint64_t> road_selected; std::vector<uint64_t> filtered_lanes_without_harbor; 现在要实现一个功能,在road_selected和filtered_lanes_without_harbor之间对比,找到road_selected比filtered_lanes_without_harbor多出来的元素,即找到被过滤的harbor的id,然后在GlobalBevMapOutPut中将该id的车道类型赋值为LANE_TYPE_HARBOR_STOP 。C++实现。
最新发布
07-31
class connection_metadata_no_tls { public: typedef websocketpp::lib::shared_ptr<connection_metadata_no_tls> ptr; connection_metadata_no_tls(websocketpp::connection_hdl hdl, std::string uri) : m_hdl(hdl) , m_status("Connecting") , m_uri(uri) , m_server("N/A") {} void on_open(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Open"; status_new = true; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); m_server = con->get_response_header("Server"); qDebug()<<"on_open hdl"<<hdl._empty(); websocketpp::lib::error_code ec; client->ping(hdl,"heartbeat",ec); } // if connection failed, the function will be invoke. void on_fail(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Failed"; status_new = false; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); m_server = con->get_response_header("Server"); m_error_reason = con->get_ec().message(); QDEBUG<<"Err"<<QString::fromStdString(m_error_reason); } void on_close(client_no_tls *client, websocketpp::connection_hdl hdl) { m_status = "Closed"; status_new = false; client_no_tls::connection_ptr con = client->get_con_from_hdl(hdl); std::stringstream s; s << "close code: " << con->get_remote_close_code() << " (" << websocketpp::close::status::get_string(con->get_remote_close_code()) << "), close reason: " << con->get_remote_close_reason(); m_error_reason = s.str(); QDEBUG<<"Close Net"<<QString::fromStdString(m_error_reason); } void on_message(websocketpp::connection_hdl, client_no_tls::message_ptr msg) { if (msg->get_opcode() == websocketpp::frame::opcode::text) { m_messages.push_back(msg->get_payload()); // m_textMessage.append(QString::fromStdString(msg->get_payload()));//Utf8toAscii // m_textMessage = QString::fromUtf8(msg->get_payload()); // QDEBUG<<"得到了数据1"<<m_textMessage; m_binaryMessage.clear(); m_binaryMessage.append(QString::fromStdString(msg->get_payload())); QString string; string.append(m_binaryMessage);// QByteArray转QString方法2 QDEBUG<<"Get Server Message:"<<string; for(int i = 0 ; i < 20 ; i++) { if(messageback[i].is_used == 0 ) { memset(messageback[i].data,0,sizeof(messageback[i].data)); memcpy(messageback[i].data,m_binaryMessage,m_binaryMessage.length()); messageback[i].len = m_binaryMessage.length(); messageback[i].is_used =1 ; break; } } } else { m_messages.push_back(websocketpp::utility::to_hex(msg->get_payload())); // QDEBUG<<"得到了数据2"; } } websocketpp::connection_hdl get_hdl() const { return m_hdl; } std::string get_status() const { return m_status; } std::string get_uri() const { return m_uri; } void record_sent_message(std::string message) { m_messages.push_back(">> " + message); } friend std::ostream & operator<< (std::ostream & out, connection_metadata_no_tls const & data); private: websocketpp::connection_hdl m_hdl; std::string m_status; std::string m_uri; std::string m_server; std::string m_error_reason; std::vector<std::string> m_messages; }; 如何在此段代码中实现定时推送ping功能并支持设置时间间隔
07-04
#ifndef _PLANNING_VISUALIZATION_H_ #define _PLANNING_VISUALIZATION_H_ #include <Eigen/Eigen> #include <algorithm> //#include <bspline_opt/uniform_bspline.h> #include <iostream> //#include <bspline_opt/polynomial_traj.h> #include <ros/ros.h> #include <vector> #include <visualization_msgs/Marker.h> #include <visualization_msgs/MarkerArray.h> #include <stdlib.h> using std::vector; namespace ego_planner { class PlanningVisualization { private: ros::NodeHandle node; ros::Publisher goal_point_pub; ros::Publisher global_list_pub; ros::Publisher init_list_pub; ros::Publisher optimal_list_pub; ros::Publisher a_star_list_pub; ros::Publisher guide_vector_pub; ros::Publisher intermediate_state_pub; public: PlanningVisualization(/* args */) {} ~PlanningVisualization() {} PlanningVisualization(ros::NodeHandle &nh); typedef std::shared_ptr<PlanningVisualization> Ptr; void displayMarkerList(ros::Publisher &pub, const vector<Eigen::Vector3d> &list, double scale, Eigen::Vector4d color, int id, bool show_sphere = true); void generatePathDisplayArray(visualization_msgs::MarkerArray &array, const vector<Eigen::Vector3d> &list, double scale, Eigen::Vector4d color, int id); void generateArrowDisplayArray(visualization_msgs::MarkerArray &array, const vector<Eigen::Vector3d> &list, double scale, Eigen::Vector4d color, int id); void displayGoalPoint(Eigen::Vector3d goal_point, Eigen::Vector4d color, const double scale, int id); void displayGlobalPathList(vector<Eigen::Vector3d> global_pts, const double scale, int id); void displayInitPathList(vector<Eigen::Vector3d> init_pts, const double scale, int id); void displayMultiInitPathList(vector<vector<Eigen::Vector3d>> init_trajs, const double scale); void displayOptimalList(Eigen::MatrixXd optimal_pts, int id); void displayAStarList(std::vector<std::vector<Eigen::Vector3d>> a_star_paths, int id); void displayArrowList(ros::Publisher &pub, const vector<Eigen::Vector3d> &list, double scale, Eigen::Vector4d color, int id); // void displayIntermediateState(ros::Publisher& intermediate_pub, ego_planner::BsplineOptimizer::Ptr optimizer, double sleep_time, const int start_iteration); // void displayNewArrow(ros::Publisher& guide_vector_pub, ego_planner::BsplineOptimizer::Ptr optimizer); }; } // namespace ego_planner #endif
06-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值