以Listener和Talker为例ROS1和ROS2代码对比

flyfish

环境
Ubuntu 18.04
ROS 1 Melodic
ROS 2 Bouncy

使用命令创建包

ros2 pkg create mypkg --cpp-node-name my_node

自动创建文件
package.xml

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="2"><name>mypkg</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="pumpkin@todo.todo">pumpkin</maintainer><license>TODO: License declaration</license><buildtool_depend>ament_cmake</buildtool_depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export>
</package>

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(mypkg)# Default to C99
if(NOT CMAKE_C_STANDARD)set(CMAKE_C_STANDARD 99)
endif()# Default to C++14
if(NOT CMAKE_CXX_STANDARD)set(CMAKE_CXX_STANDARD 14)
endif()if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)add_executable(my_node src/my_node.cpp)
target_include_directories(my_node PUBLIC$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>$<INSTALL_INTERFACE:include>)install(TARGETS my_nodeEXPORT export_${PROJECT_NAME}DESTINATION lib/${PROJECT_NAME})if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# the following line skips the linter which checks for copyrights# remove the line when a copyright and license is present in all source filesset(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# remove the line when this package is a git reposet(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()ament_package()

代码
代码来自《ROS机器人开发实践》 胡春旭

ros2_talker.cpp

#include <iostream>
#include <memory>#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"int main(int argc, char * argv[])
{//ros::init(argc, argv, "talker");rclcpp::init(argc, argv);//ros::NodeHandle n;auto node = rclcpp::Node::make_shared("talker");// 配置质量服务原则,ROS2针对以下几种应用提供了默认的配置:// publishers and subscriptions (rmw_qos_profile_default).// Services (rmw_qos_profile_services_default).// Sensor data (rmw_qos_profile_sensor_data).rmw_qos_profile_t custom_qos_profile = rmw_qos_profile_default;// 配置QoS中历史数据的缓存深度custom_qos_profile.depth = 7;//ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);auto chatter_pub = node->create_publisher<std_msgs::msg::String>("chatter", custom_qos_profile);//ros::Rate loop_rate(10);rclcpp::WallRate loop_rate(2);auto msg = std::make_shared<std_msgs::msg::String>();auto i = 1;//while (ros::ok())while (rclcpp::ok()) {msg->data = "Hello World: " + std::to_string(i++);std::cout << "Publishing: '" << msg->data << "'" << std::endl;//chatter_pub.publish(msg);chatter_pub->publish(msg);//ros::spinOnce();rclcpp::spin_some(node);//loop_rate.sleep();loop_rate.sleep();}return 0;
}

ros2_listerner.cpp

#include <iostream>
#include <memory>#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"//void chatterCallback(const std_msgs::String::ConstPtr& msg)
void chatterCallback(const std_msgs::msg::String::SharedPtr msg)
{std::cout << "I heard: [" << msg->data << "]" << std::endl;
}int main(int argc, char * argv[])
{//ros::init(argc, argv, "listener");rclcpp::init(argc, argv);//ros::NodeHandle n;auto node = rclcpp::Node::make_shared("listener");//ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);auto sub = node->create_subscription<std_msgs::msg::String>("chatter", chatterCallback, rmw_qos_profile_default);//ros::spin();rclcpp::spin(node);return 0;
}

更改CMakeLists.txt 文件

cmake_minimum_required(VERSION 3.5)
project(mypkg)# Default to C99
if(NOT CMAKE_C_STANDARD)set(CMAKE_C_STANDARD 99)
endif()# Default to C++14
if(NOT CMAKE_CXX_STANDARD)set(CMAKE_CXX_STANDARD 14)
endif()if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")add_compile_options(-Wall -Wextra -Wpedantic)
endif()# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)add_executable(my_node src/my_node.cpp)
target_include_directories(my_node PUBLIC$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>$<INSTALL_INTERFACE:include>)add_executable(ros2_talker src/ros2_talker.cpp)
ament_target_dependencies(ros2_talker rclcpp std_msgs)add_executable(ros2_listerner src/ros2_listerner.cpp)
ament_target_dependencies(ros2_listerner rclcpp std_msgs)install(TARGETS my_noderos2_talkerros2_listernerEXPORT export_${PROJECT_NAME}DESTINATION lib/${PROJECT_NAME})if(BUILD_TESTING)find_package(ament_lint_auto REQUIRED)# the following line skips the linter which checks for copyrights# remove the line when a copyright and license is present in all source filesset(ament_cmake_copyright_FOUND TRUE)# the following line skips cpplint (only works in a git repo)# remove the line when this package is a git reposet(ament_cmake_cpplint_FOUND TRUE)ament_lint_auto_find_test_dependencies()
endif()ament_package()

编译

$ colcon build
Starting >>> mypkg
Finished <<< mypkg [3.35s]                       Summary: 1 package finished [3.53s]

启动执行命令

$ source ~/ros2_ws/src/install/setup.bash
$ ros2 run mypkg ros2_talker
Publishing: 'Hello World: 1'
Publishing: 'Hello World: 2'
Publishing: 'Hello World: 3'$ ros2 run mypkg ros2_listerner
I heard: [Hello World: 1]
I heard: [Hello World: 2]
I heard: [Hello World: 3]
I heard: [Hello World: 4]

遇到的问题

package not found 的原因是
没有执行source install/setup.bash

