• Ubuntu 16.04 RobotWare 开发环境配置


    RoboWare Studio简介

    RoboWare Studio是一个ROS集成开发环境。它使 ROS开发更加直观、简单、并且易于操作。可进行ROS工作区及包的管理、代码编辑、构建及调试。

    Robotware下载地址: 百度网盘 密码:3iuk

    安装环境准备

    1. 安装环境 Ubuntu 16.04 X86_64
    2. 已完成ROS的安装配置。ROS安装步骤可参照ROS官方网站
    3. 可使用 catkin_make 构建ROS包。若无法构建,可能需要运行:
    sudo apt-get install build-essential
    
    1. 为支持 Python 相关功能,需要安装 pylint
    sudo apt-get install python-pip    
    sudo python -m pip install pylint
    

    如果安装过程中产生错误,可参考: 抚琴弹出情调零的博客
    5. 为支持 clang-format 相关功能,需要安装 clang-format-3.8 或更高版本

    sudo apt-get install clang-format-3.8
    

    安装

    安装软件包

    下载Roboware Studio最新版,在下载的文档下,鼠标右键调出终端输入:

    sudo dpkg -i roboware-studio_<version>_<architecture>.deb
    

    i386为32位版本,amd64为64位版本. 安装过程会弹出 用户协议 可以按 ESC 选择确认!

    启动界面如下

    功能测试

    新建工作区

    选择用户目录下,名称 : catkin_ws

    工作空间

    创建工作空间之后的,窗口如下

    工程类型

    选择Release/Debug

    构建工程

    Ctrl+`调出Terminal, catkin_make构建之后:

    roscore

    测试ros是否正常运行,运行roscore:

    测试正常, Ctrl+c结束即可

    创建一个包

    编辑依赖的ROS包列表

    输入依赖的ROS包, 对应的CMakeLists.txt将生成相应的指令

    创建ROS消息和ROS服务

    ROS消息

    1. 右键包名,新建Msg文件夹

    CMakeLists.txt 自动加入一些运行依赖(如果不用这个IDE必须手动添加)

    编译之后,先运行roscore再测试下msg:

    如果已经将当前工作空间写到了 ~/.bashrc,可以直接在工程编译完后运行,否则还是要先初始化运行环境

    source devel/setup.bash
    

    ROS服务

    创建一个Srv空文件夹

    srv文件分为请求和响应两部分,由'---'分隔。下面是srv的一个样例:

    int64 A
    int64 B
    ---
    int64 Sum
    

    其中 A 和 B 是请求, 而Sum 是响应。

    同样的CMakeLists.txt 自动添加:

    下面通过rossrv show命令,检查ROS是否能够识该服务

    重新编译之后,生成的内容在文件夹下分布如下

    所有在msg路径下的.msg文件都将转换为ROS所支持语言的源代码。

    生成的C++头文件将会放置在如下位置

    ~/catkin_ws/devel/include/ke_package/
    

    Python脚本语言会在如下目录下创建

    ~/catkin_ws/devel/lib/python2.7/distpackages/ke_package/msg 
    

    lisp文件会出现在如下路径

    ~/catkin_ws/devel/share/commonlisp/ros/ke_package/msg/ 
    

    源代码如下
    client.cpp

    #include "ros/ros.h"
    #include <cstdlib>
    #include "ke_package/AddTwoInts.h"
     
    int main(int argc, char **argv)
    {
        ros::init(argc, argv, "add_two_ints_client");
        if (argc != 3)
        {
            ROS_INFO("usage: add_two_ints_client X Y");
            return 1;
        }
        ros::NodeHandle n;
        ros::ServiceClient client = n.serviceClient<ke_package::AddTwoInts>("add_two_ints");
        ke_package::AddTwoInts srv;
        srv.request.a = atoll(argv[1]);
        srv.request.b = atoll(argv[2]);
        if (client.call(srv))
        {
            ROS_INFO("Sum: %ld", (long int)srv.response.sum);
        }
        else
        {
            ROS_ERROR("Failed to call service add_two_ints");
            return 1;
        }
        return 0;
    }
    

    server.cpp

    #include "ros/ros.h"
    #include "ke_package/AddTwoInts.h"
     
    bool add(ke_package::AddTwoInts::Request &req,ke_package::AddTwoInts::Response &res)
    {
        res.sum = req.a + req.b;
        ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
        ROS_INFO("sending back response: [%ld]", (long int)res.sum);
        return true;
    }
    int main(int argc, char **argv)
    {
        ros::init(argc, argv, "add_two_ints_server");
        ros::NodeHandle n;
        ros::ServiceServer service = n.advertiseService("add_two_ints",add);
        ROS_INFO("Ready to add two ints.");
        ros::spin();
        return 0;
    }
    

    编译,运行

    //terminal 1
    rosrun ke_package client
     
    //terminal 2
    rosrun ke_package server
    

    listener.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;
    }
    

    talker.cpp

    #include "sstream"
    #include "ros/ros.h"
    #include "std_msgs/String.h"
     
    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 ros~!" << count;
            msg.data = ss.str();
            ROS_INFO("%s",msg.data.c_str());
            chatter_pub.publish(msg);
            ros::spinOnce();
            loop_rate.sleep();
            ++count;
        }
        return 0;
    }
    

    重新编译,运行

    //terminal 1
    rosrun ke_package talker
     
    //terminal 2
    rosrun ke_package listener
    

    显示效果如下

    Debug调试

    1. 首先设置断点
    1. 选择生成的二进制文件
    1. 选择启动调试

    CMakeLists.txt需要将构建工程类型设置如下

    SET(CMAKE_BUILD_TYPE Debug)
    SET(CMAKE_CXX_FLAGS "-g")
    

    快捷操作

    构建中错误定位

    完成构建选项选择后, 点击配置列表左侧的构建按钮,或选择“ROS” -“构建”即可构建对应版本的 ROS 包。 构建完成后, 资源管理器窗口下方的“ROS 节点”子窗口会显示当前工作区下所有的 ROS 包及节点列表。选择“查看 - 输出”可打开“输出” 窗口,显示构建输出结果。若构建过程中出现错误,按住“CTRL”键并点击错误提示,即可跳转到源代码对应位置

    构建工作区下的一个或多个包

    默认情况下,点击“构建” 按钮会构建当前工作区下的所有包。 如果只想构建其中的一个或多个包, 可右键点击包名, 将其设置为活动状态。 可同时将一个或多个包设置为活动状态。此时, 不被编译的包即称为“非活动包”,在目录列表中将会以删除线标记出来。 点击“构建” 按钮, RoboWare Studio 只会对处于活动状态的包进行构建。

    常见问题

    clang-formate

    clang-formate-3.8安装之后,却不能正常使用

    解决方法,/usr/bin目录下创建快捷方式

    whereis clang-format-3  
    clang-format-3: /usr/bin/clang-format-3.8  
    sudo ln -s /usr/bin/clang-format-3.8 /usr/bin/clang-format  
    

    参考

    1. Roboware Studio教程
    2. roboware实用功能
  • 相关阅读:
    随想13:论“善”字
    Nginx做前端Proxy时TIME_WAIT过多的问题
    HTTP的长连接和短连接
    nginx长连接的问题
    Tomcat性能参数设置
    Nginx1.1.4+ 对后端机器的长连接特性
    HTTP长连接200万尝试及调优方法
    NGINX轻松管理10万长连接 --- 基于2GB内存的CentOS 6.5 x86-64
    CRtmpServer转推流到Nginx Rtmp及SRS(SimpleRtmpServer)的经历
    rtmp流媒体编程相关整理2013(crtmpserver,rtmpdump,x264,faac)
  • 原文地址:https://www.cnblogs.com/flyinggod/p/13836197.html
Copyright © 2020-2023  润新知