ROS1/2机器人之从命令调用到程序编写

发布时间 - 2025-07-16 00:00:00    点击率:

难度级别:

容易☞命令调用

困难☞程序编写

命令调用简单案例

ROS1:

rosrun package-name executable-name

ROS2:

ros2 run package-name executable-name

比如启动键盘遥控turtlesim

ROS1:

大多数 ROS1 节点在启动时连接到节点管理器上,如果运行中连接中断,则不会尝试重新连接。因此,如果 roscore 被终止,当前运行的其他节点将无法建立新的连接,即使 稍后重启 roscore 也无济于事。

于是,引入DDS!(当然这只是其中一个重要原因)

ROS2:

ROS 2建立在DDS / RTPS之上,将其作为中间件,提供发现、序列化和传输等功能。 总述一下,DDS是一 个端到端的中间件,它提供了ROS系统相关的功能,例如分布式发现(并不是ROS 1采用的集中式,如roscore)和控制传输不同 “服务质量”的选项。

DDS是一个行业标准,然后由一系列供应商实施,如:RTI 的实现版本-Connext或ADLink的实现版本-OpenSplice RTPS(又 名DDSI-RTPS)是DDS用于通过网络进行通信的有线协议,虽 然有些实现并不能满足完整的DDS API,但可以为ROS 2提供足够的功能,例如eProsima的实现版本-快速RTPS。 ROS 2支持多种DDS / RTPS实现,因此在选择供应商/实现时,并不是“一刀切”。在选择中间件实现时,可能会考虑许多因 素:许可、技术、平台可用性或计算占用空间等因素。供应商可能会提供多个针对满足不同需求的DDS或RTPS实现版本。例如,RTI有一些Connext实现的变化,其目的各不相同,例如专门 针对微控制器而另一个针对需要特殊安全认证的应用(目前ROS 2仅支持其标准桌面版本)。为 了 使 用 DDS / RTPS 实 现 与 ROS 2 , ROS 中 间 接 口 “ROS Middleware interface, RMW”(又名rmw接口或rmw)封装需要创建一个使用DDS实现或RTPS实现的API和工具抽象ROS中 间件接口。实现和维护RMW包用于支持DDS开发需要做很多工作,但至少支持一些实现对于确保ROS 2代码库不依赖于任何一 个特定实现非常重要,因为用户依据具体项目的需求,可能希望根据需要切换实现版本。

程序编写简单案例

为何package-name是turtlesim?

这是功能包的名字?

代码语言:javascript代码运行次数:0运行复制
cmake_minimum_required(VERSION 3.5)project(turtlesim)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_package(ament_cmake REQUIRED)find_package(ament_index_cpp REQUIRED)find_package(geometry_msgs REQUIRED)find_package(Qt5 REQUIRED COMPONENTS Widgets)find_package(rclcpp REQUIRED)find_package(rclcpp_action REQUIRED)find_package(rosidl_default_generators REQUIRED)find_package(std_msgs REQUIRED)find_package(std_srvs REQUIRED)include_directories(include ${Qt5Widgets_INCLUDE_DIRS})rosidl_generate_interfaces(${PROJECT_NAME}  "action/RotateAbsolute.action"  "msg/Color.msg"  "msg/Pose.msg"  "srv/Kill.srv"  "srv/SetPen.srv"  "srv/Spawn.srv"  "srv/TeleportAbsolute.srv"  "srv/TeleportRelative.srv")set(dependencies "ament_index_cpp" "geometry_msgs" "rclcpp" "rclcpp_action" "std_msgs" "std_srvs")set(turtlesim_node_SRCS  src/turtlesim.cpp  src/turtle.cpp  src/turtle_frame.cpp)set(turtlesim_node_HDRS  include/turtlesim/turtle_frame.h)qt5_wrap_cpp(turtlesim_node_MOCS ${turtlesim_node_HDRS})add_executable(turtlesim_node ${turtlesim_node_SRCS} ${turtlesim_node_MOCS})target_link_libraries(turtlesim_node Qt5::Widgets)ament_target_dependencies(turtlesim_node ${dependencies})rosidl_target_interfaces(turtlesim_node ${PROJECT_NAME} "rosidl_typesupport_cpp")add_executable(turtle_teleop_key tutorials/teleop_turtle_key.cpp)ament_target_dependencies(turtle_teleop_key ${dependencies})rosidl_target_interfaces(turtle_teleop_key ${PROJECT_NAME} "rosidl_typesupport_cpp")add_executable(draw_square tutorials/draw_square.cpp)ament_target_dependencies(draw_square ${dependencies})rosidl_target_interfaces(draw_square ${PROJECT_NAME} "rosidl_typesupport_cpp")add_executable(mimic tutorials/mimic.cpp)ament_target_dependencies(mimic ${dependencies})rosidl_target_interfaces(mimic ${PROJECT_NAME} "rosidl_typesupport_cpp")install(TARGETS turtlesim_node turtle_teleop_key draw_square mimic  DESTINATION lib/${PROJECT_NAME})install(DIRECTORY images  DESTINATION share/${PROJECT_NAME}  FILES_MATCHING PATTERN "*.png" PATTERN "*.svg")install(DIRECTORY launch  DESTINATION share/${PROJECT_NAME})ament_package()

