ROS基本操作(一):发布与订阅
ROS官网教程文章目录1 创建ROS工作空间2 创建ROS软件包3 一个发布/订阅示例4 构建节点5 运行示例1 创建ROS工作空间创建ROS工作空间:$ mkdir -p ~/your_dir/src$ cd ~/your_dir/$ catkin_make创建成功:$ /work/ros$ ls -a...build.catkin_workspacedevelsrc将当前工作空间设置在环境的最
·
1 创建ROS工作空间
- 创建ROS工作空间:
$ mkdir -p ~/your_dir/src
$ cd ~/your_dir/
$ catkin_make
创建成功:
$ /work/ros$ ls -a
. .. build .catkin_workspace devel src
- 将当前工作空间设置在环境的最顶层:
echo "source /home/you/your_dir/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
查看ROS_PACKAGE_PATH
环境变量是否包含你当前的工作空间目录:
echo $ROS_PACKAGE_PATH
显示如下,路径用:
隔开
/home/you/your_dir/src:/opt/ros/melodic/share
2 创建ROS软件包
- 创建ROS软件包
命令:catkin_create_pkg <package_name> [depend1] [depend2] [depend3]...
#切换至工作空间中的源文件空间目录
cd /home/you/your_dir/src
#创建软件包
catkin_create_pkg pub_sub_eg roscpp std_msgs
- 正确的目录结构如下:
your_dir/ -- 工作空间
build/
.catkin_workspace
devel/
src/ -- 源文件空间
CMakeLists.txt -- catkin自动创建的CMake 文件
pub_sub_eg/ -- 软件包
CMakeLists.txt -- pub_sub_eg的CMakeLists.txt
package.xml -- pub_sub_eg的文件、依赖清单
...
其他包/
CMakeLists.txt
package.xml
3 一个发布/订阅示例
- 发布者
//pub_eg.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
- 订阅
//sub_eg.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, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
- 修改CMakeLists
将以下内容添加到/home/you/your_dir/src/pub_sub_eg/CMakeLists.txt
文件的最后
add_executable(talker src/pub_eg.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_executable(listener src/sub_eg.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
4 构建节点
- 指令:
cd /home/you/your_dir
catkin_make
- 成功:
如下图所示,并在/home/you/your_dir/devel/lib/pub_sub_eg
目录下生成两个可执行文件listener
、talker
5 运行示例
- 运行roscore
新开终端,执行roscore
,成功界面如下图,不是卡住了,这个终端被它占用了
- 运行发布者(talker)节点
命令:rosrun <package_name> <node_name>
:~$ rosrun pub_sub_eg talker
[ INFO] [1632380887.305613762]: hello world 0
[ INFO] [1632380887.406156027]: hello world 1
[ INFO] [1632380887.506550027]: hello world 2
[ INFO] [1632380887.605821851]: hello world 3
[ INFO] [1632380887.705849630]: hello world 4
[ INFO] [1632380887.806313501]: hello world 5
[ INFO] [1632380887.906271487]: hello world 6
[ INFO] [1632380888.006119049]: hello world 7
- 运行订阅者(listener)节点
:~$ rosrun pub_sub_eg listener
[ INFO] [1632381058.295723795]: I heard: [hello world 3]
[ INFO] [1632381058.395464944]: I heard: [hello world 4]
[ INFO] [1632381058.494946567]: I heard: [hello world 5]
[ INFO] [1632381058.595786883]: I heard: [hello world 6]
[ INFO] [1632381058.695049193]: I heard: [hello world 7]
更多推荐
已为社区贡献2条内容
所有评论(0)