• [ros][ubuntu]ros在ubuntu18.04上工作空间创建和发布一个话题


    构建catkin工作空间

     mkdir -p ~/catkin_ws/src  

     cd ~/catkin_ws/src

     catkin_init_workspace

     cd ~/catkin_ws/

     catkin_make

    配置环境变量

     echo "source ~/catkin_ws/devel/setup.bash" >>  ~/.bashrc
     source ~/.bashrc

    检查环境变量

     echo $ROS_PACKAGE_PATH

    遇到错误:上面操作不需要用sudo 进行操作,但是由于初学者可能存在操作不当导致错误

    ros catkin_maked的时候报错误代码: 
    The specified base path “/home/ubuntu/catkin_ws” contains a CMakeLists.txt but “catkin_make” must be invoked in the root of workspace…..

    出现这种情况的原因是catkin_init_workspacce的时候,出现下面这句: 
    Creating symlink “/home/ubuntu/catkin_ws/CMakeLists.txt” pointing to “/opt/ros/indigo/share/catkin/cmake/toplevel.cmake”

    将当前工作空间下的CMakeLists.txt与/ros/下的cmake做了链接

    解决方法: 
    unlink /home/youpath/catkin_ws/CMakeLists.txt 

    发布一个话题案例:

    创建功能包

    1. cd ~/catkin_ws/src
    2. catkin_create_pkg package1 roscpp rospy std_msgs

    使用命令cd ~/catkin_ws/src 进入代码空间,并在代码空间中创建功能包

    使用catkin_create_pkg创建名为package1的功能包,功能包的支撑库为roscpp rospy和std_msgs,创建功能包的命令格式为catkin_create_pkg [depends1] [depends2] [depends3]。此时~/catkin_ws/src路径下会出现两个文件,一个是CMakeLists.txt另外一个则是我们的功能包package,在package路径下会出现4个文件,分别是include文件夹(用于存放类似于.h的头文件),src文件夹(用于存放cpp文件),CMakeLists.txt(指定编译的规则),package.xml(支持包的相关信息,如果后续文件需要扩展就在此文件中增加相关的库),到此功能包已经创建完毕,后续还需要修改CMakeLists.txt更新我们的编译规则,但在此之前我们需要新建一个cpp源码。

    1. cd ~/catkin_ws/src/package1/src
    2. touch pub_node_test.cpp

    进入~/catkin_ws/src/package1/src文件夹,使用touch命令创建一个cpp文件,在cpp文件中输入以下内容。

    1. #include "ros/ros.h"
    2. #include "std_msgs/String.h"
    3. #include <sstream>
    4. int main(int argc,char **argv)
    5. {
    6. ros::init(argc,argv,"talker"); //初始化
    7. ros::NodeHandle n; //创建句柄
    8. ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000); //设定话题名称为chatter,并且缓存队列长度为1000,用于平衡硬件发送速度
    9. ros::Rate loop_rate(10); //设置发送波特率为10HZ,与后面的loop_rate.sleep();相互呼应,如果下一帧信息不满足频率要求系统则会延时
    10. int count = 0;
    11. while(ros::ok())
    12. {
    13. std_msgs::String msg;
    14. std::stringstream ss;
    15. ss<<"first example!"<<count;
    16. msg.data = ss.str();
    17. ROS_INFO("%s",msg.data.c_str());
    18. chatter_pub.publish(msg);
    19. ros::spinOnce();
    20. loop_rate.sleep();
    21. ++count;
    22. }
    23. return 0;
    24. }

    以上代码创建了一个名为talker的节点,该节点通过"chatter"话题发布消息

    然后修改package1功能包中的CMakeList.txt文件.打开CMakeLists.txt文件并在里面输入以下内容。

    1. add_executable(pub_node src/pub_node_test.cpp)
    2. target_link_libraries(pub_node ${catkin_LIBRARIES})

    这样就可以在devel/lib文件夹下生成名为pub_node的可执行文件了,这两条编译码的一般格式如下:add_executable([可执行文件名] src/[cpp文件名]) target_link_libraries([可执行文件名] ${catkin_LIBRARIES})

    回到工作空间下并使用catkin_make编译整个工作空间

    1. cd ~/catkin_ws
    2. catkin_make

    打开一个新终端,使用如下命令即可运行刚编译生成的可执行文件

    rosrun package1 pub_node

    显示界面如下:

    工作空间及消息创建成功!使用rostopic list可以看到会出现一个新的名为chatter的话题。

  • 相关阅读:
    智能指针简介
    蓝牙学习六(GATT)
    JavaWeb开发06-原理-Spring配置优先级-Bean管理-SpringBoot原理-Maven继承和聚合-私服
    最优化基础(一)
    Haproxy 服务
    Python百日进阶-WEB开发】Day152 - 前端基础 之 JQuery(一)
    超越内存限制:深入探索内存池的工作原理与实现
    【Java设计模式 规范与重构】 一 重构的目的、内容、时机、方法
    Django多表查询
    android8.1中用libtinyalsa编写sound-hal驱动
  • 原文地址:https://blog.csdn.net/FL1623863129/article/details/132596556