ROS机器人---创建编译并运行完整的ros helloword工程(c++版)

注意

  系统:Ubuntu16.04 LST
  ros版本:kinetic

一、创建工作空间

在home目录下创建名称为ros_test_ws 的工作空间

mkdir -p ros_test_ws/src  #新建ros_test_ws/src 目录

cd ros_test_ws/src

catkin_init_workspace

cd ..               #退到 ros_test_ws 路径下

catkin_make         #编译

source devel/setup.bash   #配置暂时的环境变量  

echo $ROS_PACKAGE_PATH  # 查看刚刚配置的环境变量是否生效

ros package 路径包含有刚刚创建的工作空间目录
在这里插入图片描述

二、创建软件包(project)

创建名称为 my_ros_helloworld_cpluse 的软件包

cd catkin_ws/src  # 进入工作空间下的 src 目录  (注意路径!!!)

catkin_create_pkg my_ros_helloworld_cpluse std_msgs rospy roscpp

cd ..             #退到 catkin_ws 工作空间路径下

catkin_make       #编译软件包

三、使用CLion IDE 软件开发 (本工程可以不需要)

使用CLion IDE 便于后续的大型开发

3.1 打开工程

在这里插入图片描述
忽略如下错误 (编译是需要进入 ros_test_ws/src目录下进行 catkin_make 编译的)
在这里插入图片描述

3.2 编写talker.cpp 创建消息发布器节点 (发布话题)

创建src/talker.cpp 文件

#include <iostream>
#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>

using namespace std;

int main( int argc, char** argv )
{
    // 创建节点
    ros::init(argc, argv, "talker_node");
    ros::NodeHandle n;

    // 发布话题
    ros::Publisher talkerPub = n.advertise<std_msgs::String>("chatter", 10);

    // 设置发送频率
    ros::Rate loop_rate(10);

    int count = 0;
    while(ros::ok())
    {

        std_msgs::String msg;

        std::stringstream ss;
        ss << "hello world" <<count; // 将“hello world” 和 count 一起输出到 string流中

        msg.data = ss.str(); // String 转为 str 作为消息体的数据

        ROS_INFO("%s", msg.data.c_str());

        talkerPub.publish(msg);

        ros::spinOnce();

        loop_rate.sleep();

        count ++;
    }

    return 0;
}

3.3 编写listener.cpp 创建消息接收器节点 (订阅话题)

创建src/listener.cpp 文件

#include <iostream>
#include <ros/ros.h>
#include <std_msgs/String.h>

using namespace std;
// 定义回调函数
void listener_callback(const std_msgs::String::ConstPtr& msg)
{
    ROS_INFO("I heard : [%s]" , msg->data.c_str()); // String 转为 str字符串
}

int main( int argc, char** argv)
{
    // 创建节点
    ros::init(argc, argv, "listener_node");
    ros::NodeHandle n;

    // 订阅话题 以及指定该话题的回调函数
    ros::Subscriber listenerSub = n.subscribe("chatter", 10,listener_callback);

    ros::spin();

    return 0;
}

3.4 编写CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(my_ros_helloworld_cpluse)

## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)


## Declare a catkin package
catkin_package()

## 编译 talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})


add_executable(listener
        src/listener.cpp
        )
target_link_libraries(listener ${catkin_LIBRARIES})


add_executable(talker
        src/talker.cpp
        )
target_link_libraries(talker ${catkin_LIBRARIES})

3.5 编译

在ros_test_ws 目录下 运行 catkin_make 命令编译,生成可执行文件 talker 以及 listener
在这里插入图片描述

四、运行此工程

注意:用echo $ROS_PACKAGE_PATH 查看此工作空间是否在环境变量中
若没有则运行此命令 source ~/ros_test_ws/devel/setup.bash 也可以通过 直接将此命令写入 home目录下的 .bashrc文件中,这样就不需要每次都source ~/ros_test_ws/devel/setup.bash 。因为每打开一个新的终端,都会先加载 .bashrc文件。

确保环境变量加载正确,否则rosrun 找不到 软件包 !!!
开三个终端,分别运行如下命令:

4.1 运行 ros master

先运行命令 roscore

4.2 运行 talker

source ros_test_ws/devel/setup.bash
rosrun my_ros_helloworld_cpluse talker
在这里插入图片描述

4.3 运行 listener

source ros_test_ws/devel/setup.bash
rosrun my_ros_helloworld_cpluse listener

在这里插入图片描述

发布了26 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/CGJustDoIT/article/details/96977742