ROS-节点-Topic
前言:本部分主要介绍ros一些基础功能的使用,包括创建和编译工作空间、功能包、节点以及话题。
第一种方式:使用roboware studio软件操作
1.1 创建工作空间
回车然后点击保存。
1.2 新建功能包
功能包名为:chapter2_tutorials std_msgs roscpp
注:chapter2_tutorials是功能包名,std_msgs 和roscpp是依赖。
1.3 新建源文件
在chapter2_tutorials包下的src中新建两个.cpp文件,分别命名为example1_a.cpp和example1_b.cpp。
注意新建cpp文件时选择第二项“加入到新的可执行文件中”,这样roboware就会自动修改cmake文件了。
example1_a.cpp的内容:
#include "ros/ros.h" //包含了使用ros节点所有必要的文件 #include "std_msgs/String.h" //包含了要使用的消息类型 #include <sstream> int main(int argc, char *argv[]) { ros::init(argc, argv, "example1_a"); //初始化节点并设置其名称,该名称是唯一的 ros::NodeHandle n; //进程处理程序 ros::Publisher chatter_pub= n.advertise<std_msgs::String>(); //将该节点设置为发布者,话题为message,消息类型为std_msgs::String,缓存1000条信息 ros::Rate loop_rate(); //发送频率为10HZ while (ros::ok()) //判断是否有节点运行 { std_msgs::String msg; //创建消息变量msg std::stringstream ss; //创建一个字符串变量ss ss<< "I am the example1_a node"; //字符串ss的内容 msg.data=ss.str(); //给msg赋值 chatter_pub.publish(msg); //发布者发送消息 ros::spinOnce(); //运行主循环 loop_rate.sleep(); //按照10HZDE频率将程序挂起 } ; }
example1_b.cpp的内容:
#include "ros/ros.h" #include "std_msgs/String.h" void chatterCallback(const std_msgs::String::ConstPtr& msg) //回调函数,当收到消息时调用此函数 { ROS_INFO("I [%s]",msg->data.c_str()); //输出信息,[%s]这里是小写s } int main(int argc, char *argv[]) { /* code for main function */ ros::init(argc, argv, "example1_b"); ros::NodeHandle n; ros::Subscriber sub =n.subscribe(,chatterCallback); //创建一个订阅者,处理信息的回调函数为chatterCallback ros::spin(); ; }
1.4 编译
1.5 运行
ctrl+` 呼出控制台;
添加源
echo "source ~/dev/catkin_ws/devel/setup.bash" >> ~/.bashrcsource devel/setup.bash
注:绿色修改为自己工作空间的位置。这句话也可以在home目录下ctrl+h显示隐藏文件,打开.bashrc,在最后一行找到或添加。
启动节点管理器
roscore
运行节点
rosrun chapter2_tutorials example1_a rosrun chapter2_tutorials example1_b
-----------------------------------------------
输出如下:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
第二种方式:使用命令行编写
2.1 创建和编译工作空间
2.1.1 查看正在使用的工作空间:
echo $ROS_PACKAGE_PATH
-----------------------------------------------
显示如下:
/opt/ros/kinetic/share
2.1.2 创建工作空间文件夹:
mkdir -p ~/dev/catkin_ws/src
-----------------------------------------------
其中:
mkdir是新建文件夹命令,-p是如果没有路径上的文件夹则新建文件夹,~是根目录。
2.1.3 初始化工作空间:
cd ~/dev/catkin_ws/src catkin_init_workspace
-----------------------------------------------
显示如下:
Creating symlink "/home/cdq/dev/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake"
2.1.4 编译工作空间
cd ~/dev/catkin_ws catkin_make
-----------------------------------------------
最后显示如下:
####
#### Running command: "make -j4 -l4" in "/home/cdq/dev/catkin_ws/build"
####
2.1.5 加载setup.bash文件
source devel/setup.bash
2.2 创建和编译功能包
2.2.1 创建新功能包
cd ~/dev/catkin_ws/src catkin_create_pkg chapter2_tutorials std_msgs roscpp
-----------------------------------------------
显示如下:
Created file chapter2_tutorials/CMakeLists.txt
Created file chapter2_tutorials/package.xml
Created folder chapter2_tutorials/include/chapter2_tutorials
Created folder chapter2_tutorials/src
Successfully created files in /home/cdq/dev/catkin_ws/src/chapter2_tutorials. Please adjust the values in package.xml.
-----------------------------------------------
其中:
catkin_create_pkg 是创建新功能包命令,chapter2_tutorials是功能包名称,std_msgs和roscpp是依赖项。
2.2.2 编译功能包
cd ~/dev/catkin_ws/ catkin_make
-----------------------------------------------
最后显示如下:
####
#### Running command: "make -j4 -l4" in "/home/cdq/dev/catkin_ws/build"
####
2.3 创建和编译节点
2.3.1 切换路径
roscd chapter2_tutorials/src
-----------------------------------------------
辨析:roscd和cd
roscd 直接加包名 例:roscd roscpp;
cd 加完整路径 例:cd /opt/ros/kinetic/share/roscpp
2.3.2 创建两个.cpp文件
在上一步的路径上建立(我是手动建立的)两个文件分别命名为example1_a.cpp和example1_b.cpp;
example1_a.cpp的内容:
#include "ros/ros.h" //包含了使用ros节点所有必要的文件 #include "std_msgs/String.h" //包含了要使用的消息类型 #include <sstream> int main(int argc, char *argv[]) { ros::init(argc, argv, "example1_a"); //初始化节点并设置其名称,该名称是唯一的 ros::NodeHandle n; //进程处理程序 ros::Publisher chatter_pub= n.advertise<std_msgs::String>(); //将该节点设置为发布者,话题为message,消息类型为std_msgs::String,缓存1000条信息 ros::Rate loop_rate(); //发送频率为10HZ while (ros::ok()) //判断是否有节点运行 { std_msgs::String msg; //创建消息变量msg std::stringstream ss; //创建一个字符串变量ss ss<< "I am the example1_a node"; //字符串ss的内容 msg.data=ss.str(); //给msg赋值 chatter_pub.publish(msg); //发布者发送消息 ros::spinOnce(); //运行主循环 loop_rate.sleep(); //按照10HZDE频率将程序挂起 } ; }
example1_b.cpp的内容:
#include "ros/ros.h" #include "std_msgs/String.h" void chatterCallback(const std_msgs::String::ConstPtr& msg) //回调函数,当收到消息时调用此函数 { ROS_INFO("I [%s]",msg->data.c_str()); //输出信息,[%s]这里是小写s } int main(int argc, char *argv[]) { /* code for main function */ ros::init(argc, argv, "example1_b"); ros::NodeHandle n; ros::Subscriber sub =n.subscribe(,chatterCallback); //创建一个订阅者,处理信息的回调函数为chatterCallback ros::spin(); ; }
2.3.3 修改CMakeLists.txt文件
打开chapter2_tutorials包下的CMakeLists.txt文件,将以下命令行复制到文件的末尾处:
注:此处有坑,可执行文件的名字(example1_a1 )不能和节点原文件名字(example1_a.cpp)相同,不知道为什么。但节点原文件名字和文件内部的节点名字可以相同。
2.3.4 编译文件
使用catkin_make工具来编译包和全部的节点:
cd ~/dev/vstkin_ws/ catkin_make --pkg chapter2_tutorials
2.4 运行节点
2.4.1 启动节点管理器
roscore
2.4.2 运行节点
rosrun chapter2_tutorials example1_a1 rosrun chapter2_tutorials example1_b1
注:若节点无法运行,每次开启节点前先在 ~/dev/catkin_ws/ 目录下执行命令行:source devel/setup.bash,或者一次性解决 ,输入指令 echo "source ~/dev/catkin_ws/devel/setup.bash" >> ~/.bashrc,红色部分为自己工作空间的名字。
-----------------------------------------------
输出如下:
-END-
最新文章
- iis7 64位 操作excel的一系列问题(未完待续)
- 获取SQLSERVER所有库 所有表 所有列 所有字段信息
- ios设备相关
- sql2008备份集中的数据库备份与现有的xxx数据库不同解决方法
- 在ubuntu上面安装phpmyadmin后,报404错误
- iOS - UIDevice
- TWaver3D入门探索——3D拓扑图之人在江湖
- Java利用正则表达式统计某个字符串出现的次数
- php内存申请和销毁
- Android开源项目整理:个性化空间View篇(看遍论坛千万篇,不看此篇也枉然)
- 5th day
- caffe服务器搭建血泪记录
- numpy(一)
- js判断一个字符串是否是回文字符串
- Java_监听文件夹或者文件是否有变动
- appnium启动报错Encountered internal error running command: Error: Error occured while starting App. Original error: Permission to start activity denied.
- T-SQL基础(六)之可编程对象
- django rest framework 项目创建
- Luogu P3966 [TJOI2013]单词
- 设计模式C++学习笔记之九(Template Method模板方法模式)
热门文章
- linux虚拟主机的三种方法
- 3.git高级篇总结
- 36.分组聚合操作—bucket进行多层嵌套
- 《hello-world》第八次团队作业:Alpha冲刺-Scrum Meeting 5
- java 常见问题
- 【Codeforces 522A】Reposts
- 清北学堂模拟赛d2t1 一道图论神题(god)
- RDS for MySQL查询缓存 (Query Cache) 的设置和使用
- spring mvc源码-》MultipartReques类-》主要是对文件上传进行的处理,在上传文件时,编码格式为enctype=";multipart/form-data";格式,以二进制形式提交数据,提交方式为post方式。
- 3.0 - remote access 基础知识