ROS学习笔记(一)

参考链接

  1. ROS wiki-学习ROS的最好资料
  2. ROS 简介
  3. ROS学习笔记

简介

ROS是一种基于匿名发布/订阅机制的中间件,允许不同ROS进程之间的消息传递。
在任何ROS 2系统的核心是ROS图。ROS图是指ROS系统中的节点网络和它们之间的连接。

使用

一.新建工作环境

#先切回主目录
cd ~/

#新建工作空间文件夹
mkdir catkin_mm

#在catkin_mm目录下新建src文件夹
cd catkin_mm
mkdir src

#初始化src目录,生成的CMakeLists.txt为功能包编译配置
cd src
catkin_init_workspace

#切回catkin_mm目录,对该工作空间执行一次编译
cd ~/catkin_mm
catkin_make

#环境变量配置,使新建的catkin_mm工作空间可用
source devel/setup.bash
#在catkin_mm/src/下创建取名为beginner_tutorials的功能包,
cd ~/catkin_mm/src/
catkin_create_pkg beginner_tutorials

#切换到beginner_tutorials目录
#新建src文件夹
roscd beginner_tutorials
mkdir -p src

二.发布、订阅

首先在catkin_mm工作空间中src目录下新建一个功能包:
vscode中右键catkin_mm的src,选择“create catkin package”
输入packagename(不能有大写字母);
输入依赖(空格隔开即可)

geometry_msgs roscpp rospy std_msgs

然后就可以在新建的test2包的src文件下创建编辑你的源代码了

创建发布节点

test2的src右击创建发布者节点的代码文件:pub.cpp
在文件中开始编辑代码

  1. 包含头文件
#include <ros/ros.h>
#include <std_msgs/String.h>	//发布的消息类型,此处让它简单的发送字符串消息

using namespace std;	//命名空间

  1. (全局)创建必要的发布者对象,起名为pub_str。
ros::Publisher pub_str;
  1. (全局)创建数据对象,起名data_str
std_msgs::String data_str;
  1. 主函数
int main(int argc,char** argv){
	
	ros::init(argc,argv,"pub");	//ros初始化,参数分别为:形参argc、形参argv、文件名(无后缀)
	ros::NodeHandle nh;	//节点控制器,名称都默认给它起nh

	pub_str = nh.advertise<std_msgs::String>("test2/str",10);	//发布一个空间为10的队列形式的话题(然后就可以有订阅者订阅这个话题看有没有消息)
	data_str.data="Hello,world!";//这个节点要发送的一个消息。

	pub_str.publish(data_str);//然后就可以把消息发布到话题里了

    return 0;
}

但是由于以上代码执行起来的效果是:
发布者pub_st开始运行main函数,根据指令创建一个话题,发布一条消息,好了,return 0;,干完活睡觉了。
也就是说,话题、消息的存在与否决定于发布者。虽然它已经发布话题发送消息了,但是别的订阅者还没来得及看,话题就被关闭了。所以我们修改一下main函数:

int main(int argc,char** argv){


    ros::init(argc,argv,"pub");
    ros::NodeHandle nh;

    ros::Rate wait(1);//设置停顿时间,单位是HZ。

    pub_str=nh.advertise<std_msgs::String>("test2/str",10);
    data_str.data = "Hello,world!";
    while(1)//让他一直发,好让订阅者收到消息。
    {
        pub_str.publish(data_str);
        wait.sleep();
    }
    

    return 0;
}
  1. 然后ctrl+s保存,并到对应目录下的CMakeLists.txt中修改一些配置:
    (1)在大概135行左右的地方有如下的一段注释(添加可执行文件):
## 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/test2_node.cpp)

按照如上格式添加不带“#”的一行(每一个节点cpp文件写好后都要来这边单独为它加一行):

add_executable(pub src/pub.cpp)

(2)在大概150左右的地方有如下的一段注释

## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
#   ${catkin_LIBRARIES}
# )

按照这个格式复制后面三行去掉“#”修改相应的参数(每一个cpp都要加一行)

target_link_libraries(pub
   ${catkin_LIBRARIES}
 )

然后记得保存,一个发布节点的基础代码配置就好了。

运行发布者查看话题

打开终端ctrl+Alt+T:

  1. 运行roscore
roscore
  1. 再打开一个新终端编译节点文件
cd catkin_mm
catkin_make
  1. 新终端,source一下:
source ~/catkin_mm/devel/setup.zsh

运行节点文件

rosrun test2 pub  

然后这个终端的作用就是一直在运行节点文件了

  1. 查看话题(再找个新终端)
rostopic list

可以找到刚刚创建的话题:test2/str
查看消息:

rostopic echo /test2/str 

就能看到它一直在:data:“Hello,world!”

于是乎一个发布者就这样创建好了。

创建订阅者节点

  1. 在与发布者节点cpp同级目录中新建cpp文件,命名为sub.cpp(吧)。
  2. 代码:
#include <ros/ros.h>
#include <std_msgs/String.h>

using namespace std;

ros::Subscriber sub_str;//订阅者对象

//这个是订阅者收到消息后要拿着这个接收到的信息要做什么的函数,一定要返回void,且参数有要求
void Func(const std_msgs::String::ConstPtr &msg){
    cout<<"I find you:"<<msg->data<<endl;//这个简陋的订阅者只会把它接收到的消息输出
}

int main(int argc,char** argv){

    ros::init(argc,argv,"sub");
    ros::NodeHandle nh;
    ros::Rate wait(1);//每秒钟查看两次话题看有没有消息

    sub_str=nh.subscribe("test2/str",10,Func);//设置订阅的话题,和收到消息后执行的Func函数
    
    while(1){
        ros::spinOnce();//这个意思是查看一次话题,不管有没有新消息都不再看第二次。ros::spin()则是一直盯着话题直到拿到了新消息。
        wait.sleep();
    }


    return 0;
}

保存

  1. 配置cmake文件如上(两处添加)
    注:pub/sub都是自己给cpp文件起的名字
add_executable(sub src/sub.cpp)

target_link_libraries(sub
  ${catkin_LIBRARIES}
)

保存

  1. 编译
cd catkin_mm
catkin_make

执行订阅者节点

当然,rescore、发布者都要运行起来。

  1. 新终端,先source(如果没配置则每打开一个终端都要source一下)
    source ~/catkin_mm/devel/setup.zsh
  2. 运行
rosrun test2 sub

就会发现它会每秒一个:I find you!Hello
world!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值