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

    根据小鱼的教程来的,但是自己编写的时候使用RCLCPP_INFO打印name.c_str()报错

    已定时 已固定 已锁定 已移动
    ROS 2相关问题
    ros2 colcon报错
    3
    7
    592
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 8
      等待修复
      最后由 编辑

      想写一个节点接受imu数据,功能没问题能接收到,但是这一句
      RCLCPP_INFO(this->get_logger(), "hello,im node %s , get imu data %d.", name.c_str(), msg->header.stamp.sec);
      只要加上name.c_str(),colcon build就会报错,删掉就没事,虽然不影响功能,但是我之前学小鱼ROS的教程,在例子里面都是正常不错的,报错信息如下:error: ‘name’ was not declared in this scope; did you mean ‘rosidl_generator_traits::name’?
      edfe504d-f070-4335-b40b-3f9540a6284f-image.png

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

        从您提供的错误信息和代码片段来看,问题出在 name 变量没有在当前作用域内声明。RCLCPP_INFO 宏是用于在ROS 2节点中记录日志信息的,并且它期望你提供一个有效的字符串来替换格式化字符串中的 %s。

        假设您正在尝试打印节点的名称,并且您遵循了ROS 2节点创建的标准模式,您通常会使用类的成员变量(例如 node_name_)来存储节点的名称。但是,在您的代码中,您使用了 name 这个变量,而它可能并没有在您尝试打印它的地方被定义。

        以下是一个标准的ROS 2节点的示例,展示了如何声明和使用节点名称:

        #include <rclcpp/rclcpp.hpp>
        
        class MyImuNode : public rclcpp::Node {
        public:
            MyImuNode(const std::string &node_name) : Node(node_name) {
                // ... 初始化代码 ...
        
                // 假设这里有一个回调函数来处理IMU数据
                // 在回调函数中,您可以使用成员变量 node_name_ 来记录日志
                void imu_callback(const sensor_msgs::msg::Imu::SharedPtr msg) {
                    RCLCPP_INFO(this->get_logger(), "hello, imu node %s, get imu data %d.", 
                                this->get_name().c_str(), msg->header.stamp.sec);
                    // 注意:这里使用了 this->get_name().c_str() 来获取节点名称
                }
        
                // ... 其他代码 ...
            };
        
        private:
            // ... 类的私有成员变量和方法 ...
        };
        
        int main(int argc, char **argv) {
            rclcpp::init(argc, argv);
            auto node = std::make_shared<MyImuNode>("my_imu_node");
            // ... 运行节点 ...
            rclcpp::spin(node);
            rclcpp::shutdown();
            return 0;
        }
        

        在上面的示例中,MyImuNode 类继承自 rclcpp::Node,并且在构造函数中通过 Node(node_name) 初始化了节点名称。在 imu_callback 方法中,我使用了 this->get_name().c_str() 来获取节点名称的C字符串表示,并将其传递给 RCLCPP_INFO 宏。

        请注意,在您的代码中,您应该使用类似的成员变量或方法来获取节点名称,而不是直接使用未声明的 name 变量。如果 name 应该是节点的名称,那么您应该使用 this->get_name().c_str() 来代替 name.c_str()。


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

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

        8 1 条回复 最后回复 回复 引用 0
        • 8
          等待修复 @小伊
          最后由 编辑

          @小伊 还是一样的报错,这是我的全部代码。
          #include "rclcpp/rclcpp.hpp"
          #include <string>
          #include <iostream>
          #include "sensor_msgs/msg/imu.hpp"
          #include "std_msgs/msg/int32.hpp"
          #include <iostream>
          #include <chrono>
          #include <unistd.h>

          class get_imu : public rclcpp::Node
          {
          public:
          get_imu(std::string name):Node(name)
          {
          RCLCPP_INFO(this->get_logger(), "hello,im node %s, trying to get imu data.", this->get_name().c_str());
          imu_subscribe_ = this->create_subscription<sensor_msgs::msg::Imu>("imu", rclcpp::SensorDataQoS(), std::bind(&get_imu::imu_callback, this, std::placeholders::_1));
          }

          private:
          rclcpp::Subscription<sensor_msgs::msg::Imu>::SharedPtr imu_subscribe_;
          void imu_callback(const sensor_msgs::msg::Imu::SharedPtr msg)
          {
          //std_msgs::msg::Int32 sec = 0;
          //sec = msg->header.stamp.sec;
          RCLCPP_INFO(this->get_logger(), "hello,im node %s , get imu data %d.", this->get_name().c_str(), msg->header.stamp.nanosec);
          }
          };

          int main(int argc, char argv)
          {
          rclcpp::init(argc, argv);
          /创建对应节点的共享指针对象/
          auto node = std::make_shared<get_imu>("get_imu");
          /
          运行节点,并检测退出信号
          /
          rclcpp::spin(node);
          rclcpp::shutdown();
          return 0;
          }

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

            您提供的代码中存在几个语法错误和潜在的问题,我将一一指出并提供修正后的代码。

            1. HTML实体问题:在您的代码中,您使用了&lt;和&gt;来表示<和>。在C++中,您应该直接使用<和>。
            2. 包含头文件:您包含了两次<iostream>,这是不必要的。
            3. main函数参数:main函数的参数应为char *argv[]而不是char argv。
            4. std::placeholders::_1的使用:在C++11及以后的版本中,为了与std::bind一起使用,您需要包含<functional>头文件。
            5. 变量命名:尽管这不是一个错误,但最好使用std::shared_ptr而不是::SharedPtr作为类型别名,以保持代码清晰。

            以下是修正后的代码:

            #include "rclcpp/rclcpp.hpp"
            #include <string>
            #include <iostream>
            #include <chrono>
            #include <unistd.h>
            #include "sensor_msgs/msg/imu.hpp"
            #include <functional>  // For std::placeholders
            
            class get_imu : public rclcpp::Node
            {
            public:
                get_imu(std::string name) : Node(name)
                {
                    RCLCPP_INFO(this->get_logger(), "hello, I'm node %s, trying to get imu data.", this->get_name().c_str());
                    imu_subscribe_ = this->create_subscription<sensor_msgs::msg::Imu>(
                        "imu", rclcpp::SensorDataQoS(),
                        std::bind(&get_imu::imu_callback, this, std::placeholders::_1));
                }
            
            private:
                rclcpp::Subscription<sensor_msgs::msg::Imu>::SharedPtr imu_subscribe_;
            
                void imu_callback(const sensor_msgs::msg::Imu::SharedPtr msg)
                {
                    RCLCPP_INFO(this->get_logger(), "hello, I'm node %s, got imu data with timestamp %ld ns.",
                                this->get_name().c_str(), msg->header.stamp.nanosec);
                }
            };
            
            int main(int argc, char *argv[])  // Note the change in argv's type
            {
                rclcpp::init(argc, argv);
                auto node = std::make_shared<get_imu>("get_imu");
                rclcpp::spin(node);
                rclcpp::shutdown();
                return 0;
            }
            

            注意:我还修改了日志消息中的时间戳输出,以更清晰地表示它是纳秒(ns)。


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

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

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

              @845865588

              看错误是因为name 没有声明最好提供下完整代码看看,才能找出错误。

              下次注意:
              https://fishros.org.cn/forum/topic/151/提问前必看-不符合要求的问题拒绝回答

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

              1 条回复 最后回复 回复 引用 0
              • 8
                等待修复 @845865588
                最后由 编辑

                小鱼,上面这个就是我的全部代码,订阅fishbot的imu节点的。

                @845865588 在 根据小鱼的教程来的,但是自己编写的时候使用RCLCPP_INFO打印name.c_str()报错 中说:

                @小伊 还是一样的报错,这是我的全部代码。
                #include "rclcpp/rclcpp.hpp"
                #include <string>
                #include <iostream>
                #include "sensor_msgs/msg/imu.hpp"
                #include "std_msgs/msg/int32.hpp"
                #include <iostream>
                #include <chrono>
                #include <unistd.h>

                class get_imu : public rclcpp::Node
                {
                public:
                get_imu(std::string name):Node(name)
                {
                RCLCPP_INFO(this->get_logger(), "hello,im node %s, trying to get imu data.", this->get_name().c_str());
                imu_subscribe_ = this->create_subscription<sensor_msgs::msg::Imu>("imu", rclcpp::SensorDataQoS(), std::bind(&get_imu::imu_callback, this, std::placeholders::_1));
                }

                private:
                rclcpp::Subscription<sensor_msgs::msg::Imu>::SharedPtr imu_subscribe_;
                void imu_callback(const sensor_msgs::msg::Imu::SharedPtr msg)
                {
                //std_msgs::msg::Int32 sec = 0;
                //sec = msg->header.stamp.sec;
                RCLCPP_INFO(this->get_logger(), "hello,im node %s , get imu data %d.", this->get_name().c_str(), msg->header.stamp.nanosec);
                }
                };

                int main(int argc, char argv)
                {
                rclcpp::init(argc, argv);
                /创建对应节点的共享指针对象/
                auto node = std::make_shared<get_imu>("get_imu");
                /
                运行节点,并检测退出信号
                /
                rclcpp::spin(node);
                rclcpp::shutdown();
                return 0;
                }

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

                  您的代码中存在一些语法错误和潜在的问题,这可能导致编译失败。下面我将指出这些问题并提供修改后的代码:

                  1. < 和 > 应该被用来包围包含的头文件,但您的代码中使用了 &lt; 和 &gt;,这是HTML实体编码,而不是C++中的正确符号。

                  2. 在main函数中,您使用了std::make_shared&lt;get_imu&gt;,这同样应该使用<和>。

                  3. 在imu_callback函数中,您试图打印msg->header.stamp.nanosec,这是一个int64_t类型的值,但您使用了%d格式化字符串,这通常用于int。对于int64_t,您应该使用%ld(或对于int64_t在某些编译器中更准确的格式是%PRId64,但这需要包含<inttypes.h>)。

                  4. 您的代码中有两个#include <iostream>,这是不必要的,可以删除一个。

                  5. #include <unistd.h>在这个上下文中看起来是不必要的,除非您计划在未来的代码中使用它(比如usleep)。如果不需要,可以删除它。

                  下面是修改后的代码:

                  #include "rclcpp/rclcpp.hpp"
                  #include <string>
                  #include <iostream>
                  #include "sensor_msgs/msg/imu.hpp"
                  // 删除了 std_msgs/msg/int32.hpp,因为您的代码中没有使用它
                  #include <chrono>
                  // 删除了 #include <unistd.h>,除非您确定需要它
                  
                  class get_imu : public rclcpp::Node
                  {
                  public:
                      get_imu(std::string name) : Node(name)
                      {
                          RCLCPP_INFO(this->get_logger(), "hello,im node %s, trying to get imu data.", this->get_name().c_str());
                          imu_subscribe_ = this->create_subscription<sensor_msgs::msg::Imu>(
                              "imu", rclcpp::SensorDataQoS(),
                              std::bind(&get_imu::imu_callback, this, std::placeholders::_1));
                      }
                  
                  private:
                      rclcpp::Subscription<sensor_msgs::msg::Imu>::SharedPtr imu_subscribe_;
                  
                      void imu_callback(const sensor_msgs::msg::Imu::SharedPtr msg)
                      {
                          // 使用 %ld 或 %PRId64 来格式化 int64_t
                          RCLCPP_INFO(this->get_logger(), "hello,im node %s, get imu data %ld.", this->get_name().c_str(), msg->header.stamp.nanosec);
                      }
                  };
                  
                  int main(int argc, char *argv[])
                  {
                      rclcpp::init(argc, argv);
                      // 使用 < 和 > 而不是 &lt; 和 &gt;
                      auto node = std::make_shared<get_imu>("get_imu");
                      rclcpp::spin(node);
                      rclcpp::shutdown();
                      return 0;
                  }
                  

                  请尝试编译并运行修改后的代码。如果您遇到任何其他问题,请确保您已正确设置了ROS 2工作空间和编译工具链。


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

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

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