当前位置: 首页 > news >正文

【ROS2快速学习】

ROS2

去中心化master
不重复造轮子,更换为DDS

工具:

1. 常用指令

功能ROS1ROS2
录制话题rosbag record xxxros2 bag record xxx
播放话题rosbag play xxx.bagros2 bag play xxx
查看数据包内容Rosbag info xxx.bagRos2 bag info xxx.db3
查看话题列表rostopic listRos2 topic list
查看话题列表,
增加消息类型
ros2 topic list -t
输出话题内容Rostopic echo xxxRos2 topic echo xxx
查看某话题rostopic info xxxros2 topic info xxx
查看msg 内容rosmsg show xxxros2 interface show xxx
话题发布rostopic pub xxxros2 topic pub xxx

2. 数据包转换

# 安装 工具
pip3 install rosbags
# 更新
pip3 install --upgrade rosbags
# 下载慢,指定下载源 
pip3 install rosbags -i https://pypi.tuna.tsinghua.edu.cn/simple
# 使用方法  目标文件夹路径: 转换后的数据包存放的文件夹和转换后数据包的名称
rosbags-convert <源文件路径> --dst <目标文件夹路径>
# ros2 -> ros1 
rosbags-convert <your-ros2-bag>
# ros1 -> ros2 
rosbags-convert <your-ros1-bag>

3. 具体区别

消息订阅

ROS1

void chatterCallback(const std_msgs::String::ConstPtr& msg) {ROS_INFO("ROS 1 Heard: [%s]", msg->data.c_str());
}
int main(int argc, char** argv) {ros::init(argc, argv, "ros1_subscriber");ros::NodeHandle nh;// 创建订阅者ros::Subscriber sub = nh.subscribe("chatter", 10, chatterCallback);ROS_INFO("ROS 1 Subscriber ready...");// 进入循环处理回调ros::spin();return 0;
}

ROS2

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"using std::placeholders::_1;class ROS2Subscriber : public rclcpp::Node {
public:ROS2Subscriber() : Node("ros2_subscriber") {// 创建订阅者 (使用lambda表达式或bind)subscription_ = this->create_subscription<std_msgs::msg::String>("chatter", 10, std::bind(&ROS2Subscriber::topic_callback, this, _1));RCLCPP_INFO(this->get_logger(), "ROS 2 Subscriber ready...");}private:void topic_callback(const std_msgs::msg::String::SharedPtr msg) const {RCLCPP_INFO(this->get_logger(), "ROS 2 Heard: '%s'", msg->data.c_str());}rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;
};int main(int argc, char* argv[]) {rclcpp::init(argc, argv);auto node = std::make_shared<ROS2Subscriber>();rclcpp::spin(node);rclcpp::shutdown();return 0;
}
消息发布

ROS1

	// 初始化ROS节点ros::init(argc, argv, "ros1_publisher");ros::NodeHandle nh;// 创建发布者ros::Publisher pub = nh.advertise<std_msgs::String>("chatter", 10);ros::Rate rate(1); // 1Hzint count = 0;while (ros::ok()) {std_msgs::String msg;msg.data = "Hello ROS 1: " + std::to_string(count++);// 发布消息pub.publish(msg);ROS_INFO("Published: %s", msg.data.c_str());rate.sleep();}

ROS2

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"using namespace std::chrono_literals;class ROS2Publisher : public rclcpp::Node {
public:ROS2Publisher() : Node("ros2_publisher"), count_(0) {// 创建发布者 (使用泛型模板)publisher_ = this->create_publisher<std_msgs::msg::String>("chatter", 10);// 创建定时器timer_ = this->create_wall_timer(1000ms, std::bind(&ROS2Publisher::timer_callback, this));}private:void timer_callback() {auto message = std_msgs::msg::String();message.data = "Hello ROS 2: " + std::to_string(count_++);// 发布消息publisher_->publish(message);RCLCPP_INFO(this->get_logger(), "Published: '%s'", message.data.c_str());}rclcpp::TimerBase::SharedPtr timer_;rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;size_t count_;
};int main(int argc, char* argv[]) {// 初始化ROS 2rclcpp::init(argc, argv);// 创建并运行节点auto node = std::make_shared<ROS2Publisher>();rclcpp::spin(node);// 关闭ROS 2rclcpp::shutdown();return 0;
}
消息区别

ROS1

# std_msgs/String.msg
# #include "std_msgs/String.h"
string data

ROS2

# std_msgs/msg/String.msg
#include "std_msgs/msg/string.hpp"
# ROS 2 消息在 msg 子命名空间中
string data
自定义消息

ROS1

# my_package/msg/MyCustom.msgstring first_name
string last_name
uint32 age
float32 score

package.xml

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

CMakeLists.txt