ros2: command not found
二进制的安装:source /opt/ros/bouncy/setup.bash
源码安装:source ~/ros2_ws/src/install/setup.bash

fatal error: rclcpp/rclcpp.hpp: No such file or directory
#include “rclcpp/rclcpp.hpp”
CMakeLists.txt 文件没有添加 find_package(rclcpp REQUIRED)

以Listener和Talker为例ROS1和ROS2代码对比相关推荐

  1. Ubuntu20.04同时安装ROS1和ROS2共存

    Ubuntu20.04同时安装ROS1和ROS2共存 文章目录 Ubuntu20.04同时安装ROS1和ROS2共存 一.换源 1.1 通过软件更新 1.2 通过修改源文件(建议) 二.安装ROS1( ...

  2. 微软Windows操作系统全面兼容机器人操作系统ROS1和ROS2

    微软Windows操作系统全面兼容机器人操作系统ROS1和ROS2 turtlebot2:https://github.com/bfjelds/turtlebot2-win10 文档:https:// ...

  3. ros1 和 ros2的区别

    为什么用ros2.0 0.概述 1.基本概念 基本概念: ROS网络(ROS Graph)概念简介: 节点(Nodes) 客户端程序库 发现 2. ros2 的目标 3. ros2 的架构 4. ro ...

  4. 为什么机器人操作系统ROS1、ROS2这么难学

    AI回复: ROS1.ROS2是机器人操作系统,涉及到很多复杂的概念和技术,需要有一定的编程和机器人知识基础才能学习.此外,ROS1和ROS2的架构和设计也有很大的不同,需要花费一定的时间和精力去学习 ...

  5. Ubuntu18.04安装ROS1和ROS2 Ubuntu18.04安装ROS1-Melodic和ROS2-Dashing 保姆教程

    最近在Ubuntu18.04环境下使用realsense,需要配置ROS1和ROS2,查找了多方面教程,最后整理出来一个成功案例,自己测试已经成功(经过多次尝试,如果想使用ROS2,必须先把ROS1安 ...

  6. ROS1和ROS2RVIZ 代码详解

    ROS1和ROS2 RVIZ 代码详解 目录 ROS1和ROS2 RVIZ 代码详解 1. 头文件 2.创建对象 3.DELETEALL 操作,防止重影 4.坐标系.时间戳.命名空间.id.生命周期 ...

  7. 如何将ROS1和ROS2安装到同一个ubuntu系统中

    目录 写在前面 1. 本文测试环境: 2. 先说结论 2. 再说操作 2.1 不赘述的ROS1和ROS2的安装方法 2.1 ROS1和ROS2快速切换系统环境变量的方法 最后的话 写在前面 依旧是小马 ...

  8. ROS1与ROS2 的区别

    ROS1与ROS2 的区别 1.ros1 组件用c++/python,ros2 组件用c/python: 2.ros1 只支持Linux和MacOS,而 ros2 支持Linux/Windows/Ma ...

  9. 从ROS1到ROS2无人机编程实战指南

    亲爱的读者们,我今天非常荣幸地向大家推荐一本本人的全新力作--<从ROS1到ROS2无人机编程实战指南>.这本书站在初学者的角度,从入门到进阶,再到实战,循序渐进,是学习ROS1和ROS2 ...

最新文章

  1. 解决Python报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 658: illegal multibyte
  2. 雅虎向阿里巴巴示好原因有二
  3. Linux操作系统报:read-only file system
  4. webstorm小技巧
  5. [LOJ500]ZQC的拼图
  6. wireshark 抓包iphone 4g_比4G下续航短2小时,苹果回应iPhone12用5G耗电快:与运营商一道做更多优化工作...
  7. 到2025年将保持不变的热门流行技术
  8. 科目三电子路考哪些情况会被评判不合格
  9. oracle用户的追踪文件,Oracle中怎样通过触发器来追踪用户的活动?
  10. 微博粉丝精灵_腾讯与精灵宝可梦公司宣布合作开发新游戏
  11. 近些年CPU的性能是不是快到天花板了?
  12. linux进程阻塞的原因,释放大块内存时的阻塞问题
  13. 以终端模式连接远程桌面
  14. Wowza服务器系列(3):试用wowza Stream Engine服务运行
  15. edgewin10无法安装_win10内置Edge浏览器遇到“您未安装FLASH控件”如何解决
  16. Excel加载“宏”
  17. 体验一下阿里云文字识别OCR
  18. 解决vs code使用code runner无法输入数据问题
  19. 【HDL】Verilog HDL仿真工具iverilog(Icarus Verilog)
  20. 【算法】只有五行的Floyd最短路算法

热门文章

  1. IDEA新建项目需要新建好文件夹
  2. 易语言.尘土界面库2.0版源代码分析(1):缘起
  3. 出现数据库不给访问的情况
  4. Java基本数据类型转字符串
  5. Java 时间间隔计算工具类
  6. 互联网项目发币一年,“简书们”活得好吗?
  7. 调用“抱抱脸团队打造的Transformers pipeline API” 通过预训练模型,快速训练和微调自己的模型
  8. Chrome DevTools 使用详解
  9. 五金机电行业供应商智慧管理平台解决方案:优化供应链管理,带动企业业绩增长
  10. 函数平移口诀_三角函数平移伸缩变换口诀是什么