-
2018-03-22 22:06:56
由于自己看些野路子的书本把自己坑了,于是开始一步步的解BUG之旅,将自己的调试的过程与大家分享。。
这里假设是你已经安装好了ROS,我在这里用的是Ubuntu 16.04,ROS版本:Kinetic(一直把这个记成Kinect,错了很多地方。。)
(1)首先建立工作空间:ROS系统进行运行时都是在某个工作空间下,允许有许多个工作空间,经常需要切换
这里我工作空间名字就叫catkin_ws好了,官方书籍也是这样写的(中间部分代码没有注释,随便翻本书就可以看懂)
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src catkin_init_workspace cd ~/catkin_ws catkin_make
(2)创建ROS包
cd ~/catkin_ws/src catkin_create_pkg example_cpp(功能包名字) std_msgs roscpp
(3)编译ROS功能包
cd ~/catkin_ws catkin_make
(4)将两个cpp文件(example_public.cpp和example_subscriber.cpp)放到catkin_ws/example_cpp/src里面
example_public.cpp
#include <ros/ros.h> #include <std_msgs/String.h> #include <sstream> int main(int argc,char **argv) { ros::init(argc,argv,"example_public"); //a) ros::NodeHandle n; //b) ros::Publisher chatter_pub = n.advertise<std_msgs::String>("message",1000); //c) ros::Rate loop_rate(10); //d) while(ros::ok()) //中断,遇到ctrl+c时候中断 { std_msgs::String msg; //申请内存 std::stringstream ss; //信息内容变量 ss << "I am publisher "; //写入变量 msg.data = ss.str(); //写入内存 chatter_pub.publish(msg); //调用发布函数 loop_rate.sleep(); //发送频率 } return 0; }
example_subscriber.cpp
#include <ros/ros.h> #include <std_msgs/String.h> void chatterCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]",msg->data.c_str()); //接收的消息 } int main(int argc,char **argv) { ros::init(argc,argv,"example_subscriber"); //a) ros::NodeHandle n; //b) ros::Subscriber sub = n.subscribe("message",1000,chatterCallback); //c) ros::spin(); //回调函数 return 0; }
(5)修改catkin_ws/example_cpp下的CMakeList文件(在末尾加一下内容即可)
include_directories( include ${catkin_INCLUDE_DIRS} ) add_executable(example_public src/example_publih.cpp) add_executable(example_subscriber src/example_subscriber.cpp) add_dependencies(example_public tutorials_generate_messages_cpp) add_dependencies(example_subscriber tutorials_generate_messages_cpp) target_link_libraries(example_public ${catkin_LIBRARIES}) target_link_libraries(example_subscriber ${catkin_LIBRARIES})
注意:这个时候需要去source一下源(这个地方我也没太清楚)
我们ros的master运行需要source /opt/ros/kinetic/setup.bash
可以通过写echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
这样是为了不必每次进行用源,因为终端运行时会自动启动.bashrc文件,你可以可以直接打开.bashrc文件修改参数然后保存
接下来我们由于是在工作空间中运行我们的节点,这就需要source一下我们工作空间的源
source /home/tany/catkin_ws/devel/setup.bash(pwd指令可以看我们工作空间所处的位置,可能devel里保存的是工作空间的源,这个cmake有关)避免每次都要source直接在终端敲入同上的方式:
echo "source /home/tany/catkin_ws/devel/setup.bash" >> ~/.bashrc
(6)最后
cd ~/catkin_ws catkin_make -j4
依次开启新窗口,敲一下三行(每行敲完换一个新终端)
roscore rosrun example_cpp example_public rosrun example_cpp example_subscriber
更多相关内容 -
ROS创建节点并发布数据
2018-08-17 15:07:34通过这篇文 https://blog.csdn.net/dream_cc/article/details/54836896 可以建立一个简单的节点并发布hello world消息。 具体c++代码实现过程及讲解: #include "ros/ros.h" //包含ROS中常用的...开发环境:RobWare Stdio
- 通过这篇文 https://blog.csdn.net/dream_cc/article/details/54836896 可以建立一个简单的节点并发布hello world消息。
- 具体c++代码实现过程及讲解:
#include "ros/ros.h" //包含ROS中常用的头文件 #include "std_msgs/String.h" //按照ros命名规则,std_msgs/String是在ros目录下的string文件内,该文件中有一个string.msg文件 #include <sstream> //初始化ROS系统 //广播消息:在chatter主题上发布std_msgs/String消息到节点管理器 //以指定的频率循环发布消息到chatter int main(int argc, char **argv) { ros::init(argc, argv, "talker");//初始化一个ros节点,节点名称必须是唯一的 //创建用于处理该节点的句柄,这是一个类,开始是见初始化节点,结束时最后用析构函数清除所用资源 ros::NodeHandle n; //创建一个发布主题 //节点管理器把chatter主题上发布的数据告知正在监听这个主题的节点 //NodeHandle::advertise()返回一个ros::publisher()方法,让用户可以在创建的主题上发布消息 ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);//"chattet"发布的主题 1000 发布队列的长度 //指定循环频率10hz,它追踪上一次Rate::sleep()被唤醒之后持续的时间,并在到达指定时间后休眠 ros::Rate loop_rate(10); int count = 0; //在缺省情况下,roscpp安装一个句柄,当系统按下ctrl+c时,ros::ok()返回flase while(ros::ok()) { std_msgs::String msg; std::stringstream ss; ss << "hello word!!" <<count; //C++标准流控制,把字符流给mag.data msg.data = ss.str(); //类似与printf和cout ROS_INFO("%s", msg.data.c_str()); //创建主题时返回的句柄,提供发布消息的方法,用于发布数据 chatter_pub.publish(msg); // ros::spinOnce(); loop_rate.sleep(); ++count; } return 0; }
ee
-
启动ros内核和节点,(注意要在./bashrc中加入source 路径),就可以在终端看到发布的消息了
-
动手学ROS(1):创建ros节点
2021-08-28 13:35:03动手学ROS(1):创建ros节点 ROS (Robot Operating System, 机器人操作系统) 提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等...动手学ROS(1):创建ros节点
ROS (Robot Operating System, 机器人操作系统) 提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能。
1 安装 ros
安装步骤请参考 安装教程
该页面是ROS Melodic版本。本系列教程提供的代码均为在Ubuntu18.04上实测通过。
2 创建ros node
2.1 创建catkin workspace:
$ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/ $ catkin_make
初次运行catkin_make命令会在src目录下生成CMakeLists.txt。该文件不需要改动。
2.2 创建package
$ cd ~/catkin_ws/src $ catkin_create_pkg ros_tutorial std_msgs roscpp
需要注意的是,创建pkg时需要进入src目录。ros_tutorial为pkg的名称,std_msgs 及roscpp为pkg的所依赖的pkg,我们暂时使用c++来进行代码示例,所以依赖了roscpp。顺便提一下,std_msgs为ros提供的标准通信格式,后续讲到通信方式的时候再来细说。
我们首先来认识下pkg默认的目录结构
└── ros_tutorial ├── CMakeLists.txt ├── include │ └── ros_tutorial ├── package.xml └── src
目前我们需要注意到,新生成的pkg里也有一个CMakeLists.txt,这个文件是需要修改的。熟悉c++的朋友应该可以看出来,这就是一个普通的cmake文件,负责工程的编译。
我们写的cpp文件就写在src目录下,头文件放在include下,package.xml用来维护依赖pkg。
2.3 编写ros node
ros node 可以简单理解为ros通信的基本单位。ros工程运行时有一个master 节点和若干个 client节点,各client之间通过master进行通信。
下面就简单写一个ros node. 在ros_tutorial/src下新建ros_tutorial_node.cpp文件:
#include <ros/ros.h> int main(int argc, char **argv) { ros::init(argc, argv, "ros_tutorial_node"); ros::NodeHandle n; ros::Rate rate(1); while (n.ok()) { ROS_INFO("spin once"); ros::spinOnce(); rate.sleep(); } return 0; }
其实这里可以随便写一个cpp文件,这里主要是为了引入ros::nodeHandle的概念。
-
ros::init
初始化
-
ros::NodeHandle
创建ros节点
-
ros::Rate
节点刷新频率
-
ros::spinOnce 或ros::spin
执行刷新
以上是启动节点的必要操作,细节后续会逐步介绍。
2.4 修改CMakeLists
主要修改两个地方。反注释就可以了。
- add_executable:编译目标
- target_link_libraries:定义链接库
## Declare a C++ executable ## With catkin_make all packages are built within a single CMake context ## The recommended prefix ensures that target names across packages don't collide add_executable(${PROJECT_NAME}_node src/ros_tutorial_node.cpp) ## Specify libraries to link a library or executable target against target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES} )
2.5 编译并执行
2.5.1 build
build需要在workspace下进行,故先返回上级目录,再执行catkin_make
$ cd .. $ catkin_make
build成功后,可留意一下workspace下的build和devel文件夹,编译的结果在devel中,build主要记录了cmake相关编译文件。
2.5.2 run
首先需要启动roscore,也就是之前提到过的ros master 节点。打开一个新的终端:
$ roscore
然后在之前的终端中输入:
$ source devel/setup.bash $ rosrun ros_tutorial ros_tutorial_node
初学ros的时候经常会忘记source,养成习惯就好了。
最后,输出结果:
$ rosrun ros_tutorial ros_tutorial_node [ INFO] [1620964595.224187100]: spin once [ INFO] [1620964596.224587500]: spin once [ INFO] [1620964597.224583200]: spin once [ INFO] [1620964598.224580900]: spin once [ INFO] [1620964599.224578200]: spin once
代码的意思是 每秒写一条日志。
3 结语
本文快速地把学习ros需要的最基本操作串了起来,接下来会介绍ros的通信方式。
本系列教程是笔者过去半年的ros开发经验总结,记录成文供读者参考,欢迎留言交流。
-
-
ROS系统cpp创建节点node
2021-08-25 21:00:01创建一个workspace mkdir -p ws/src workspace中必须先创建src文件夹 编译工作空间 cd ws catkin_make source devel/setup.bash 进入工作空间后使用catkin_make 编译 source可以多使用几次。 创建package ...创建一个workspace
mkdir -p ws/src
workspace中必须先创建src文件夹
编译工作空间
cd ws catkin_make source devel/setup.bash
进入工作空间后使用catkin_make 编译
source可以多使用几次。
创建package
cd src catkin_create_package {pkg_name} rospy roscpp rosmsg cd ../ source devel/setup.bash
编写cpp程序
找到clion所在的文件夹
./clion.sh
使用命令行的方式打开clion,否则在cmakelist可能报错
打开图中的cmakelists,在这两处做修改,否则后续编译会失败
编写节点
#include <iostream> #include <string> #include <ros/ros.h> using namespace std; int main(int argc , char** argv ){ string nodeName = "node_3"; ros::init(argc, argv,nodeName); ros::NodeHandle node; cout<<nodeName<<endl; return 0 ; }
回到workspace下,source一下再编译
cd ws source devel/setup.bash catkin_make
测试一下,测试之前roscore需要启动、
roscore
重开一个命令行,回到ws下
cd ws rosrun {pkg_name} {node name}
-
ROS 主从节点问题
2022-03-24 16:20:27修改节点主要涉及两个文件 ~/.bashrc /etc/hosts 主从关系 树莓派控制的底盘一般作为主机PI 电脑一般作为检测端PC hosts文件修改 主机PI进行操作 告诉机器还有个PC 在哪里 sudo vim /etc/hosts 在最下面添加 `192.... -
Ros学习笔记(三)创建节点及节点之间通信
2021-03-08 19:56:20本节创建两个节点,一个用于发布数据,另一个节点接收该数据。 定位到工作区的src目录下,创建两cpp文件。 example_1a.cpp #include "ros/ros.h" //包含ros节点所需的全部文件 #include "std_msgs/String.h" //用于... -
ROS学习记录3——创建一个节点
2020-03-26 11:48:571.创建一个功能包 首先,创建一个文件夹作为我们的“工作空间”,然后在工作空间内新建一个src文件夹: 接着我们在我们的工作空间的目录下,运行以下代码: catkin_make 然后在工作空间里会出现:build、devel、.... -
ubuntu20.04安装ros并构建ros节点
2022-01-24 14:38:09在Ubuntu20.04中安装ROS Noetic 解决Ubuntu安装ros报错E 这两个链接可以搞定,唯一要注意的是公钥: 设置公钥: sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.... -
ros学习(2-2):ros节点创建(python)
2021-07-20 10:47:24Python创建简单的ROS节点: 用Python实现ROS节点(这里也说明了用Python写ROS功能包也是需要CMakelists.txt的) https://blog.csdn.net/sinat_16643223/article/details/114057998 Python创建ROS节点(使用... -
ROS:关于节点和节点句柄以及命名空间
2021-02-22 19:11:15ROS:关于节点和节点句柄以及命名空间 参考资料:ROS官方文档 首先,我们需要明确的是 节点 和 节点句柄 是不同的。一般而言,一个cpp文件只能启动一个ROS节点,但作为该节点的句柄却可以设置多个。 The ros::... -
ros 创建node节点并编译
2019-11-19 20:41:18在开始第一个ROS(Robot...创建一个工作区(workspace) 工作区可以作为一个独立的项目进行编译,存放ROS程序的源文件、编译文件和执行文件。建立工作区的方法如下: $ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/sr... -
在ROS中使用C++编写节点
2019-03-18 10:57:03使用catkin创建一个工作环境并使用C++写两个节点,实现talker与listener 创建一个工作环境 cd ~ mkdir -p catkin_ws/src cd catkin_ws catkin_make 其中catkin_ws是工作环境目录,src保存源代码 这时候会在工作环境... -
ROS节点
2019-12-28 16:25:22ROS节点介绍 在ROS的世界里,最小的进程单元就是节点(node) 一个软件包里可以有多个可执行文件,可执行文件在运行之后就成了一个进程(process),这个进程在ROS中就叫做节点 从程序角度来说,node就是一个可执行... -
ROS节点的创建与运行
2020-08-17 20:53:50ROS节点的创建与运行 节点发布消息–Publish 新创建功能包 在src里面创建, catkin_create_pkg … 编辑功能包代码 在src/pkg中创建cpp/py文件,打开编辑 代码为古月居课程用的教学代码: /** * 该例程将发布... -
ROS2 (1): 创建工作空间及创建python节点
2022-01-24 11:04:431. 创建工作空间 mkdir -p 02_ros_ws/src 进入terminal,查看文件夹 2. 创建功能包 ros2 pkg create tom --build-type ament_python --dependencies rclpy cd 进入src文件夹后,执行上述命令。其中 ros2 ... -
ROS复习笔记之——创建和运行服务服务器与客户端节点
2021-01-07 00:52:50之前博客《RO发布者S复习笔记之——系统框架及其编程规范》的(发布者节点和订阅者节点的创建和运行)一节中以及介绍如何创建发布者、订阅者、话题消息的通信。本博文继这个博客,来复习一下创建和运行服务服务器与... -
dji_ronin:ROS节点-控制DJI Ronin 3轴云台
2021-05-17 09:19:49控制节点将订阅这些角度,并使用rosservice调用使用Arduino板(将在下面说明)将云台旋转到给定角度。 就我而言,万向架安装在机器人的前部,将传感单元对准不同的方向,我已经有了罗宁,所以我没有购买新的万 -
ros中cpp节点创建
2021-04-10 16:53:091.创建工作空间 mkdir -p ~/test_ws/src cd ~/test_ws/src catkin_init_workspace cd ~/test_ws catkin_make 2.创建功能包 cd ~/tets_ws/src catkin_create_pkg test-cpp roscpp std_msgs 3.在src中创建... -
Qt(五)——在Qt中创建ROS节点
2021-04-27 11:05:06Qt——在Qt中创建ROS节点 1、如何在Qt中发布一个话题 QNode::init 函数中初始化节点 向ROS Master注册节点信息 发布话题 -
ROS-学习0 ROS基础-节点,运行ros节点,话题,服务等基础知识
2021-12-30 14:49:42ros系统是通过各个节点组成的,每个节点相当于一个子程序,各个节点除了各司其职之外还要相互合作,它们通过传递话题消息或者提供服务两种方式来进行通信。那各个节点又不是人,它们不会自来熟,因此需要一个中介帮... -
ros学习(2-1):ros节点创建(msg和srv)(c++)
2021-07-03 10:58:4701 创建节点 1.1 创建发布节点 example_1a.cpp文件创建一个名为example1a的节点,它将在话题/message来发布数据 #include "ros/ros.h" #include "std_msgs/String.h" #include <sstream> int main(int argc, ... -
ROS与Matlab语言入门教程-从Simulink中创建单独的ROS节点
2021-04-21 01:59:51在本例,用户将会配置一个模型为一个单独的ROS节点生成C++代码,将会转换代码到Ubuntu Linux系统,编译ROS节点并运行。预备知识这个例程需要嵌入式编码器;必须要有Ubuntu Linux系统用于编译和运行生成的C++代码,... -
summary1 如何在Python中创建基本的ROS节点[AI]
2022-03-24 02:18:074.创建一个由多个节点组成的ROS包,并对这些节点(在Python中)进行编程,以便使用ROS通信方法彼此通信。 5.浏览Linux文件系统,学习如何在Linux终端中执行各种文件系统操作。 [TERMINAL 1] $ roslaunch turtlebot3... -
ROS 节点开发
2022-03-31 16:36:08初始化ros工作空间,1个工作空间可以有多个ros工程 #!/bin/bash #创建 rwp=$(pwd)/../ad706 mkdir -p ${rwp}/src cd ${rwp}/src catkin_init_workspace ...创建ros工程 #!/bin/bash source /opt/ros/kinetic -
ROS 2 C++成员函数方式创建节点 函数调用
2020-05-04 15:37:43ROS2 的主函数的一般形式如下面的代码所示,实际使用时,当我在类里面创建了一个成员函数的时候,发现无法调用到该函数。 int main(int argc, char **argv) { // RCLCPP_INFO(LOGGER, "Initialize node"); rclcpp:... -
从零创建ROS节点,进行发布节点与订阅节点的交互
2021-05-13 13:17:31全文参考博客:ROS教程(三):创建程序包及节点(图文) ** 1、创建工作空间catkin_ws $ mkdir -p ~/catkin_ws/src $ cd catkin_ws #进入catkin_ws $ catkin_make #初始化工作空间,此时生成build文件与devel文件,... -
ros创建一个节点_从头开始为ROS2创建一个Rust客户端。 第0部分:集成C API创建ROS2节点
2020-07-17 16:09:05ros创建一个节点 ROS2的Rust客户 (Rust Client for ROS2) This is the first article in this series: Rust Client for ROS2 from Scratch. 这是本系列的第一篇文章: Scratch的Rust Client for ROS2 。 背景 ... -
ros必备知识点2:ros中节点句柄的不同用法
2021-10-22 10:39:50代码实现参考: chatter_pub=nh.advertise... ros::init(argc,argv,"ergouzi_colass"); // 基于节点句柄发布不同话题名称的四种方式 // 注意:带有~都会自动加入节点名,否则就直接将()中的名称写在话题前 // 方 -
ROS学习之 cpp节点句柄
2016-07-18 19:33:02wiki链接:...NodeHandles节点句柄 API: http://docs.ros.org/api/roscpp/html/classros_1_1NodeHandle.html 关于节点的启动与关闭,已经在之前的博客中学习记录过了(http://wiki.ros.org/roscpp/ -
如何编写ros服务节点
2019-05-19 11:29:24编写ros服务节点: 观看此教程之前,请确保您已经按照ros编写srv教程编写了srv文件 首先,我们设置并打开相应的路径,使用指令: . ~/catkin_ws/devel/setup.bash roscd beginner_tutorials 然后创建文件,指令: ...