ROS官网教程

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目录下生成两个可执行文件listenertalker
    在这里插入图片描述

5 运行示例

  • 运行roscore
    新开终端,执行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]
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