Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ROS1/2机器人之从命令调用到程序编写

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

作者头像
zhangrelay
发布于 2022-05-01 02:20:54
发布于 2022-05-01 02:20:54
82800
代码可运行
举报
运行总次数:0
代码可运行

难度级别:

容易☞命令调用

困难☞程序编写

命令调用简单案例

ROS1:

rosrun package-name executable-name

*ROS1必须要保证主节点运行,才能单独使用rosrun。 (roscore)

ROS2:

ros2 run package-name executable-name

比如启动键盘遥控turtlesim

ROS1:

roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key

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

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

ROS2:

ros2 run turtlesim turtlesim_node ros2 run turtlesim turtle_teleop_key

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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
#include "turtlesim/turtle_frame.h"

#include <QPointF>

#include <cstdlib>
#include <ctime>

#define DEFAULT_BG_R 0x65
#define DEFAULT_BG_G 0x65
#define DEFAULT_BG_B 0x65

namespace 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);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【C++】ROS:ROS2环境配置与基础示例
ROS 2 (Robot Operating System 2)是一个开源的机器人操作系统,它是ROS(Robot Operating System)的下一代版本。它提供了一系列工具、库和约定,用于构建机器人应用程序。与ROS 1相比,ROS 2具有更强大的功能,更好的性能和更好的可靠性。
DevFrank
2024/07/24
2.9K0
【C++】ROS:ROS2环境配置与基础示例
ROS2机器人实验报告提示02➡沼泽⬅
颜色属性(color profile)这个选项请注意,不用输密码,一路取消……镜像不能保存在本体,但可以保存到其他盘。
zhangrelay
2021/12/02
4080
ROS2机器人实验报告提示02➡沼泽⬅
ROS入门篇
ROS是一个松耦合的分布式软件框架。上图中有很多的Node(节点),每个节点是在机器人系统中完成一个具体功能的进程,比方说有的Node是完成图像识别,有的Node是完成一个图像的驱动,它们之间会有一系列图像的传输。节点与节点之间位置也不是固定的,比如上图中有两台电脑,一个A,一个B,有些节点可以在A当中,有些节点可以在B当中,它们之间可以通过一系列的传输方式来完成通讯。每个节点的编程语言也不是固定的,可以使用Python,也可以使用C++。
算法之名
2023/10/16
2.4K0
ROS入门篇
计算机操作系统(OS)安装机器人操作系统(ROS)实现物联网功能
博客中大量介绍了将Ubuntu等Linux系统借助机器人操作系统ROS实现机器人控制设计开发和物联网功能案例,并可基于OpenAI等实现人工智能相关训练。
zhangrelay
2021/03/03
2.2K0
ROS学习——第1讲 ROS概述及环境搭建
好事文章地址:https://cloud.tencent.com/developer/article/2469534
Arya
2024/11/22
8180
ROS学习——第1讲 ROS概述及环境搭建
使用机器人操作系统ROS 2和仿真软件Gazebo 9主题进阶实战(七)- mobot速度发布与里程计订阅
在ROS2课程中已经学过并掌握了一个基本的发布器和订阅器(C++),官网的教程全部掌握大致需要20分钟吧。
zhangrelay
2020/05/12
9310
ROS2机器人编程简述humble-第四章-BASIC DETECTOR .3
由于缺¥,所有设备都非常老旧,都是其他实验室淘汰或者拼凑出来的设备。机器人控制笔记本是2010年版本。
zhangrelay
2023/02/26
8010
ROS2机器人编程简述humble-第四章-BASIC DETECTOR .3
ROS 2 Humble Hawksbill 环境基础
Windows  call C:\dev\ros2\local_setup.bat
zhangrelay
2022/05/27
1K0
ROS 2 Humble Hawksbill 环境基础
[ROS2基础]参数和动作
https://gitee.com/shoufei/ros2_galactic_turorials.git
首飞
2022/05/22
9360
[ROS2基础]参数和动作
ROS2 Humble测试版功能包列表
 2022-05-04列表如下1040个: sudo apt install ros-humble- Display all 1040 possibilities? (y or n) ros-hum
zhangrelay
2022/05/10
1.1K0
ROS2 Humble测试版功能包列表
使用机器人操作系统ROS 2和仿真软件Gazebo 9服务进阶实战(八)- mobot行驶至目标位置
案例非常简单,稍微复杂一下,如上述机器人案例,发送目标坐标,机器人行驶到目标坐标。
zhangrelay
2020/05/25
5710
使用机器人操作系统ROS 2和仿真软件Gazebo 9服务进阶实战(八)- mobot行驶至目标位置
ROS2 C++ Subscriber Publisher 订阅发布例子
文章目录 ROS2 Subscriber Publisher 例子 ROS2 Subscriber Publisher 例子 运行环境 Ubuntu 20.04 ROS Foxy sub #include <iostream> #include <rclcpp/rclcpp.hpp> #include <std_msgs/msg/string.hpp> void callback(const std_msgs::msg::String::SharedPtr msg) { std::cout <<
Autooooooo
2022/05/09
1.1K0
ROS2 C++ Subscriber Publisher 订阅发布例子
ROS Beginner(长文预警!
参考网站:http://wiki.ros.org/cn/ROS/Tutorials
From Zero
2021/12/07
1K0
详细分析一个ROS2 CMakeLists.txt文件
ROS2的构建系统ament_cmake是基于CMake改进而来的。本篇文章我们详细介绍一下ament_cmake常用的语句。
首飞
2022/07/17
2.9K0
详细分析一个ROS2 CMakeLists.txt文件
机器人编程趣味实践06-程序(节点)
每敲击一行指令,开启一个或多个程序,具体介绍参考(ROS 2节点-nodes-)。
zhangrelay
2021/12/02
4480
机器人编程趣味实践06-程序(节点)
机器人操作系统二(ROS2)- 修行 Taoism
ROS 2项目的目标是继承ROS 1的优点并改进不合适的部分。The goal of the ROS 2 project is to leverage what is great about ROS 1 and improve what isn’t.
zhangrelay
2019/08/29
3.9K0
机器人操作系统二(ROS2)- 修行 Taoism
[ROS2基础] TF2使用细节
本示例中启动了两只小乌龟Turtle1和Turtle2。TF发布器会将Turtle1相对于world坐标系的位置关系和Turtle2相对于world坐标系的位置关系发布出来。为了实现Turtle2跟随Turtle1的效果,程序中获取了Turtle1相对于Turtle2的位置关系并且将其折算成速度控制量。
首飞
2022/06/05
2.7K0
[ROS2基础] TF2使用细节
ROS2机器人编程简述humble-第二章-Launchers .3.3
ros2 run一次只能开启一个node,如果一次开启一组相关node,需要使用ros2 launch。
zhangrelay
2023/02/10
6410
ROS2机器人编程简述humble-第二章-Launchers .3.3
ROS2机器人编程简述humble-第二章-DEVELOPING THE FIRST NODE .2
0.1ROS2机器人编程简述新书推荐-A Concise Introduction to Robot Programming with ROS2
zhangrelay
2023/02/03
6420
ROS2编程基础课程--msg/srv
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
zhangrelay
2019/09/19
1.6K0
推荐阅读
相关推荐
【C++】ROS:ROS2环境配置与基础示例
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档