find_package(catkin REQUIRED COMPONENTSmessage_generationstd_msgs
)add_message_files(FILESMyCustom.msg
)generate_messages(DEPENDENCIESstd_msgs
)catkin_package(CATKIN_DEPENDS message_runtime std_msgs
)

ROS2

string first_name
string last_name
uint32 age
float32 score

package.xml

<buildtool_depend>ament_cmake</buildtool_depend>
<depend>rosidl_default_generators</depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<member_of_group>rosidl_interface_packages</member_of_group>

CMakeLists.txt

find_package(ament_cmake REQUIRED)
find_package(rosidl_default_generators REQUIRED)rosidl_generate_interfaces(${PROJECT_NAME}"msg/MyCustom.msg"DEPENDENCIES std_msgs
)ament_export_dependencies(rosidl_default_runtime)
主要架构差别
特性ROS 1ROS 2
节点初始化ros::init()rclcpp::init()
节点创建ros::NodeHandle继承 rclcpp::Node
发布者nh.advertise<>()create_publisher<>()
订阅者nh.subscribe()create_subscription<>()
消息类型std_msgs::Stringstd_msgs::msg::String
回调处理ros::spin()rclcpp::spin()
消息指针ConstPtrSharedPtr
命名空间扁平结构msg 子命名空间
构建系统catkinament_cmake
消息生成message_generationrosidl_default_generators

4. ROS2 调试

# 错误
error while loading shared libraries: libOgreMain.so.1.12.1: cannot open shared object file: No such file or directory# 解决
source /opt/ros/humble/setup.bash 
# 错误
root@nuc:/workspace# ros2 run rviz2 rviz2 
qt.qpa.xcb: could not connect to display 
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
[ros2run]: Aborted
# 解决
ROS2 Docker 可视化
https://blog.csdn.net/qq_39779233/article/details/142900876
# 这个写到brshrc 中
export DISPLAY=:0
# 在docker 环境外执行
xhost +local:
ROS2多机
  • 物理连接性测试 组播测试

    # 发送端
    ros2 multicast send# 接收端
    ros2 multicast receive
    
  • 通讯测试

    sudo apt install ros-humble-examples-rclpy-minimal-publisher
    # 发送端
    ros2 run examples_rclcpp_minimal_publisher publisher_member_function
    # 接收端
    ros2 topic list
    
  • 设置ROS_DOMAIN_ID

    # 设置 domain_id 
    export ROS_DOMAIN_ID=1
    # 打印 domain_id 
    echo $ROS_DOMAIN_ID
    
    • ROS_DOMAIN_ID 相同,即可相互通信
    • ROS_DOMAIN_ID 不同,不可相互通信,但是组播测试成功
http://www.dtcms.com/a/461872.html

相关文章:

  • Vue3源码runtime-core运行时核心模块之provide依赖和inject注入详解
  • 网站开发个人简历word下载陕西网站建设设计
  • P2P技术
  • 面试真实经历某节跳动大厂Java和算法问答以及答案总结(一)
  • Python全栈(基础篇)——Day08:后端内容(切片+迭代+实战演示+每日一题)
  • 各大网站头条凡科免费网站可以做推广吗
  • 技术速递|GitHub 如何保护开发者免受版权执法过度影响
  • LLAVA-MINI论文阅读
  • OpenAI Agents 并行化实现
  • CNN卷计计算
  • 腾讯云服务器做网站可以吗徐州网站建设
  • 上市公司协会网站建设汇报wordpress接入qq互联
  • 前端 = [...this.orderList] (深拷贝)和this.orderList (引用赋值)
  • 部门管理|“删除部门”功能实现(Django5零基础Web平台)
  • 从 0 到 1 搭建 Python 语言 Web UI自动化测试学习系列 12--日志模块设计
  • 服务器网站源码在哪七牛云配置wordpress
  • SQL-多对多关系
  • PostgreSQL 18 异步 I/O(AIO)调优指南
  • 购物网站名字大全云虚拟主机 多个网站
  • 使用DuckDB SQL求三阶六角幻方
  • 电子商务网站建设一般流程无忧代理 在线
  • 一文了解Function Calling、MCP、Agent联系与区别
  • 存储芯片核心产业链主营产品:兆易创新、北京君正、澜起科技、江波龙、长电科技、佰维存储,6家龙头公司主营产品深度数据
  • Git 常用命令完整指南
  • 网站维护入口房子装修设计软件
  • MySQL 延时从库的作用与意义
  • h5网站价格wordpress footer.php添加qq悬浮
  • 【脚本升级】银河麒麟V10一键安装MySQL9.3.0
  • android pdf框架-15,mupdf工具与其它
  • 前端通用文件下载方案:从 Blob 流处理到实际业务落地