Win上编写ROS程序遇到的问题---- 无法解析的外部符号 “bool ros::console::g_initialized“

本文讲述了作者在Windows上使用Ubuntu开发的ROS程序遇到的问题,包括依赖的lib文件处理、不同版本Qt的兼容性以及如何解决链接错误关于`g_initialized`的引用,最后提到在QtCreator中设置ROS_BUILD_SHARED_LIBS以顺利编译并调试ROS程序。

通常都是在Ubuntu上编写ROS程序,也能在win上安装ros,利用和Ubuntu一样的方式创建ROS项目,不过在制作绿色版放到别的电脑上运行一直有问题,总是无法实现。

最近有大佬提醒了,ROS安装目录下是有lib文件的,可以自己加入,完全可以在开发后做独立安装包。

今天有空试了一下,确实没问题,不过中间遇到两个小问题,前提 原有项目用catkin_make编译的。

一个是,暂时只能用的是ROS自带的Qt5.10,用我自己安装的其他版本Qt5.15没有成功。后续有时间再试试。

第二个是,出现了一个编译问题,

error LNK2019: 无法解析的外部符号 "bool ros::console::g_initialized" (?g_initialized@console@ros@@3_NA),该符号在函数 "public: virtual class boost::shared_ptr<void const > __cdecl ros::SubscriptionCallbackHelperT<class boost::shared_ptr<struct sensor_msgs::Imu_<class std::allocator<void> > const > const &,void>::deserialize(struct ros::SubscriptionCallbackHelperDeserializeParams const &)" (?deserialize@?$SubscriptionCallbackHelperT@AEBV?$shared_ptr@$$CBU?$Imu_@V?$allocator@X@std@@@sensor_msgs@@@boost@@X@ros@@UEAA?AV?$shared_ptr@$$CBX@boost@@AEBUSubscriptionCallbackHelperDeserializeParams@2@@Z) 中被引用

尝试了添加lib很久也没成功,搜索了一下发现,是ROS调用库的时候默认不是shared,需要在配置上写上,如果用的是Qt的Creator,直接把这句放到pro文件中就可以了。

DEFINES += ROS_BUILD_SHARED_LIBS=1

顺利编译成功,这样在win下本机调试ROS程序也就更容易了。