功能包名字参考:project(turtlesim)

与此类似,节点名字如下:

add_executable(turtlesim_node {turtlesim_node_SRCS} {turtlesim_node_MOCS}) target_link_libraries(turtlesim_node Qt5::Widgets) ament_target_dependencies(turtlesim_node {dependencies}) rosidl_target_interfaces(turtlesim_node {PROJECT_NAME} "rosidl_typesupport_cpp")

add_executable(turtle_teleop_key tutorials/teleop_turtle_key.cpp) ament_target_dependencies(turtle_teleop_key {dependencies}) rosidl_target_interfaces(turtle_teleop_key {PROJECT_NAME} "rosidl_typesupport_cpp")


命令调用,通俗不严谨说类似API;

编写程序,通俗不严谨说类似APP。

调用API难,还是开发APP难?不言而喻呢。

只使用命令调用(受制于程序):

如果程序编写则可以(自由飞翔的舞台):

代码语言:javascript代码运行次数:0运行复制
#include "turtlesim/turtle_frame.h"#include #include #include #define DEFAULT_BG_R 0x65#define DEFAULT_BG_G 0x65#define DEFAULT_BG_B 0x65namespace turtlesim{TurtleFrame::TurtleFrame(rclcpp::Node::SharedPtr& node_handle, QWidget* parent, Qt::WindowFlags f): QFrame(parent, f), path_image_(888, 888, QImage::Format_ARGB32), path_painter_(&path_image_), frame_count_(0), id_counter_(0){  setFixedSize(888, 888);  setWindowTitle("TurtleSim奇妙曲线");  srand(time(NULL));  update_timer_ = new QTimer(this);  update_timer_->setInterval(16);  update_timer_->start();  connect(update_timer_, SIGNAL(timeout()), this, SLOT(onUpdate()));  nh_ = node_handle;  rcl_interfaces::msg::IntegerRange range;  range.from_value = 0;  range.step = 1;  range.to_value = 255;  rcl_interfaces::msg::ParameterDescriptor background_r_descriptor;  background_r_descriptor.description = "Red channel of the background color";  background_r_descriptor.integer_range.push_back(range);  rcl_interfaces::msg::ParameterDescriptor background_g_descriptor;  background_g_descriptor.description = "Green channel of the background color";  background_g_descriptor.integer_range.push_back(range);  rcl_interfaces::msg::ParameterDescriptor background_b_descriptor;  background_b_descriptor.description = "Blue channel of the background color";  background_b_descriptor.integer_range.push_back(range);  nh_->declare_parameter("background_r", rclcpp::ParameterValue(DEFAULT_BG_R), background_r_descriptor);  nh_->declare_parameter("background_g", rclcpp::ParameterValue(DEFAULT_BG_G), background_g_descriptor);  nh_->declare_parameter("background_b", rclcpp::ParameterValue(DEFAULT_BG_B), background_b_descriptor);


# node.js  # 工具  # ai  # red  # JavaScript  # 分布式  # 中间件  # 封装  # 接口  # Interface  # 是一个  # 这是  # 多个  # 将其  # 与此  # 这只  # 一个重要  # 非常重要  # 不言而喻  # 无济于事 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel怎么在Controller之外的地方验证数据  如何快速搭建安全的FTP站点?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  奇安信“盘古石”团队突破 iOS 26.1 提权  EditPlus中的正则表达式 实战(4)  Laravel如何集成Inertia.js与Vue/React?(安装配置)  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  新三国志曹操传主线渭水交兵攻略  公司网站制作需要多少钱,找人做公司网站需要多少钱?  Laravel如何使用.env文件管理环境变量?(最佳实践)  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  在线制作视频网站免费,都有哪些好的动漫网站?  bing浏览器学术搜索入口_bing学术文献检索地址  PHP正则匹配日期和时间(时间戳转换)的实例代码  b2c电商网站制作流程,b2c水平综合的电商平台?  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  MySQL查询结果复制到新表的方法(更新、插入)  再谈Python中的字符串与字符编码(推荐)  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  JavaScript如何操作视频_媒体API怎么控制播放  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何用已有域名快速搭建网站?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  如何用好域名打造高点击率的自主建站?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  高端网站建设与定制开发一站式解决方案 中企动力  如何在云主机快速搭建网站站点?  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  Android滚轮选择时间控件使用详解  如何实现建站之星域名转发设置?  北京网站制作的公司有哪些,北京白云观官方网站?  如何在阿里云ECS服务器部署织梦CMS网站?  如何用美橙互联一键搭建多站合一网站?  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel怎么实现微信登录_Laravel Socialite第三方登录集成  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  php485函数参数是什么意思_php485各参数详细说明【介绍】  制作公司内部网站有哪些,内网如何建网站?  详解MySQL数据库的安装与密码配置  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  香港服务器部署网站为何提示未备案?  Win11怎样安装网易有道词典_Win11安装词典教程【步骤】  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  如何在宝塔面板中修改默认建站目录?  什么是javascript作用域_全局和局部作用域有什么区别?