ROS入门实操

1 工作空间

目录结构

  • src:代码空间(Source Space)存放工程文件的文件夹。
  • build:编译空间(Build Space)编译产生的中间文件(很少打开)。
  • devel:开发空间(Development Space)编译完成的可执行文件和链接、环境配置的脚本。

创建工作空间

#创建工作空间
mkrdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace

#编译工作空间
cd ~/catkin_ws
catkin_make

#设置环境变量
sudo vim ~/.zshrc
source ~/catkin_ws/devel/setup.zsh
source ~/.zshrc

#检查环境变量
echo $ROS_PACKAGE_PATH

#查看所有的变量
env | grep ros

创建功能包

#创建功能包
cd ~/catkin_ws/src
catkin_create_pkg myPackName std_msgs rospy roscpp

#编译功能包
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
  • CMakeLists.txt:编译功能包的编译选项
  • package.xml:管理功能包信息的文件(包括依赖等信息)

ROS通信编程

话题编程

  • 创建发布者talker.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc,char **argv)
{
    //ROS节点初始化
    ros::init(argc,argv,"talker");  
    //创建节点句柄 
    ros::NodeHandle n;            

    //创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String,缓存空间1000
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);

    //设置循环的频率10Hz
    ros::Rate loop_rate(10);

    int count = 0;
    while (ros::ok())   //监测但前节点是否正常运行
    {
        //初始化消息
        std_msgs::String msg;
        std::stringstream ss;
        ss << "hello ros" << count;
        msg.data = ss.str();

        //终端打印变量       
        ROS_INFO("I publish a message: %s",msg.data.c_str());

         //发布消息
        chatter_pub.publish(msg);

        //循环等待回调函数
        ros::spinOnce();

        //按照巡回频率延时
        loop_rate.sleep();
        ++count;
    }
    
    return 0;
}
  • 创建订阅者listener.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"

//受到订阅的消息后,会进入消息回调函数
void chatterCallBack(const std_msgs::String::ConstPtr& msg)
{
    //将收到的消息打印出来
    ROS_INFO("I hear a message: %s",msg->data.c_str());
}

int main(int argc,char **argv)
{
    //初始化ros节点
    ros::init(argc,argv,"listener");

    //创建节点句柄
    ros::NodeHandle n;

    //创建一个订阅者,订阅名为chatter的topic,消息类型为std_msgs::String,缓存空间1000,回调函数为chatterCallBack
    ros::Subscriber sub = n.subscribe("chatter",1000,chatterCallBack);

    //循环并等待回调函数
    ros::spin();

    return 0;
}
  • 添加编译配置文件CMake_Lists.txt
include_directories(include ${catkin_INCLUDE_DIRS})   #包含ROS路径的依赖(ros的头文件)
add_executable(talker src/talker.cpp)                 #可执行文件名 文件目录
target_link_libraries(talker ${catkin_LIBRARIES})     #把库文件链接到可执行文件中

add_executable(listener src/listener.cpp)                 #可执行文件名 文件目录
target_link_libraries(listener ${catkin_LIBRARIES})     #把库文件链接到可执行文件中

自定义话题消息

  • 在包下面创建一个msg文件加,再在文件夹里创建一个.msg文件,我这里创建了student.msg
string name
bool sex
Float32 height

bool male = true
bool female = false
  • 在包管理文件package.xml中添加依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<!-- 部分ROS版本中exec_depend需改成run_depend -->
  • 修改编译配置文件CMake_Lists.txt
#添加功能包
find_package(catkin REQUIRED COMPONENTS
	...
	message_generation	
)

#添加具体依赖
catkin_package(
	CATKIN_DEPENDS roscpp rospy std_msgs message_runtime	
)

#添加具体msg文件
add_message_files(FILES student.msg)		
generate_messages(DEPENDENCIES std_msgs)

ROS入门实操

上一篇:关于使用git仓库的操作


下一篇:P3915 树的分解