ros学习

南楼画角 提交于 2019-12-11 10:45:25

ros第一天

教材《ROS机器人开发实践》-胡春旭
CTRL+alt+T打开终端 rm -r learning_com删除目录文件夹
第三章ros基础
一、创建并配置工作空间(workspace)
  1、创建工作空间
    mkdir -p ~/catkin_ws/src  
 #在home目录下创建两级目录,先创建catkin目录,再创建src目录,必须使用-p选项
    cd ~/catkin_ws/src     #切换到src目录
    catkin_init_workspace    #初始化工作空间
  2、编译工作空间,此时工作空间为空,经过编译会生成很多文件,严格来说是迁移来很多文件
    cd ~/catkin_ws/
    catkin_make   #catkin自己的编译命令
  3、初始化环境变量,使环境变量生效
    source devel/setup.bash #其实就是运行编译生成的devel目录下的setup.bash文件
  4、验证环境变量是否有效
    echo ROSPACKAGEPATH sourcemachine: /catkinwsROS_PACKAGE_PATH   注:此时source只在当前终端有效,若想环境变量所有终端都有效需要改环境变量设置: -machine:~/catkin_ws gedit ~/.bashrc 增加:source ~/catkin_ws/devel/setup.bash
输入source ~/.bashrc 让配置生效
#打印当前工作空间的路径,结果如下:,包括刚刚创建的工作空间的目录就对了,否则,要好好找找原因了。
municationk@developk:~/catkin_ws$
echo $ROS_PACKAGE_PATH/home/municationk/catkin_ws/src:/opt/ros/melodic/share
  二、在工作空间创建功能包,ROS系统的实现主要靠功能包实现各个功能,功能包中包含了许多文件和配置信息及编译信息等,现在较新版本的ROS默认使用catkin编译系统,该编译系统对功能包要求比较特殊,所以需要特殊的方式创建。
  1、创建功能包,应用catkin_create_pkg命令
    cd ~/catkin_ws/src   #切换到代码空间,也就是工作空间的src目录
    catkin_create_pkg learning_com std_msgs rospy roscpp #创建功能包,并指定有三个功能包依赖
  2、再次编译工作空间,并设置环境变量
    cd ~/catkin_ws/
    catkin_make    #编译
    source devel/setup.bash  #设置环境变量
3.工作空间覆盖:不同的工作空间会有同名的工作包,
  三、在工作空间创建功能包,实现一个简单的发布、订阅程序:主要是添加两个cpp源码talker.cpp和listener.cpp,修改一个编译配置文件CMakeList.txt,修改一个功能包配置文件package.xml文件
  1、talker.cpp在工作空间的代码空间的功能包的代码空间中,本文中为:~/catkin_ws/src/learning_com/src/目录中,内容
#include
#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
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类型的消息
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;
}
  2、listener.cpp在工作空间的代码空间的功能包的代码空间中,本文中为:~/catkin_ws/src/learning_com/src/目录中,内容
#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节点
ros::init(argc, argv, “listener”);
// 创建节点句柄
ros::NodeHandle n;
// 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback
ros::Subscriber sub = n.subscribe(“chatter”, 1000, chatterCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
3、CMakeList.txt在工作空间的代码空间的功能包的代码空间中,本文中为:~/catkin_ws/src/learning_com/目录中,内容
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
4、package.xml在工作空间的代码空间的功能包的代码空间中,本文中为:~/catkin_ws/src/learning_com/目录中,内容
主要是上面 learning_com是我自己的一个包,一定要在package.xml中 <build_depend> 里面加上
  5、编译功能包,并设置环境变量
    cd ~/catkin_ws/
    catkin_make     #编译
    source devel/setup.bash     #设置环境变量
此时在~/catkin_ws/devel/lib/目录下对应功能包中有可执行文件了 
测试,打开三个终端,在第一终端输入:roscore,第二个终端输入:rosrun learning_com talker 第三个终端输入:rosrun learning_com listener
第二个终端中使用ctrl+c将程序中talker的publisher退出:第三个终端中的lisenter的subscriber也无法接受数据:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!