鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    使用imu_utils标定,拥有了db3文件了,使用ros2 launch启动编译好的imu_an节点报错,启动不了

    已定时 已固定 已锁定 已移动 未解决
    综合问题
    imuutils,ros2 ros2 humble
    3
    24
    890
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 小伊小
      机器人小伊
      最后由 编辑

      从你提供的错误信息和启动文件(A3_launch.py)来看,问题可能出在几个方面。首先,我们逐一排查可能的问题:

      1. ROS 2 节点上下文无效:
        错误信息 could not create subscription: rcl node's context is invalid, at ./src/rcl/node.c:428 通常表明 ROS 2 节点在尝试创建订阅或发布时遇到了问题,这可能是由于节点没有正确初始化或上下文(context)在节点尝试使用之前就已经被销毁或无效。

      2. 参数加载失败:
        错误 Failed to load imu_topic, Failed to load imu_name 等表明节点没有正确接收到启动文件中声明的参数。这可能是由于参数传递或节点内部处理参数的方式有误。

      解决步骤

      1. 检查 ROS 2 节点实现

      确保 imu_an 节点正确实现了参数读取逻辑。节点应该使用 ROS 2 的参数服务(如 rclcpp::Node::get_parameter)来读取这些参数。例如:

      auto imu_topic = this->get_parameter("imu_topic").as_string();
      auto imu_name = this->get_parameter("imu_name").as_string();
      // ... 其他参数
      

      2. 检查启动文件

      你的启动文件看起来是正确的,但确保 imu_an 节点确实能够处理通过 --params-file 传递的参数文件。如果节点没有实现从参数文件读取参数的功能,你可能需要修改节点以支持这一点,或者改用命令行参数传递。

      3. 检查 ROS 2 环境

      确保你的 ROS 2 环境设置正确,所有依赖都已正确安装和编译。

      4. 使用命令行参数直接启动

      尝试不使用 --params-file,而是直接在命令行中指定参数来启动节点,看是否能成功:

      ros2 run imu_utils imu_an --ros-args --imu_topic /djiros/imu --imu_name A3 --data_save_path /path/to/data --max_time_min 120 --max_cluster 100
      

      注意,你可能需要调整 --ros-args 的使用方式,因为 ROS 2 的命令行参数解析可能与你的节点实现不完全兼容。

      5. 查看日志和调试

      使用 ROS 2 的日志系统来查看更详细的错误信息。你可以增加日志的详细级别来获取更多信息:

      export RCLCPP_LOGGING_CONFIG_FILE=/path/to/your/logging_config.yaml
      ros2 launch imu_utils A3_launch.py
      

      确保 logging_config.yaml 文件配置为显示足够的详细级别。

      6. 检查依赖和库

      确保所有必要的库都已正确安装,并且与你的 ROS 2 版本兼容。

      通过这些步骤,你应该能够更接近问题的根源,并找到解决问题的方法。如果问题仍然存在,可能需要更深入地检查节点的代码实现或寻求社区的帮助。


      以上为生成回答,仅供参考~

      我是小伊,已接入ChatGpt,所有回复,仅供参考~

      Y 1 条回复 最后回复 回复 引用 0
      • Y
        yuan @小伊
        最后由 编辑

        @小伊 我是看了这一篇文章链接文本,然后生成了a.out文件,但是执行之后并没有出现节点

        1 条回复 最后回复 回复 引用 0
        • 小伊小
          机器人小伊
          最后由 编辑

          当你提到生成了一个名为 a.out 的文件,这通常意味着你使用了 C 或 C++ 编译器(如 GCC 或 Clang)来编译你的源代码文件。如果执行 a.out 后没有出现你预期的节点(这里假设是指某种数据结构、图形界面中的节点、或者任何形式的可视化输出),可能是由以下几个原因造成的:

          1. 代码逻辑问题:

            • 首先检查你的源代码,确保你的程序逻辑正确无误,特别是与创建和显示节点相关的部分。
            • 确保你确实在代码中添加了创建节点的逻辑,并且这些节点在某种形式下被正确地显示或输出。
          2. 编译问题:

            • 确保没有编译错误或警告。有时候,警告信息也能指出潜在的问题。
            • 如果你是在某个特定的IDE中工作,确保IDE配置正确,没有错误地忽略了你的源文件或头文件。
          3. 运行环境:

            • 检查你的运行环境是否支持你的程序。例如,如果你的程序依赖于图形库(如 OpenGL、SDL 等),确保这些库已经正确安装并配置在你的系统上。
            • 如果你的程序依赖于外部数据或配置文件,确保这些文件存在于正确的位置,并且程序能够正确地访问它们。
          4. 调试:

            • 使用调试工具(如 GDB)来运行你的程序,并观察它在执行过程中的行为。检查关键变量和函数调用的返回值,看看是否有异常或不符合预期的行为。
            • 在关键位置添加打印语句(如 printf 或 std::cout),以查看程序的实际执行流程和变量的值。
          5. 输入输出:

            • 如果你的程序应该输出到控制台或文件,但没有任何输出,检查你的输出逻辑。确保你使用了正确的输出函数(如 printf、std::cout、文件写入等),并且输出目的地(控制台或文件)是可用的。
            • 如果你的程序应该创建图形界面中的节点,但图形界面没有显示,检查你的图形界面库是否已正确初始化和配置。
          6. 权限问题:

            • 如果你的程序试图写入文件或访问系统资源,确保你的用户账户有足够的权限。
          7. 依赖问题:

            • 如果你的程序依赖于其他库或模块,确保这些依赖已经正确安装,并且你的程序能够找到它们。

          如果以上步骤都无法解决你的问题,你可能需要更详细地检查你的源代码或寻求其他开发者的帮助。在提问时,提供足够的代码片段和错误信息将有助于他人更快地诊断问题。


          以上为生成回答,仅供参考~

          我是小伊,已接入ChatGpt,所有回复,仅供参考~

          1 条回复 最后回复 回复 引用 0
          • 小鱼小
            小鱼 技术大佬 @yuan
            最后由 编辑

            @yuan 在 使用imu_utils标定,拥有了db3文件了,使用ros2 launch启动编译好的imu_an节点报错,启动不了 中说:

            [imu_an-1] [INFO] [1722931605.611123480] [imu_an]: Waiting for IMU data...
            [imu_an-1] [ERROR] [1722931605.611210670] [imu_an]: Failed to load imu_topic
            [imu_an-1] [ERROR] [1722931605.612426206] [imu_an]: Failed to load imu_name
            [imu_an-1] [ERROR] [1722931605.612452157] [imu_an]: Failed to load data_save_path
            [imu_an-1] [ERROR] [1722931605.612457508] [imu_an]: Failed to load max_time_min
            [imu_an-1] [ERROR] [1722931605.612460949] [imu_an]: Failed to load max_cluster
            [imu_an-1] terminate called after throwing an instance of 'rclcpp::exceptions::RCLError'
            [imu_an-1] what(): could not create subscription: rcl node's context is invalid, at ./src/rcl/node.c:428

            看起来像是参数没有传递到代码里,代码是怎么写的,贴一下,另外检查下launch写的对不对

            新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

            Y 2 条回复 最后回复 回复 引用 0
            • Y
              yuan @小鱼
              最后由 编辑

              @小鱼
              代码是这样的

              ain( int argc, char** argv )
              {
                  rclcpp::init( argc, argv);
                  //rclcpp::Node n( "~" );
                  auto node = std::make_shared<rclcpp::Node>("n");
                  //rclcpp::Logger( ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Debug );
                  RCLCPP_INFO(node->get_logger(), "Waiting for IMU data...");
                  std::string IMU_TOPIC;
                  std::string IMU_NAME;
                  int max_cluster;
              
                  IMU_TOPIC      = ros_utils::readParam<std::string>(*node, "imu_topic");
                  IMU_NAME       = ros_utils::readParam<std::string>(*node, "imu_name");
                  data_save_path = ros_utils::readParam<std::string>(*node, "data_save_path");
                  max_time_min   = ros_utils::readParam<int>(*node, "max_time_min");
                  max_cluster    = ros_utils::readParam<int>(*node, "max_cluster");
              
                  // rclcpp::Subscription sub_imu = n->create_subscription( IMU_TOPIC, //
                  //                                        20000000,
                  //                                        imu_callback,
                  //                                        ros::TransportHints( ).tcpNoDelay( ) );
                  //    rclcpp::Publisher pub = n.advertise< geometry_msgs::Vector3Stamped >( ALLAN_TOPIC,
                  //    2000 );
                  auto sub_imu = node->create_subscription<sensor_msgs::msg::Imu>(
                  IMU_TOPIC, 10, imu_callback);
              
              
                  auto gyr_x = std::make_shared<imu::AllanGyr>("gyr x", max_cluster);
                  auto gyr_y = std::make_shared<imu::AllanGyr>("gyr y", max_cluster);
                  auto gyr_z = std::make_shared<imu::AllanGyr>("gyr z", max_cluster);
                  auto acc_x = std::make_shared<imu::AllanAcc>("acc x", max_cluster);
                  auto acc_y = std::make_shared<imu::AllanAcc>("acc y", max_cluster);
                  auto acc_z = std::make_shared<imu::AllanAcc>("acc z", max_cluster);
                  std::cout << "wait for imu data." << std::endl;
                  rclcpp::WallRate loop( 100 );
              
                  //    ros::spin( );
                  while ( !end )
                  {
                      loop.sleep( );
                      rclcpp::spin_some(node);
                      //rclcpp::spin(n);
              
                  }
              
                  ///
                  gyr_x->calc( );
                  std::vector< double > gyro_v_x  = gyr_x->getVariance( );
                  std::vector< double > gyro_d_x  = gyr_x->getDeviation( );
                  std::vector< double > gyro_ts_x = gyr_x->getTimes( );
              
                  gyr_y->calc( );
              

              然后就是我运行ros2 run imu_utils imu_an也报错,看起来像是没有imu_an这个节点,我是看了你那个教程也是多了一个a.out文件

              小鱼小 2 条回复 最后回复 回复 引用 0
              • Y
                yuan @小鱼
                最后由 编辑

                @小鱼
                报错是这样的

                ysh@ysh:~/ros2_ws$ ros2 run imu_utils imu_an 
                [INFO] [1722935421.840191342] [n]: Waiting for IMU data...
                [ERROR] [1722935421.840539049] [n]: Failed to load imu_topic
                [ERROR] [1722935421.841680445] [n]: Failed to load imu_name
                [ERROR] [1722935421.841792184] [n]: Failed to load data_save_path
                [ERROR] [1722935421.841890937] [n]: Failed to load max_time_min
                [ERROR] [1722935421.841986597] [n]: Failed to load max_cluster
                terminate called after throwing an instance of 'rclcpp::exceptions::RCLError'
                  what():  could not create subscription: rcl node's context is invalid, at ./src/rcl/node.c:428
                
                
                小鱼小 2 条回复 最后回复 回复 引用 0
                • 小鱼小
                  小鱼 技术大佬 @yuan
                  最后由 编辑

                  @yuan 在 使用imu_utils标定,拥有了db3文件了,使用ros2 launch启动编译好的imu_an节点报错,启动不了 中说:

                  IMU_TOPIC = ros_utils::readParamstd::string(*node, "imu_topic");
                  IMU_NAME = ros_utils::readParamstd::string(*node, "imu_name");
                  data_save_path = ros_utils::readParamstd::string(*node, "data_save_path");
                  max_time_min = ros_utils::readParam<int>(*node, "max_time_min");
                  max_cluster = ros_utils::readParam<int>(*node, "max_cluster");

                  应该是这里报错,都没获取到参数

                  新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                  1 条回复 最后回复 回复 引用 0
                  • 小鱼小
                    小鱼 技术大佬 @yuan
                    最后由 编辑

                    @yuan 在 使用imu_utils标定,拥有了db3文件了,使用ros2 launch启动编译好的imu_an节点报错,启动不了 中说:

                    terminate called after throwing an instance of 'rclcpp::exceptions::RCLError'
                    what(): could not create subscription: rcl node's context is invalid, at ./src/rcl/node.c:428

                    不过看这个错误是没有 rclcpp_init()

                    新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                    1 条回复 最后回复 回复 引用 0
                    • 小鱼小
                      小鱼 技术大佬 @yuan
                      最后由 编辑

                      @yuan 用gdb,debug下,看看挂在了哪一行

                      新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                      Y 3 条回复 最后回复 回复 引用 0
                      • Y
                        yuan @小鱼
                        最后由 编辑

                        此回复已被删除!
                        1 条回复 最后回复 回复 引用 0
                        • Y
                          yuan @小鱼
                          最后由 编辑

                          此回复已被删除!
                          1 条回复 最后回复 回复 引用 0
                          • Y
                            yuan @小鱼
                            最后由 编辑

                            @小鱼 ```
                            Starting program: /home/ysh/ros2_ws/install/imu_utils/lib/imu_utils/imu_an --ros-args --params-file /home/ysh/ros2_ws/src/param.yaml
                            [Thread debugging using libthread_db enabled]
                            Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
                            [New Thread 0x7ffff4dff640 (LWP 126145)]
                            [New Thread 0x7ffff45fe640 (LWP 126146)]
                            [New Thread 0x7ffff3dfd640 (LWP 126147)]
                            [New Thread 0x7ffff35fc640 (LWP 126148)]
                            [New Thread 0x7ffff2dfb640 (LWP 126149)]
                            [New Thread 0x7ffff25fa640 (LWP 126150)]
                            [New Thread 0x7ffff1df9640 (LWP 126151)]
                            [New Thread 0x7ffff15f8640 (LWP 126152)]
                            [New Thread 0x7ffff0df7640 (LWP 126153)]
                            [INFO] [1722937129.258907543] [n]: Waiting for IMU data...
                            [ERROR] [1722937129.259067701] [n]: Failed to load imu_topic
                            [ERROR] [1722937129.259904065] [n]: Failed to load imu_name
                            [ERROR] [1722937129.259961287] [n]: Failed to load data_save_path
                            [ERROR] [1722937129.260008229] [n]: Failed to load max_time_min
                            [ERROR] [1722937129.260054711] [n]: Failed to load max_cluster
                            terminate called after throwing an instance of 'rclcpp::exceptions::RCLError'
                            what(): could not create subscription: rcl node's context is invalid, at ./src/rcl/node.c:428
                            [Thread 0x7ffff4dff640 (LWP 126145) exited]

                            Thread 1 "imu_an" received signal SIGABRT, Aborted.
                            __pthread_kill_implementation (no_tid=0, signo=6, threadid=140737322031168) at ./nptl/pthread_kill.c:44
                            44 ./nptl/pthread_kill.c: 没有那个文件或目录.

                            1 条回复 最后回复 回复 引用 0
                            • 小鱼小
                              小鱼 技术大佬 @yuan
                              最后由 编辑

                              @yuan 在 使用imu_utils标定,拥有了db3文件了,使用ros2 launch启动编译好的imu_an节点报错,启动不了 中说:

                              ros_utils::readParamstd::string

                              这个函数怎么写的

                              新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                              Y 2 条回复 最后回复 回复 引用 0
                              • Y
                                yuan @小鱼
                                最后由 编辑

                                此回复已被删除!
                                1 条回复 最后回复 回复 引用 0
                                • Y
                                  yuan @小鱼
                                  最后由 编辑

                                  @小鱼

                                  template< typename T >
                                  T
                                  readParam( rclcpp::Node& n, std::string name )
                                  {
                                      T ans;
                                      if ( n.get_parameter( name, ans ) )
                                      {
                                          RCLCPP_INFO_STREAM(n.get_logger(), "Loaded " << name << ": " << ans );
                                      }
                                      else
                                      {
                                          RCLCPP_ERROR_STREAM(n.get_logger(), "Failed to load " << name );
                                          rclcpp::shutdown();
                                      }
                                      return ans;
                                  }
                                  
                                  
                                  小鱼小 2 条回复 最后回复 回复 引用 0
                                  • 小鱼小
                                    小鱼 技术大佬 @yuan
                                    最后由 编辑

                                    @yuan 在 使用imu_utils标定,拥有了db3文件了,使用ros2 launch启动编译好的imu_an节点报错,启动不了 中说:

                                    rclcpp::shutdown();

                                    这里这里,你给shutdown() 干啥!!!!!

                                    删掉!!!!!

                                    新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                                    Y 2 条回复 最后回复 回复 引用 0
                                    • Y
                                      yuan @小鱼
                                      最后由 编辑

                                      @小鱼 没有呀,现在是这个样子的

                                      int
                                      main( int argc, char** argv )
                                      {
                                          rclcpp::init( argc, argv);
                                          //rclcpp::Node n( "~" );
                                          auto node = std::make_shared<rclcpp::Node>("n");
                                          //rclcpp::Logger( ROSCONSOLE_DEFAULT_NAME, ros::console::levels::Debug );
                                          RCLCPP_INFO(node->get_logger(), "Waiting for IMU data...");
                                          std::string IMU_TOPIC;
                                          std::string IMU_NAME;
                                          int max_cluster;
                                      
                                      
                                          IMU_TOPIC      = ros_utils::readParam<std::string>(*node, "imu_topic");
                                          IMU_NAME       = ros_utils::readParam<std::string>(*node, "imu_name");
                                          data_save_path = ros_utils::readParam<std::string>(*node, "data_save_path");
                                          max_time_min   = ros_utils::readParam<int>(*node, "max_time_min");
                                          max_cluster    = ros_utils::readParam<int>(*node, "max_cluster");
                                      
                                          // rclcpp::Subscription sub_imu = n->create_subscription( IMU_TOPIC, //
                                          //                                        20000000,
                                          //                                        imu_callback,
                                          //                                        ros::TransportHints( ).tcpNoDelay( ) );
                                          //    rclcpp::Publisher pub = n.advertise< geometry_msgs::Vector3Stamped >( ALLAN_TOPIC,
                                          //    2000 );
                                          auto sub_imu = node->create_subscription<sensor_msgs::msg::Imu>(
                                          IMU_TOPIC, 10, imu_callback);
                                      
                                      
                                          auto gyr_x = std::make_shared<imu::AllanGyr>("gyr x", max_cluster);
                                          auto gyr_y = std::make_shared<imu::AllanGyr>("gyr y", max_cluster);
                                          auto gyr_z = std::make_shared<imu::AllanGyr>("gyr z", max_cluster);
                                          auto acc_x = std::make_shared<imu::AllanAcc>("acc x", max_cluster);
                                          auto acc_y = std::make_shared<imu::AllanAcc>("acc y", max_cluster);
                                          auto acc_z = std::make_shared<imu::AllanAcc>("acc z", max_cluster);
                                          std::cout << "wait for imu data." << std::endl;
                                          rclcpp::WallRate loop( 100 );
                                      
                                          //    ros::spin( );
                                          while ( !end )
                                          {
                                              loop.sleep( );
                                              rclcpp::spin_some(node);
                                              //rclcpp::spin(n);
                                      
                                          }
                                      
                                      Y 1 条回复 最后回复 回复 引用 0
                                      • Y
                                        yuan @yuan
                                        最后由 编辑

                                        @yuan
                                        你的意思是read文件里面吗

                                        1 条回复 最后回复 回复 引用 0
                                        • Y
                                          yuan @小鱼
                                          最后由 编辑

                                          @小鱼
                                          删掉重新编译还是一样的鱼哥

                                          ysh@ysh:~/ros2_ws$ ros2 run imu_utils imu_an
                                          [INFO] [1723018093.544028406] [n]: Waiting for IMU data...
                                          [ERROR] [1723018093.544215273] [n]: Failed to load imu_topic
                                          [ERROR] [1723018093.544802558] [n]: Failed to load imu_name
                                          [ERROR] [1723018093.544864169] [n]: Failed to load data_save_path
                                          [ERROR] [1723018093.544946202] [n]: Failed to load max_time_min
                                          [ERROR] [1723018093.544995910] [n]: Failed to load max_cluster
                                          terminate called after throwing an instance of 'rclcpp::exceptions::RCLError'
                                            what():  could not create subscription: rcl node's context is invalid, at ./src/rcl/node.c:428
                                          [ros2run]: Aborted
                                          
                                          
                                          1 条回复 最后回复 回复 引用 0
                                          • 小鱼小
                                            小鱼 技术大佬 @yuan
                                            最后由 编辑

                                            @yuan 在 使用imu_utils标定,拥有了db3文件了,使用ros2 launch启动编译好的imu_an节点报错,启动不了 中说:

                                              RCLCPP_ERROR_STREAM(n.get_logger(), "Failed to load " << name );
                                                rclcpp::shutdown();
                                            

                                            这里,兄弟,你获取失败为什么要shutdown,就算不执行了,你也要直接抛出异常推出

                                            新书配套视频:https://www.bilibili.com/video/BV1GW42197Ck/

                                            Y 1 条回复 最后回复 回复 引用 0
                                            • 第一个帖子
                                              最后一个帖子
                                            皖ICP备16016415号-7
                                            Powered by NodeBB | 鱼香ROS