#ifndef CTRL_FSM_PLANNING_H #define CTRL_FSM_PLANNING_H #include <cmath> #include <string> #include <ros/ros.h> #include <ros/callback_queue.h> #include <std_msgs/Bool.h> #include <std_msgs/Int32.h> #include <sensor_msgs/Imu.h> #include <nav_msgs/Odometry.h> #include <geometry_msgs/PoseArray.h> #include <geometry_msgs/PoseStamped.h> #include <mavros_msgs/State.h> #include <common/visual.hpp> #include <common/trajectory.hpp> #include <common/quat_euler_convert.hpp> #include <ctrl/motion_controller_separate.h> #include <common/traj_anal.hpp> #include <carstatemsgs/Polynome.h> class CtrlFSMPlanningDDR { public: // Constructor CtrlFSMPlanningDDR() = delete; CtrlFSMPlanningDDR(const ros::NodeHandle &nh, const ros::NodeHandle &pnh); CtrlFSMPlanningDDR(const CtrlFSMPlanningDDR &rhs) = delete; CtrlFSMPlanningDDR &operator=(const CtrlFSMPlanningDDR &rhs) = delete; CtrlFSMPlanningDDR(CtrlFSMPlanningDDR &&rhs) = delete; CtrlFSMPlanningDDR &operator=(CtrlFSMPlanningDDR &&rhs) = delete; virtual ~CtrlFSMPlanningDDR() {} private: // State Machine enum FSM_EXEC_STATE { INIT, HOVER, CMD_CTRL, WAIT }; FSM_EXEC_STATE exec_state_; std_msgs::Int32 exec_state_int_; float hover_yaw_; Eigen::Vector2f hover_pos_; bool have_odom_; bool have_traj_; bool new_hover_flag_; bool is_ground_; bool follow_traj_finished_; bool is_armed_; bool emergency_stop_flag_; // ROS NodeHandle ros::NodeHandle nh_; ros::NodeHandle pnh_; // ROS Subscribers ros::Subscriber odom_sub_; ros::Subscriber flight_status_sub_; ros::Subscriber mavros_state_sub_; ros::Subscriber plan_traj_sub_; ros::Subscriber goal_sub_; ros::Subscriber emergency_stop_sub_; // ROS Publishers ros::Publisher attitude_target_pub_; ros::Publisher follow_traj_finished_pub_; ros::Publisher ground_ctrl_fsm_pub_; ros::Publisher allow_plan_traj_pub_; // ROS Timers ros::Timer run_timer_; // ROS Topics std::string odometry_topic_; std::string attitude_target_topic_; std::string flight_status_topic_; std::string follow_traj_finished_topic_; std::string ground_ctrl_fsm_topic_; std::string mavros_state_topic_; std::string plan_traj_topic_; std::string goal_topic_; std::string allow_plan_traj_topic_; std::string emergency_stop_topic_; // Variables common::trajectory::CurEstimate<float> cur_estimate_; // Have been initialized to zero TrajAnal traj_; Trajectory<5, 2> minco_traj_; double traj_duration_; ros::Time start_time_; geometry_msgs::PoseStamped goal_; double goal_received_time_; bool allow_plan_traj_; int traj_id_; // PID Controller Parameters PIDParams position_pid_params_; PIDParams velocity_pid_params_; // Common Parameters CommonParams common_params_; // Thrust Parameters float thrust_return_; bool use_thrust_change_; // Visualizer the trajectory common::visual::TrajectoryVisualizer::Ptr traj_visualizer_; // Motion Controller MotionControllerSeparate::Ptr motion_controller_; // Functions void changeFSMExecState(FSM_EXEC_STATE new_state, string pos_call); void printFSMExecState(); // Callback functions void odomCallback(const nav_msgs::Odometry::ConstPtr &msg_ptr); void flightStatusCallback(const std_msgs::Bool::ConstPtr &msg_ptr); void mavrosStateCallback(const mavros_msgs::State::ConstPtr &msg_ptr); void planTrajCallback(const carstatemsgs::Polynome::ConstPtr &msg_ptr); void goalCallback(const geometry_msgs::PoseStamped::ConstPtr &msg_ptr); void emergencyStopCallback(const std_msgs::Bool::ConstPtr &msg_ptr); void runTimerCallback(const ros::TimerEvent &event); void publishAttitudeTarget(const std::pair<float, float> &desired_attitude, const float &feedforward_pitch_rate, const float &feedforward_yaw_rate); }; #endif // CTRL_FSM_PLANNING_H 注释上述代码
最新发布
09-20
# 动态规划控制状态机类详解 (CtrlFSMPlanningDDR) ## 类概述 `CtrlFSMPlanningDDR` 实现了一个支持动态轨迹重规划的无人机控制状态机,相比前两个版本增加了紧急停止、目标点接收和轨迹分析功能,适用于更复杂的动态环境。 ## 类结构解析 ### 新增功能组件 ```cpp // 新增紧急停止功能 bool emergency_stop_flag_; // 紧急停止标志位 ros::Subscriber emergency_stop_sub_; // 紧急停止指令订阅器 std::string emergency_stop_topic_; // 紧急停止话题名称 // 新增目标点接收功能 ros::Subscriber goal_sub_; // 目标点订阅器 geometry_msgs::PoseStamped goal_; // 当前目标点 double goal_received_time_; // 目标点接收时间戳 std::string goal_topic_; // 目标点话题名称 // 新增轨迹分析工具 TrajAnal traj_; // 轨迹分析器实例 Trajectory<5, 2> minco_traj_; // MINCO轨迹容器(5阶多项式,2维) // 新增规划许可控制 ros::Publisher allow_plan_traj_pub_; // 允许规划指令发布器 std::string allow_plan_traj_topic_; // 规划许可话题名称 bool allow_plan_traj_; // 当前是否允许规划标志 ``` ### 状态机定义 ```cpp private: // 有限状态机状态枚举(扩展了安全逻辑) enum FSM_EXEC_STATE { INIT, // 系统初始化状态 HOVER, // 安全悬停状态 CMD_CTRL, // 轨迹跟踪控制状态 WAIT // 等待指令状态 }; ``` ### 核心成员变量 ```cpp // 安全相关标志 bool emergency_stop_flag_; // 触发急停时设置为true // 轨迹管理 int traj_id_; // 当前轨迹ID(用于验证轨迹连续性) double traj_duration_; // 当前轨迹总时长 // 规划控制 bool allow_plan_traj_; // 规划器使能标志 ``` ### ROS接口扩展 ```cpp // 新增订阅器 ros::Subscriber goal_sub_; // 接收导航目标点 ros::Subscriber emergency_stop_sub_; // 接收急停指令 // 新增发布器 ros::Publisher allow_plan_traj_pub_; // 发布规划许可信号 ``` ## 核心方法说明 ### 新增回调函数 ```cpp /** * @brief 紧急停止回调 * @param msg_ptr 布尔标志消息 * @note 触发后立即切换到HOVER状态 */ void emergencyStopCallback(const std_msgs::Bool::ConstPtr &msg_ptr); /** * @brief 目标点回调 * @param msg_ptr 目标位姿消息 * @note 记录目标点并触发重新规划 */ void goalCallback(const geometry_msgs::PoseStamped::ConstPtr &msg_ptr); /** * @brief 规划轨迹回调(使用carstatemsgs格式) * @param msg_ptr 多项式轨迹消息 * @note 验证轨迹有效性后更新当前轨迹 */ void planTrajCallback(const carstatemsgs::Polynome::ConstPtr &msg_ptr); ``` ### 增强的状态机控制 ```cpp /** * @brief 状态转换执行函数(增强版) * @param new_state 目标状态 * @param pos_call 调用位置标识 * @note 增加急停状态检查和安全恢复逻辑 */ void changeFSMExecState(FSM_EXEC_STATE new_state, string pos_call); ``` ## 设计特点 1. **安全增强机制**- 紧急停止立即中断当前任务 - 状态转换增加安全检查 - 规划许可双重验证 2. **动态重规划支持**- 目标点驱动重新规划 - 轨迹ID验证机制 - 轨迹分析工具集成 3. **模块化扩展**- 兼容多种轨迹消息格式 - 可视化接口标准化 - 控制器可插拔设计 4. **实时性保障**- 时间戳校验机制 - 前馈补偿计算 - 低延迟控制循环
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值