ros中msg文件的bool类型并不会生成bool类型变量

在C++中,使用std::cout尝试输出由msg文件定义的bool类型成员变量时,发现输出结果异常,原因是bool被转换为uint8_t类型,导致输出不正确。尽管如此,该变量仍可正常作为bool使用。

今天在调试的过程中,我用std::cout输出一个用msg文件定义的类型的成员变量,在msg中定义是bool类型,但是输出的时候发现不太对,输出不了正确的东西,查看了一下自动生成的源码,发现它把bool类型变成了uint8_t,应该是cout不能输出uint8_t的内容,所以会输出奇怪的东西。
下图第一行为该变量为0时输出的东西,是一个空行,第二行为1时输出的东西,是一个长方形包裹着奇怪东西的图案。

在这里插入图片描述

但是这个变量在使用上依然可以当作bool使用,只不过是输出的时候输出不了而已

### ROS2 C++ 发送 string、int 和 bool 数据的实现方法 在ROS2中,C++发送`string`、`int`和`bool`类型的数据需要使用对应的ROS消息类型通过发布者(Publisher)将数据发送到指定话题。以下是具体实现方法和示例代码。 #### 1. 消息类型的映射 根据提供的引用内容[^1],ROS2中的基本数据类型与C++类型的映射如下: - `string` 对应 `std::string` - `int32` 对应 `int32_t` - `bool` 对应 `bool` #### 2. 示例代码 以下是一个完整的示例代码,展示如何在ROS2中使用C++实现发送`string`、`int`和`bool`类型的数据。 ```cpp #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" #include "std_msgs/msg/int32.hpp" #include "std_msgs/msg/bool.hpp" using namespace std::chrono_literals; class DataPublisher : public rclcpp::Node { public: DataPublisher() : Node("data_publisher_node") { // 创建一个用于发布字符串的发布者 string_publisher_ = this->create_publisher<std_msgs::msg::String>("string_topic", 10); // 创建一个用于发布整数的发布者 int_publisher_ = this->create_publisher<std_msgs::msg::Int32>("int_topic", 10); // 创建一个用于发布布尔值的发布者 bool_publisher_ = this->create_publisher<std_msgs::msg::Bool>("bool_topic", 10); // 定义一个定时器,每隔1秒发布一次数据 timer_ = this->create_wall_timer(1s, std::bind(&DataPublisher::publish_data, this)); } private: void publish_data() { // 准备要发布的字符串消息 auto string_msg = std_msgs::msg::String(); string_msg.data = "Hello ROS2"; string_publisher_->publish(string_msg); // 准备要发布的整数消息 auto int_msg = std_msgs::msg::Int32(); int_msg.data = 42; int_publisher_->publish(int_msg); // 准备要发布的布尔消息 auto bool_msg = std_msgs::msg::Bool(); bool_msg.data = true; bool_publisher_->publish(bool_msg); } rclcpp::Publisher<std_msgs::msg::String>::SharedPtr string_publisher_; rclcpp::Publisher<std_msgs::msg::Int32>::SharedPtr int_publisher_; rclcpp::Publisher<std_msgs::msg::Bool>::SharedPtr bool_publisher_; rclcpp::TimerBase::SharedPtr timer_; }; int main(int argc, char **argv) { rclcpp::init(argc, argv); auto node = std::make_shared<DataPublisher>(); rclcpp::spin(node); rclcpp::shutdown(); return 0; } ``` #### 3. 代码说明 - 使用`std_msgs::msg::String`、`std_msgs::msg::Int32`和`std_msgs::msg::Bool`分别定义`string`、`int`和`bool`类型的消息。 - 创建三个发布者,分别对应不同的消息类型和话题名称。 - 使用定时器每秒调用一次`publish_data`函数,发布不同类型的数据到各自的话题。 #### 4. 编译与运行 确保安装了ROS2环境正确配置工作空间后,可以按照以下步骤编译和运行代码: 1. 将代码保存为`data_publisher.cpp`。 2. 在`CMakeLists.txt`中添加编译规则: ```cmake add_executable(data_publisher src/data_publisher.cpp) ament_target_dependencies(data_publisher rclcpp std_msgs) ``` 3. 编译运行节点: ```bash colcon build source install/setup.bash ros2 run <package_name> data_publisher ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值