精华内容
下载资源
问答
  • ROS自定义msg类型及使用

    万次阅读 多人点赞 2017-06-07 20:09:09
    一、创建msg消息参考: CreatingMsgAndSrv 首先创建一个空的package单独存放msg类型(当然也可以在任意的package中自定义msg类型) 这里为便于说明,建立一个名为test_msgs的包,用于对自定义msg类型的用法举例 $ ...

    一、创建msg消息

    参考:
    CreatingMsgAndSrv

    首先创建一个空的package单独存放msg类型(当然也可以在任意的package中自定义msg类型)
    这里为便于说明,建立一个名为test_msgs的包,用于对自定义msg类型的用法举例

    $ cd catkin_ws/src
    $ catkin_create_pkg test_msgs

    1.新建msg文件

    然后在test_msgs中创建msg文件夹,在msg文件夹其中新建一个名为Test.msg消息类型文件

    $ cd test_msgs
    $ mkdir msg

    Test.msg的内容如下,
    基本类型可参考: std_msgscommon_msgs

    float32[] data
    float32 vel
    geometry_msgs/Pose pose
    string name

    2.修改package.xml

    接下来需要message_generation生成C++或Python能使用的代码,需要message_runtime提供运行时的支持,所以package.xml中添加以下两句

    <build_depend>message_generation</build_depend>
    <run_depend>message_runtime</run_depend>

    3.修改CMakeLists.txt

    CMakeLists.txt要注意四个地方

    (1)首先调用find_package查找依赖的包,必备的有roscpp rospy message_generation,其他根据具体类型添加,比如上面的msg文件中用到了geometry_msgs/Pose pose类型,那么必须查找geometry_msgs

    find_package(catkin REQUIRED COMPONENTS roscpp rospy message_generation std_msgs geometry_msgs)

    (2)然后是add_message_files,指定msg文件

    add_message_files(
      FILES
      Test.msg
      # Message2.msg
    )

    (3)然后是generate_messages,指定生成消息文件时的依赖项,比如上面嵌套了其他消息类型geometry_msgs,那么必须注明

    #generate_messages必须在catkin_package前面
    generate_messages(
     DEPENDENCIES
     geometry_msgs
    )

    (4)然后是catkin_package设置运行依赖

    catkin_package(
    
    CATKIN_DEPENDS message_runtime
    
    )

    到这里新的msg类型test_msgs/Test就可以使用了,下面编译这个包,然后利用rosmsg show指令查看

    $ cd catkin_ws
    $ catkin_make
    $ rosmsg show test_msgs/Test 
    float32[] data
    float32 vel
    geometry_msgs/Pose pose
      geometry_msgs/Point position
        float64 x
        float64 y
        float64 z
      geometry_msgs/Quaternion orientation
        float64 x
        float64 y
        float64 z
        float64 w
    string name

    二、msg的使用

    要使用自定义的消息类型必须source自定义消息所在的工作空间,否则rosmsg show test_msgs/Testrostopic echo /test_msg(/test_msg是节点中使用自定义消息类型test_msgs/Test的topic)都会报错,因为没有source的情况下自定义消息类型是不可见的,被认为是未定义类型

    一种典型的错误是删掉工作空间下的develbuild文件夹之后重新编译代码,此时由于没有source自定义消息所在的工作空间,即使使用自定义消息的代码和自定义消息在同一个包也无法找到,该消息头文件,此时需要运行source devel/setup.bash之后重新编译就好

    1.其他包调用自定义msg类型

    参考:
    DefiningCustomMessages
    如果是在test_msgs包内的节点中调用test_msgs/Test类型,只需要在.cpp文件中如下调用即可

    #include <test_msgs/Test.h>
    
    test_msgs::Test msg;

    如果是在其他包调用test_msgs/Test类型则需要修改package.xml和CMakeLists.txt,比如同样在工作空间catkin_ws内有一个名为test的包,我们可以在这个包内写一个节点,使用我们刚才自定义的消息类型test_msgs/Test,如下:

    (1)修改package.xml
    养成好习惯,维护软件包清单的更新,以便于别人使用你的软件前安装各种依赖项,当然这个文件不影响程序编译

    <build_depend>roscpp</build_depend>
    <run_depend>roscpp</run_depend>
    
    <build_depend>test_msgs</build_depend>
    <run_depend>test_msgs</run_depend>

    (2)修改CMakeLists.txt
    调用自定义消息类型主要修改两个地方,以下是重点
    一是find_package中需要声明查找包含该消息类型的包;
    二是add_dependencies要注明该消息的依赖,其他地方和普通节点一样

    find_package(catkin REQUIRED COMPONENTS
      roscpp
      geometry_msgs
      test_msgs
    )
    
    add_dependencies(test1 test_msgs_gencpp)#调用同一工作空间的自定义消息类型时注明依赖关系,防止发生头文件找不到的报错

    如果缺少add_dependencies中对test_msgs_gencpp的依赖声明,在编译的时候如果先编译test包再编译test_msgs包则会出现如下报错(ROS工作空间各个软件包的编译顺序是随机的),因为头文件test_msgs/Test.h还未生成

    fatal error: test_msgs/Test.h: 没有那个文件或目录
     #include "test_msgs/Test.h"

    2.msg类型数组的使用

    需要说明的是std_msgs中有些数组用法和C++标准库中不一样
    比如Float32MultiArray,其定义如下:

    std_msgs/MultiArrayLayout layout
    float32[] data

    其中data是一个浮点数组,但是方括号只是一个用来表明它是数组的符号,我们不能在定义的时候在方括号中给定数组长度,实际上ROS中类似float32[]int8[]这样的数组类型都是std::vector,使用方法也和std::vector一样

    测试代码可以从这里下载
    下面是一个消息订阅节点,用于测试

    /************************  
     * @Author: Jinglin Zhang  
     * @DateTime: 2017-06-07 19:57:30  
     * @Description: 节点test1,订阅了test_msgs包下talker节点发布的"test_msg"话题,用于测试test_msgs::Test消息类型  
    ************************/
    #include <ros/ros.h>
    #include <test_msgs/Test.h>
    
    void msgCallback(const test_msgs::Test::ConstPtr &msg)
    {
      //test_msgs::Test类型里的float32[]数据传到vector
      std::vector<float> array = msg->data;
    
      std::cout << "msg->data[0]=" << msg->data[0] << std::endl;
      std::cout << "msg->data.size=" << msg->data.size() << std::endl;
      std::cout << "msg->data=" << msg->data[0] << ", " << msg->data[1] <<  ", " << msg->data[2] << ", " <<  msg->data[3] << ", " <<  msg->data[4] << ", " <<  msg->data[5] << std::endl;
    
    }
    
    int main(int argc,char ** argv)
    {
      ros::init(argc,argv,"test1");
      ros::NodeHandle n;
    
      ros::Subscriber msg_sub = n.subscribe("test_msg", 100, msgCallback);
    
      ros::spin();
      return 0;
    }

    下面是一个消息发布节点,用于测试

    /************************  
     * @Author: Jinglin Zhang  
     * @DateTime: 2017-06-07 20:03:35  
     * @Description: 节点talker,发布"test_msg"话题,用于测试test_msgs::Test消息类型  
    ************************/ 
    #include <ros/ros.h>
    #include <test_msgs/Test.h>
    
    int main(int argc, char **argv)
    {
      ros::init(argc, argv, "msg_talker");
      ros::NodeHandle n;
      ros::Publisher msg_pub = n.advertise<test_msgs::Test>("test_msg", 1000);
      ros::Rate loop_rate(10);
      int count = 0;
    
      while (ros::ok())
      {
        test_msgs::Test msg;
        std::cout << "msg.data.size=" << msg.data.size() << std::endl;
    
        //用vector给float32[]数组赋值
        float array[3] = {1.1,1.2,0.3};
        std::vector<float> array1(array,array+3);
        msg.data = array1;
        std::cout << "msg.data3[0]=" << msg.data[0] << std::endl;
        std::cout << "msg.data3.size=" << msg.data.size() << std::endl;
    
        //下标访问float32[]数组
        msg.data[0] = 0.1;
        std::cout << "msg.data3[0]=" << msg.data[0] << std::endl;
    
    
        float array4[4] = {1.0,2.0,0.3,6.6};
        std::vector<float> array41(array4,array4+4);
        msg.data = array41;
        std::cout << "msg.data4.size=" << msg.data.size() << std::endl;
        std::cout << "msg.data4=" << msg.data[0] << " " << msg.data[1] <<  " " << msg.data[2] << " " <<  msg.data[3] << std::endl;
    
        msg.data.push_back(5.5);
        std::cout << "msg.data[5]=" << msg.data[4] << std::endl;
    
        //使用迭代器
        msg.data.resize(6);
        std::cout << "msg.data6.size=" << msg.data.size() << std::endl;
        std::cout << "msg.data6=" ;
        for(std::vector<float>::iterator it = msg.data.begin(); it != msg.data.end(); ++it)
        {
          *it = 0.6;
          std::cout << *it << " ";
        }
        std::cout << std::endl;
    
        msg_pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
        ++count;
      }
    
      return 0;
    }
    
    展开全文
  • msg.obj和msg.what

    万次阅读 2015-05-07 22:45:52
    msg.ob使用来放对象的,这个对象可以使任何类型msg.what只能放数字(作用可以使用来做if判断)用过Handler的人都知道,Message有两种获取方法Message msg = new Message();或者Message msg = handler.obtainMessage...
    msg.ob使用来放对象的,这个对象可以使任何类型msg.what只能放数字(作用可以使用来做if判断)用过Handler的人都知道,Message有两种获取方法Message msg = new Message();或者Message msg = handler.obtainMessage();这两种方法的区别是,前者是new的,需要开辟内存空间;后取者是从global Message pool中,性能消耗相对少;
    展开全文
  • msg.obj与msg.what、this与super

    千次阅读 2019-06-06 15:07:33
    (1)msg.obj :是用来放对象的,这个对象可以是任何类型; msg.what : 只能放数字;(在if判断中可以用到) (2)Message有两种获取方法 Message msg = new Message(); Message msg = handler.obtainMessage(); 这...

    1、msg.obj与msg.what
    (1)msg.obj :是用来放对象的,这个对象可以是任何类型;
    msg.what : 只能放数字;(在if判断中可以用到)

    (2)Message有两种获取方法
    Message msg = new Message();
    Message msg = handler.obtainMessage();
    这两种方法的区别是,前者是new的,需要开辟内存空间;后取者是从global Message pool中,性能消耗相对少;

    2、this与super
    this 只能调用自身的构造方法;
    super 可以调用父类的构造方法。

    3、Android setVisibility()
    setVisibility():
    有三个参数:Parameters:visibility One of VISIBLE,
    INVISIBLE,
    GONE,
    对应的三个常量值:0、4、8
    VISIBLE:0 意思是可见的
    INVISIBILITY:4 意思是不可见的,但还占着原来的空间
    GONE:8 意思是不可见的,不占用原来的布局空间

    4、JAVA——toString()
    【1】undefined和null没有toString()方法
    【2】布尔型数据true和false返回对应的’true’和’false’
    【3】字符串类型原值返回
    【4】数值类型的情况较复杂
    1、正浮点数及NaN、Infinity加引号返回
    2、负浮点数或加’+'号的正浮点数直接跟上.toString(),相当于先运行toString()方法,再添加正负号,转换为数字
    3、整数直接跟上.toString()形式,会报错,提示无效标记,因为整数后的点会被识别为小数点,数字在使用toString()方法时,加括号可解决。
    【5】对象Object类型及自定义对象类型加括号返回[object Object]

    展开全文
  • ${msg}

    千次阅读 2018-03-07 16:39:33
    ${msg} 是javascript,一般用$来封装document.getElementByIdfunction $(id){ return document.getElementById(id);}$('msg')是某id为msg的dom比如&lt;div id="msg"&gt;&lt;/div&gt;&...
    ${msg} 是javascript,一般用$来封装document.getElementById
    function $(id){
      return document.getElementById(id);
    }
    $('msg')是某id为msg的dom

    比如
    <div id="msg"></div>
    <span id="msg"></span>
    同一页面,id是唯一的
    展开全文
  • Ext常用Msg Ext.Msg

    千次阅读 2013-12-04 10:30:48
    Ext.Msg.alert("提示信息","请您至少选择一个!");   选择生成:   Yes/No Ext.Msg.confirm("提示!","您确定要删除该房间类型信息吗?",function(btn){ if(btn=="yes") { //提交到后台 } ...
  • 查看.msg文件

    千次阅读 2019-07-09 06:51:15
    cmd 下cd到msg文件夹下 Ren *.msg *.eml 就能把msg文件转成windows识别的eml了 如果你的电脑上装了outlook2007也能打开msg 转载于:https://www.cnblogs.com/master-zhu/archive/2009/10/01/1577235.html...
  • ROS创建使用msg

    千次阅读 2018-01-18 20:17:27
    在上一章内容中,讲述了ROS节点的发布和订阅。...1. 创建消息(msg) 首先在ROS_Test1中创建msg文件夹: cd ~/catkin_ws/src/ROS_Test1 mkdir msg cd msg vim ROS_Test1_msg.msg 添加内容如下所示: 编辑~/
  • layer.msg 文本换行

    千次阅读 2019-06-26 17:45:18
    layer.msg('文本内容') 当要对文本内容进行换行时,要加上</br>,才能够实现,示例如下: layer.msg('操作失败</br>失败原因是XXX') 经尝试,加上/r/n ,/n,<br>都不能实现上面的效果 另外...
  • 今天遇到一个奇怪的问题,使用安卓Handler消息发送数据进行处理,结果拿到的msg.arg1竟然偶尔变0,不是每次都是0,是偶发性的,我的代码是类似于这样的: ... case HandlerMsgId: System.out.println("编号1消息:"+...
  • Layui 内置方法 - layer.msg(提示框)

    万次阅读 2019-04-22 10:57:32
    在源码中用了相对较大的篇幅来定制了这个msg,目的是想将其打造成露脸率最高的提示框。而事实上我的确也在大量地使用它。因为它简单,而且足够得自觉,它不仅占据很少的面积,而且默认还会3秒后自动消失所有这一切都...
  • Difference between msg.owner and msg.sender?  当部署合约时,msg.sender是合约的所有者,如果合约中定义了一个名为“owner”的变量,则可以为其分配值(地址)msg.sender。  address owner =...
  • solidity的msg.value

    千次阅读 2020-10-18 10:15:49
    在发钱给合约时会改变msg.value的值。msg.value的值以wei为单位,数值大小为给合约打的wei的数量。
  • Msgbroker 概述

    千次阅读 2015-03-13 11:13:47
    Msgbroker 概述 Msgbroker,也称为Message Broker(消息代理组件),是企业级应用系统中常用的消息中间件,主要应用于系统或组件之间消息的可靠、异步通讯。 应用消息中间件可以降低系统间耦合度,提高系统的...
  • ROS常见msg类型

    千次阅读 2019-04-19 22:24:34
    #文件位置:geometry_msgs/Vector3.msg float64 x float64 y float64 z #定义加速度项,包括线性加速度和角加速度 #文件位置:geometry_msgs/Accel.msg Vector3 linear Vector3 angular #定义数据的参考时间和参考...
  • layer.msg参数含义

    万次阅读 2017-10-30 09:39:37
    layer.msg可以是前三个参数,也可以是四个三处   layer.msg(‘提示‘, 2, 1, function(){})   第一个参数:icon  信息框和加载层的私有参数  类型:Number,默认:-1(信息框)/0(加载层)  信息框默认不显示...
  • 基于Vue.js的{{msg}},v-text="msg",v-html="msg"的区别献上代码区别1区别2:当字符串中有标签时 献上代码 &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;...
  • php socket数据发送接收MSG常量

    万次阅读 2020-06-23 17:56:26
    MSG_OOB 1 处理超出边界的数据。 √ √ MSG_PEEK 2 从接受队列的起始位置接收数据,但不将他们从接受队列中移除。 √ - MSG_WAITALL 8 在接收到至少 len 字节的数据之前,造成一个阻塞,并暂停脚本运行(block)...
  • msg消息创建及使用

    千次阅读 2019-07-13 21:38:38
    一、创建msg消息 ...首先创建一个空的package单独存放msg类型(当然也可以在任意的package中自定义msg类型) 这里为便于说明,建立一个名为test_msgs的包,用于对自定义msg类型的用法举例 $ cd catkin...
  • ROS自定义msg类型以及使用

    万次阅读 2017-10-22 14:12:26
    一、创建msg消息参考: CreatingMsgAndSrv 首先创建一个空的package单独存放msg类型(当然也可以在任意的package中自定义msg类型) 这里为便于说明,建立一个名为test_msgs的包,用于对自定义msg类型的用法举例 $ ...
  • 1.msg文件创建 #创建msg文件夹 roscd ros_pkg mkdir msg cd msg #创建msg文件 touch a_msg.msg gedit a_msg.msg 在a_msg.msg文件中写入msg内容,举个栗子 #数据类型 数据名称 int8 A int8 B 修改package...
  • layer.msg()设置时间及相关用法

    万次阅读 2020-09-25 09:13:26
    layer.msg('只想弱弱提示'); //eg2 layer.msg('有表情地提示', {icon: 6}); //eg3 layer.msg('关闭后想做些什么', function(){ //do something }); //eg layer.msg('同上', { icon: 1, time: 2000 //2秒关闭...
  • MSGFMT po/bg.msg make[1]: * [po/bg.msg] Error 127 yum install tcl build-essential tk gettext
  • 提示框alertmsg

    千次阅读 2016-11-18 11:35:00
    alertmsg",并定义type及msg参数 示例代码: &lt;button type="button" class="btn-green" data-toggle="alertmsg" data-type="info" data-msg="我是一个...
  • ros编写自己的msg(Python)

    千次阅读 多人点赞 2019-10-15 15:04:33
    这里,假设我们的包名叫做test_py. 我们写自己的msg文件在该包的msg文件夹下。 test.msg ...#from后边是自己的包.msg,也就是自己包的msg文件夹下,test是我的msg文件名test.msg from test_py.ms...
  • 异常信息: Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback. Tue Jul 28 23:32:38 CST 2020...Required String parameter ‘msg’ is not present
  • 编写自己的msg,或使用msg时,找不到对应.h文件   是CmakeLists出了问题。 1 find_package 下添加 message_generation 2 在 add_executable 后添加 add_dependencies(yourcpp ${PROJECT_NAME}_generate_...
  • 解决msg:token无效

    千次阅读 2020-06-25 09:08:51
    msg:‘无效token’,status:400 原因:用第三方组件element-ui或者其他组件的单个功能上传图片,没有用到axios发请求,而是组件内部自己封装了一个ajax去发请求,组件内部封装的ajax不携带Authorization字段. 解决...
  • ROS学习之自定义msg类型

    千次阅读 2018-04-18 10:24:32
    1. 创建msg文件cd ~/catkin_ws/src/my_package mkdir msg echo "string first_name string last_name uint8 age uint32 score" &gt; msg/Num.msg2. 更改package.xml文件软件包编译过程中会根据...
  • Java项目Msg辅助类

    千次阅读 2018-08-07 10:07:15
    import java.util.HashMap;...public class Msg { private int code; private String msg; private Map&lt;String, Object&gt; map = new HashMap&lt;String, Object&gt;(); public int get...
  • layer.msg('提示框1'); //2、设置提示图标,icon可传入0-6 layer.msg('弹出提示框2', {icon: 6}); //3、设置关闭提示后要执行的方法 layer.msg('你正在打开一个新的页面!', function(){ //do something }); //4...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,085,001
精华内容 434,000
关键字:

msg