如何在ROS中定义并使用自己的消息类型-以image类型为例

本文介绍如何在ROS中自定义消息类型以满足特定工程需求,包括创建自定义消息包、定义消息格式、生成消息文件及使用自定义消息的过程。
ROS自带的消息类型非常丰富,在ROS Kinetic上使用命令rostopic list可以查看所有的消息类型。但是总有时候系统自带的消息类型无法满足工程的特殊需要,这时我们可以自定义消息类型。

   我们要在板子上测试其图像处理能力,要使用一个image_buf的类型进行cache,iamge_buf是一个image的vector。这里,我们直接自己定义一个image类型,然后生成对应的消息类型,并根据这个image,再生成image_buf。

自定义第一个消息类型my_imgdata

1. 建立自定义消息类型package

   cd ~/catkin_ws/src/

   catkin_creat_pkg imgdata_msg

   cd imgdata_msg/

   mkdir msg

2. 输入消息格式到消息文件,这里图像数据格式参考:http://blog.youkuaiyun.com/redskydeng/article/details/49362155

   echo "uint8[] data" >> msg/my_imgdata.msg

    echo "string actor_time" >> msg/my_imgdata.msg

3. 在imgdata_msg的CMakeLists.txt文件中添加如下语句

  find_package(catkin REQUIRED COMPONENTS message_generation roscpp std_msgs)

4. 取消 add_message_files 的相关注释,并添加为如下:
   add_message_files(FILES my_imgdata.msg )

5. 取消generate_messages的相关注释,并添加修改为如下:
   generate_messages(DEPENDENCIES std_msgs  )

6. 在catkin_package中添加:CATKIN_DEPENDS message_runtime

7. 在imgdata_msg的.xml文件中添加://indigo用的是run_depend,为Kinetic用的是exec_depend

  <build_depend>message_generation</build_depend>

  <exec_depend>message_runtime</exec_depend>

8. cd ~/catkin_ws/  &&  catkin_make -DCATKIN_WHITELIST_PACKAGES="imgdata_msg"

9. source devel/setup.bash

10. 至此第一个自定义的消息定义完成,你可以用rosmsg(在indigo上是rostopic)查看完整的消息定义

    rosmsg show imgdata_msg/my_imgdata


下面建立第二个消息类型Img_buf,该消息会使用之前我们自定义的消息类型my_imgdata

1. cd ~/catkin_ws/src/imgdata_msg/ 

2. 输入消息格式到消息文件

    echo "std_msgs/Header  header" >> msg/Img_buf.msg

    echo "imgdata_msg/my_imgdata[]  buf" >> msg/Img_buf.msg

3. 在建立第一个消息的基础上,在 add_message_files 添加如下红色部分:
   add_message_files(FILES my_imgdata.msg Img_buf.msg )

4. cd ~/catkin_ws/  &&  catkin_make -DCATKIN_WHITELIST_PACKAGES="imgdata_msg"


5 source devel/setup.bash

6 至此第一个自定义的消息定义完成,你可以用rosmsg show imgdata_msg/Img_buf 查看完整的消息定义


使用自定义的消息类型:

在使用该消息的工程中添加如下头文件即可,同时要把devel/include目录下的imgdata_msg整体复制到使用该消息的include目录下

#include <imgdata_msg/Img_buf.h>

该头文件是系统在建立自定义消息类型时候自动生成的。


这次实践,自己定义了一个消息类型my_imgdata,里面包含一个数组(或者说是vector)和一个string,然后又针对my_imgdata封装了一个新的消息类型Img_buf,里面包含了一个my_imgdata的数组(或者说是vector)。虽然这次实践的内容看来可能没有实际意义,(定义一个消息类型,又定义一个该消息类型的vetor作为一个新的消息类型)但是我们的最终目标是根据别人提供的任何消息类型,进行二次封装(目的是为了实现缓存),往里面再添加一些其他的成员,如时间、长度等信息,然后就可以利用ros提供的序列化和反序列化,这样就可以不考虑别人提供的数据(这部分数据也有序列化和反序列化)。

这里给出我们这次写出来的测试程序:

#include <memory>
#include <vector>
#include <algorithm>
#include <string>
#include <pthread.h>
#include <map>
#include <fstream>
#include <iostream>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/time.h>
#include "zlib.h"
#include "LRUCache.hpp"
#include "imgdata_msg/Img_buf.h"
#include "imgdata_msg/my_imgdata.h"

#define MAX_BUF 100
#define STORE_PATH "/home/oldking/Msg-File/"

using std::string;
using std::vector;

imgdata_msg::Img_buf w_buf;

pthread_mutex_t buf_lock;

lru::Cache<std::string, imgdata_msg::Img_buf> cache(5,0);//first param is cache size

unsigned long ReadFromFile(std::string file_name, unsigned char*& data)
{
        std::ifstream rs(file_name.c_str(), std::ios::binary);

        rs.seekg(0, std::ios_base::end);
        unsigned long length = rs.tellg();
        rs.seekg(0, std::ios_base::beg);

        data = new unsigned char[length];
        rs.read((char*)data, length);
        rs.close();

    return length;
}

int ForceWrite()
{
    mode_t mode = 0755;
        mkdir(STORE_PATH, mode);
    
    size_t serial_size = ros::serialization::serializationLength(w_buf);
        boost::shared_array<uint8_t> buffer(new uint8_t[serial_size]);
        ros::serialization::OStream stream(buffer.get(), serial_size);
    ros::serialization::serialize(stream, w_buf);

        unsigned char* write = buffer.get();
        uLong comprLen = compressBound(serial_size);
        Byte *compr = new Byte[comprLen];
        int err;
        err = compress(compr, &comprLen, (const Bytef*)write, serial_size);
        if(err != Z_OK)
        {
                printf("compress write file failed !\n");
                return 1;
        }

        std::string file_name = STORE_PATH + w_buf.write_buffer[0].actor_time;
    printf("file_name : %s\n", file_name.c_str());
    //std::ofstream rs(file_name.c_str(), std::ios::binary);
        //rs.write((const char*)compr, comprLen);
        //rs.close();

    FILE* file;
    if((file = fopen(file_name.c_str(), "wb")) == NULL)
    {
        printf("cannot create %s!\n", file_name.c_str());
        return -1;
    }
    uLong flen = serial_size;
    fwrite(&flen, sizeof(uLong), 1, file);
    fwrite(&comprLen, sizeof(uLong), 1, file);
    fwrite(compr, sizeof(unsigned char), comprLen, file);
    fclose(file);
    
    delete[] compr;
    
    //Initialize vector
        w_buf.write_buffer.clear();
    //w_buf.num = 0;

    return 0;
}

int InsertToBuffer(imgdata_msg::my_imgdata &Msg)
{
        if(w_buf.write_buffer.size() < MAX_BUF)
    {
        pthread_mutex_lock(&buf_lock);
                w_buf.write_buffer.push_back(Msg);
                //w_buf.num += 1;//我们没有这个变量
        pthread_mutex_unlock(&buf_lock);

        if(w_buf.write_buffer.size() == MAX_BUF)
            ForceWrite();
    }
    else
    {
        ForceWrite();

        pthread_mutex_lock(&buf_lock);
                w_buf.write_buffer.push_back(Msg);
              //  w_buf.num += 1;
        pthread_mutex_unlock(&buf_lock);
    }

    return 0;
}

int MsgStore(imgdata_msg::my_imgdata &Msg)
{
        InsertToBuffer(Msg);
        return 0;
}

int BufRead(string file_name, vector<imgdata_msg::my_imgdata> &MsgVec)
{
        imgdata_msg::Img_buf data;

    if(cache.contains(file_name))
    {
        data = cache.get(file_name);
    }
    else
    {
        uLong flen;  
            unsigned char* fbuf = NULL;  
            uLong ulen;  
            unsigned char* ubuf = NULL;

        FILE *file;
        if((file = fopen(file_name.c_str(), "rb")) == NULL)  
            {  
                printf("Can\'t open %s!\n", file_name.c_str());  
                return -1;  
            }
    
        fread(&ulen, sizeof(uLong), 1, file);
        fread(&flen, sizeof(uLong), 1, file);
        if((fbuf = (unsigned char*)malloc(sizeof(unsigned char) * flen)) == NULL)  
            {  
                printf("No enough memory!\n");  
                fclose(file);  
                return -1;  
            }  
            fread(fbuf, sizeof(unsigned char), flen, file);

        if((ubuf = (unsigned char*)malloc(sizeof(unsigned char) * ulen)) == NULL)  
            {  
                printf("No enough memory!\n");  
                fclose(file);  
                return -1;  
            }  
            if(uncompress(ubuf, &ulen, fbuf, flen) != Z_OK)  
            {  
                printf("Uncompress failed!\n");  
                return -1;  
            }  
            fclose(file);

        ros::serialization::IStream stream((uint8_t*)ubuf, ulen);
                ros::serialization::Serializer<imgdata_msg::Img_buf>::read(stream, data);

        cache.insert(file_name, data);

        delete[] ubuf;
            delete[] fbuf;
    }

    long i;
        for(i=0;i<data.write_buffer.size();i++)
        MsgVec.push_back(data.write_buffer[i]);

    return 0;
}

int main()
{
    
    long i;
        std::string actor_time = "201803";

        timeval write_time_start,write_time_end;
        gettimeofday(&write_time_start, NULL);

    for(i=0;i<1000;i++)
    {
                imgdata_msg::my_imgdata tmp;

                /*tmp.uav_pose.position.x=i+0.4;
          tmp.uav_pose.position.y=i+0.6;
          tmp.uav_pose.position.z=i+0.3;
          tmp.uav_pose.orientation.x=i+0.9;
          tmp.uav_pose.orientation.y=i+0.2;
          tmp.uav_pose.orientation.z=i+0.4;
          tmp.uav_pose.orientation.w=i+0.2;

        tmp.sensor_pose.position.x=i+0.4;
                tmp.sensor_pose.position.y=i+0.6;
                tmp.sensor_pose.position.z=i+0.3;
                tmp.sensor_pose.orientation.x=i+0.9;
                tmp.sensor_pose.orientation.y=i+0.2;
                tmp.sensor_pose.orientation.z=i+0.4;
                tmp.sensor_pose.orientation.w=i+0.2;*/

        tmp.actor_time = actor_time + std::to_string(i);
/*
        tmp.sensor_msg.header.seq=1;
        tmp.sensor_msg.header.stamp.sec=1;
        tmp.sensor_msg.header.stamp.nsec=1;
        tmp.sensor_msg.status.status=1;
        tmp.sensor_msg.status.service=2;
        tmp.sensor_msg.latitude=1.0;
        tmp.sensor_msg.longitude=2.0;
                */
                int a;
                long j;
                for(j=0;j<30000;j++)
        {
                        //tmp.data[j]=100;
                        a=100;
                        tmp.data.push_back(a);
        }    
                //tmp.sensor_msg.position_covariance_type=0;

                MsgStore(tmp);//write into file
    }
        gettimeofday(&write_time_end, NULL);
        long write_time = 1000000 * ( write_time_end.tv_sec - write_time_start.tv_sec ) + write_time_end.tv_usec - write_time_start.tv_usec;
        printf("write_time       : %ld\n", write_time);

        /*
    long read_time = 0;
    timeval read_time_start;
    timeval read_time_end;


        std::vector<imgdata_msg::my_imgdata> result;

    gettimeofday(&read_time_start, NULL);
        BufRead("/home/olding/Msg-File/201803100", result);
    gettimeofday(&read_time_end, NULL);
    read_time = 1000000 * ( read_time_end.tv_sec - read_time_start.tv_sec ) + read_time_end.tv_usec - read_time_start.tv_usec;
    printf("read_time       : %ld\n", read_time);

    result.clear();

    gettimeofday(&read_time_start, NULL);
        BufRead("/home/oldking/Msg-File/201803100", result);
        gettimeofday(&read_time_end, NULL);
        read_time = 1000000 * ( read_time_end.tv_sec - read_time_start.tv_sec ) + read_time_end.tv_usec - read_time_start.tv_usec;
        printf("read_time       : %ld\n", read_time);
*/
    return 0;
} 

参考:http://blog.youkuaiyun.com/u011906844/article/details/72156215

xyg@xyg-T6AD:~$ sudo apt install ros-humble-hardware-interface [sudo] xyg 的密码: 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 下列软件包是自动安装的且现在不需要了: fonts-lyx libaom-dev libarmadillo-dev libarpack2-dev libblas-dev libblosc-dev libcfitsio-dev libcfitsio-doc libcharls-dev libdav1d-dev libde265-dev libdouble-conversion-dev libfontconfig-dev libfontconfig1-dev libfreexl-dev libfyba-dev libgdal-dev libgeos-dev libgeotiff-dev libgif-dev libgl2ps-dev libheif-dev libjson-c-dev libjsoncpp-dev libkml-dev libkmlconvenience1 libkmlregionator1 libkmlxsd1 liblapack-dev liblbfgsb0 libnetcdf-c++4 libnetcdf-cxx-legacy-dev libogdi-dev libogg-dev libopenjp2-7-dev libopenni-dev libopenni-sensor-pointclouds0 libopenni0 libopenni2-0 libopenni2-dev libpcl-apps1.12 libpcl-common1.12 libpcl-dev libpcl-features1.12 libpcl-filters1.12 libpcl-io1.12 libpcl-kdtree1.12 libpcl-keypoints1.12 libpcl-ml1.12 libpcl-octree1.12 libpcl-outofcore1.12 libpcl-people1.12 libpcl-recognition1.12 libpcl-registration1.12 libpcl-sample-consensus1.12 libpcl-search1.12 libpcl-segmentation1.12 libpcl-stereo1.12 libpcl-surface1.12 libpcl-tracking1.12 libpcl-visualization1.12 libpoppler-dev libpoppler-private-dev libproj-dev libqt5designercomponents5 libqt5qmlworkerscript5 libqt5quickparticles5 libqt5quickshapes5 libqt5quicktest5 libqt5webkit5-dev librttopo-dev libspatialite-dev libsuperlu-dev libtheora-dev liburiparser-dev libutfcpp-dev libvtk9-dev libvtk9-java libvtk9-qt-dev libvtk9.1-qt libwebp-dev libx265-dev libxerces-c-dev libxft-dev libxml2-dev libxsimd-dev openni-utils pydocstyle pyflakes3 python-matplotlib-data python3-appdirs python3-beniget python3-brotli python3-cycler python3-decorator python3-flake8 python3-fonttools python3-fs python3-gast python3-kiwisolver python3-lz4 python3-matplotlib python3-mccabe python3-mpi4py python3-mpmath python3-ply python3-psutil python3-pycodestyle python3-pydocstyle python3-pyflakes python3-pythran python3-scipy python3-snowballstemmer python3-sympy python3-ufolib2 python3-unicodedata2 python3-vtk9 qdoc-qt5 qhelpgenerator-qt5 qt5-assistant qtattributionsscanner-qt5 qtdeclarative5-dev qtdeclarative5-dev-tools qttools5-dev qttools5-dev-tools qttools5-private-dev ros-humble-action-tutorials-cpp ros-humble-action-tutorials-interfaces ros-humble-action-tutorials-py ros-humble-ament-cmake-auto ros-humble-ament-cmake-copyright ros-humble-ament-cmake-flake8 ros-humble-ament-cmake-lint-cmake ros-humble-ament-cmake-pep257 ros-humble-ament-cmake-xmllint ros-humble-ament-flake8 ros-humble-ament-lint-auto ros-humble-ament-lint-cmake ros-humble-ament-lint-common ros-humble-ament-pep257 ros-humble-ament-xmllint ros-humble-composition ros-humble-demo-nodes-cpp ros-humble-demo-nodes-cpp-native ros-humble-demo-nodes-py ros-humble-depthimage-to-laserscan ros-humble-dummy-map-server ros-humble-dummy-robot-bringup ros-humble-dummy-sensors ros-humble-example-interfaces ros-humble-examples-rclcpp-minimal-action-client ros-humble-examples-rclcpp-minimal-action-server ros-humble-examples-rclcpp-minimal-client ros-humble-examples-rclcpp-minimal-composition ros-humble-examples-rclcpp-minimal-publisher ros-humble-examples-rclcpp-minimal-service ros-humble-examples-rclcpp-minimal-subscriber ros-humble-examples-rclcpp-minimal-timer ros-humble-examples-rclcpp-multithreaded-executor ros-humble-examples-rclpy-executors ros-humble-examples-rclpy-minimal-action-client ros-humble-examples-rclpy-minimal-action-server ros-humble-examples-rclpy-minimal-client ros-humble-examples-rclpy-minimal-publisher ros-humble-examples-rclpy-minimal-service ros-humble-examples-rclpy-minimal-subscriber ros-humble-geometry2 ros-humble-image-geometry ros-humble-image-tools ros-humble-intra-process-demo ros-humble-keyboard-handler ros-humble-lifecycle ros-humble-logging-demo ros-humble-pcl-conversions ros-humble-pcl-msgs ros-humble-pendulum-control ros-humble-pendulum-msgs ros-humble-qt-gui-cpp ros-humble-qt-gui-py-common ros-humble-quality-of-service-demo-cpp ros-humble-quality-of-service-demo-py ros-humble-ros-environment ros-humble-ros2action ros-humble-ros2bag ros-humble-ros2component ros-humble-ros2interface ros-humble-ros2launch ros-humble-ros2lifecycle ros-humble-ros2multicast ros-humble-ros2topic ros-humble-rosbag2 ros-humble-rosbag2-compression ros-humble-rosbag2-compression-zstd ros-humble-rosbag2-cpp ros-humble-rosbag2-interfaces ros-humble-rosbag2-py ros-humble-rosbag2-storage ros-humble-rosbag2-storage-default-plugins ros-humble-rosbag2-transport ros-humble-rosidl-default-generators ros-humble-rqt-action ros-humble-rqt-bag ros-humble-rqt-bag-plugins ros-humble-rqt-common-plugins ros-humble-rqt-console ros-humble-rqt-gui-cpp ros-humble-rqt-image-view ros-humble-rqt-msg ros-humble-rqt-plot ros-humble-rqt-publisher ros-humble-rqt-py-common ros-humble-rqt-py-console ros-humble-rqt-reconfigure ros-humble-rqt-service-caller ros-humble-rqt-shell ros-humble-rqt-srv ros-humble-rqt-topic ros-humble-rttest ros-humble-shared-queues-vendor ros-humble-sros2 ros-humble-sros2-cmake ros-humble-teleop-twist-joy ros-humble-teleop-twist-keyboard ros-humble-tf2-bullet ros-humble-tf2-sensor-msgs ros-humble-tf2-tools ros-humble-tlsf ros-humble-tlsf-cpp ros-humble-topic-monitor ros-humble-turtlesim ros-humble-zstd-vendor tcl-dev tcl8.6-dev tk-dev tk8.6-dev unicode-data vtk9 使用'sudo apt autoremove'来卸载它(它们)。 下列软件包将被升级: ros-humble-hardware-interface 升级了 1 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 305 个软件包未被升级。 需要下载 228 kB 的归档。 解压缩后会消耗 0 B 的额外空间。 获取:1 https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy/main amd64 ros-humble-hardware-interface amd64 2.51.0-1jammy.20250617.223440 [228 kB] 已下载 228 kB,耗时 11秒 (21.7 kB/s) (正在读取数据库 ... 系统当前共安装有 322880 个文件和目录。) 准备解压 .../ros-humble-hardware-interface_2.51.0-1jammy.20250617.223440_amd64.d eb ... 正在解压 ros-humble-hardware-interface (2.51.0-1jammy.20250617.223440) 覆盖 (2 .50.0-1jammy.20250429.212517) ... 正在设置 ros-humble-hardware-interface (2.51.0-1jammy.20250617.223440) ... xyg@xyg-T6AD:~$ sudo apt install ros-humble-control-msgs 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 下列软件包是自动安装的且现在不需要了: fonts-lyx libaom-dev libarmadillo-dev libarpack2-dev libblas-dev libblosc-dev libcfitsio-dev libcfitsio-doc libcharls-dev libdav1d-dev libde265-dev libdouble-conversion-dev libfontconfig-dev libfontconfig1-dev libfreexl-dev libfyba-dev libgdal-dev libgeos-dev libgeotiff-dev libgif-dev libgl2ps-dev libheif-dev libjson-c-dev libjsoncpp-dev libkml-dev libkmlconvenience1 libkmlregionator1 libkmlxsd1 liblapack-dev liblbfgsb0 libnetcdf-c++4 libnetcdf-cxx-legacy-dev libogdi-dev libogg-dev libopenjp2-7-dev libopenni-dev libopenni-sensor-pointclouds0 libopenni0 libopenni2-0 libopenni2-dev libpcl-apps1.12 libpcl-common1.12 libpcl-dev libpcl-features1.12 libpcl-filters1.12 libpcl-io1.12 libpcl-kdtree1.12 libpcl-keypoints1.12 libpcl-ml1.12 libpcl-octree1.12 libpcl-outofcore1.12 libpcl-people1.12 libpcl-recognition1.12 libpcl-registration1.12 libpcl-sample-consensus1.12 libpcl-search1.12 libpcl-segmentation1.12 libpcl-stereo1.12 libpcl-surface1.12 libpcl-tracking1.12 libpcl-visualization1.12 libpoppler-dev libpoppler-private-dev libproj-dev libqt5designercomponents5 libqt5qmlworkerscript5 libqt5quickparticles5 libqt5quickshapes5 libqt5quicktest5 libqt5webkit5-dev librttopo-dev libspatialite-dev libsuperlu-dev libtheora-dev liburiparser-dev libutfcpp-dev libvtk9-dev libvtk9-java libvtk9-qt-dev libvtk9.1-qt libwebp-dev libx265-dev libxerces-c-dev libxft-dev libxml2-dev libxsimd-dev openni-utils pydocstyle pyflakes3 python-matplotlib-data python3-appdirs python3-beniget python3-brotli python3-cycler python3-decorator python3-flake8 python3-fonttools python3-fs python3-gast python3-kiwisolver python3-lz4 python3-matplotlib python3-mccabe python3-mpi4py python3-mpmath python3-ply python3-psutil python3-pycodestyle python3-pydocstyle python3-pyflakes python3-pythran python3-scipy python3-snowballstemmer python3-sympy python3-ufolib2 python3-unicodedata2 python3-vtk9 qdoc-qt5 qhelpgenerator-qt5 qt5-assistant qtattributionsscanner-qt5 qtdeclarative5-dev qtdeclarative5-dev-tools qttools5-dev qttools5-dev-tools qttools5-private-dev ros-humble-action-tutorials-cpp ros-humble-action-tutorials-interfaces ros-humble-action-tutorials-py ros-humble-ament-cmake-auto ros-humble-ament-cmake-copyright ros-humble-ament-cmake-flake8 ros-humble-ament-cmake-lint-cmake ros-humble-ament-cmake-pep257 ros-humble-ament-cmake-xmllint ros-humble-ament-flake8 ros-humble-ament-lint-auto ros-humble-ament-lint-cmake ros-humble-ament-lint-common ros-humble-ament-pep257 ros-humble-ament-xmllint ros-humble-composition ros-humble-demo-nodes-cpp ros-humble-demo-nodes-cpp-native ros-humble-demo-nodes-py ros-humble-depthimage-to-laserscan ros-humble-dummy-map-server ros-humble-dummy-robot-bringup ros-humble-dummy-sensors ros-humble-example-interfaces ros-humble-examples-rclcpp-minimal-action-client ros-humble-examples-rclcpp-minimal-action-server ros-humble-examples-rclcpp-minimal-client ros-humble-examples-rclcpp-minimal-composition ros-humble-examples-rclcpp-minimal-publisher ros-humble-examples-rclcpp-minimal-service ros-humble-examples-rclcpp-minimal-subscriber ros-humble-examples-rclcpp-minimal-timer ros-humble-examples-rclcpp-multithreaded-executor ros-humble-examples-rclpy-executors ros-humble-examples-rclpy-minimal-action-client ros-humble-examples-rclpy-minimal-action-server ros-humble-examples-rclpy-minimal-client ros-humble-examples-rclpy-minimal-publisher ros-humble-examples-rclpy-minimal-service ros-humble-examples-rclpy-minimal-subscriber ros-humble-geometry2 ros-humble-image-geometry ros-humble-image-tools ros-humble-intra-process-demo ros-humble-keyboard-handler ros-humble-lifecycle ros-humble-logging-demo ros-humble-pcl-conversions ros-humble-pcl-msgs ros-humble-pendulum-control ros-humble-pendulum-msgs ros-humble-qt-gui-cpp ros-humble-qt-gui-py-common ros-humble-quality-of-service-demo-cpp ros-humble-quality-of-service-demo-py ros-humble-ros-environment ros-humble-ros2action ros-humble-ros2bag ros-humble-ros2component ros-humble-ros2interface ros-humble-ros2launch ros-humble-ros2lifecycle ros-humble-ros2multicast ros-humble-ros2topic ros-humble-rosbag2 ros-humble-rosbag2-compression ros-humble-rosbag2-compression-zstd ros-humble-rosbag2-cpp ros-humble-rosbag2-interfaces ros-humble-rosbag2-py ros-humble-rosbag2-storage ros-humble-rosbag2-storage-default-plugins ros-humble-rosbag2-transport ros-humble-rosidl-default-generators ros-humble-rqt-action ros-humble-rqt-bag ros-humble-rqt-bag-plugins ros-humble-rqt-common-plugins ros-humble-rqt-console ros-humble-rqt-gui-cpp ros-humble-rqt-image-view ros-humble-rqt-msg ros-humble-rqt-plot ros-humble-rqt-publisher ros-humble-rqt-py-common ros-humble-rqt-py-console ros-humble-rqt-reconfigure ros-humble-rqt-service-caller ros-humble-rqt-shell ros-humble-rqt-srv ros-humble-rqt-topic ros-humble-rttest ros-humble-shared-queues-vendor ros-humble-sros2 ros-humble-sros2-cmake ros-humble-teleop-twist-joy ros-humble-teleop-twist-keyboard ros-humble-tf2-bullet ros-humble-tf2-sensor-msgs ros-humble-tf2-tools ros-humble-tlsf ros-humble-tlsf-cpp ros-humble-topic-monitor ros-humble-turtlesim ros-humble-zstd-vendor tcl-dev tcl8.6-dev tk-dev tk8.6-dev unicode-data vtk9 使用'sudo apt autoremove'来卸载它(它们)。 下列软件包将被升级: ros-humble-control-msgs 升级了 1 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 304 个软件包未被升级。 需要下载 441 kB 的归档。 解压缩后会消耗 0 B 的额外空间。 获取:1 https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy/main amd64 ros-humble-control-msgs amd64 4.8.0-1jammy.20250617.205352 [441 kB] 已下载 441 kB,耗时 1秒 (634 kB/s) (正在读取数据库 ... 系统当前共安装有 322880 个文件和目录。) 准备解压 .../ros-humble-control-msgs_4.8.0-1jammy.20250617.205352_amd64.deb ... 正在解压 ros-humble-control-msgs (4.8.0-1jammy.20250617.205352) 覆盖 (4.8.0-1j ammy.20250325.185909) ... 正在设置 ros-humble-control-msgs (4.8.0-1jammy.20250617.205352) ... 正在处理用于 libc-bin (2.35-0ubuntu3.10) 的触发器 ... xyg@xyg-T6AD:~$ sudo apt install ros-humble-control-toolbox 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 ros-humble-control-toolbox 已经是最新版 (3.6.1-1jammy.20250617.230904)。 ros-humble-control-toolbox 已设置为手动安装。 下列软件包是自动安装的且现在不需要了: fonts-lyx libaom-dev libarmadillo-dev libarpack2-dev libblas-dev libblosc-dev libcfitsio-dev libcfitsio-doc libcharls-dev libdav1d-dev libde265-dev libdouble-conversion-dev libfontconfig-dev libfontconfig1-dev libfreexl-dev libfyba-dev libgdal-dev libgeos-dev libgeotiff-dev libgif-dev libgl2ps-dev libheif-dev libjson-c-dev libjsoncpp-dev libkml-dev libkmlconvenience1 libkmlregionator1 libkmlxsd1 liblapack-dev liblbfgsb0 libnetcdf-c++4 libnetcdf-cxx-legacy-dev libogdi-dev libogg-dev libopenjp2-7-dev libopenni-dev libopenni-sensor-pointclouds0 libopenni0 libopenni2-0 libopenni2-dev libpcl-apps1.12 libpcl-common1.12 libpcl-dev libpcl-features1.12 libpcl-filters1.12 libpcl-io1.12 libpcl-kdtree1.12 libpcl-keypoints1.12 libpcl-ml1.12 libpcl-octree1.12 libpcl-outofcore1.12 libpcl-people1.12 libpcl-recognition1.12 libpcl-registration1.12 libpcl-sample-consensus1.12 libpcl-search1.12 libpcl-segmentation1.12 libpcl-stereo1.12 libpcl-surface1.12 libpcl-tracking1.12 libpcl-visualization1.12 libpoppler-dev libpoppler-private-dev libproj-dev libqt5designercomponents5 libqt5qmlworkerscript5 libqt5quickparticles5 libqt5quickshapes5 libqt5quicktest5 libqt5webkit5-dev librttopo-dev libspatialite-dev libsuperlu-dev libtheora-dev liburiparser-dev libutfcpp-dev libvtk9-dev libvtk9-java libvtk9-qt-dev libvtk9.1-qt libwebp-dev libx265-dev libxerces-c-dev libxft-dev libxml2-dev libxsimd-dev openni-utils pydocstyle pyflakes3 python-matplotlib-data python3-appdirs python3-beniget python3-brotli python3-cycler python3-decorator python3-flake8 python3-fonttools python3-fs python3-gast python3-kiwisolver python3-lz4 python3-matplotlib python3-mccabe python3-mpi4py python3-mpmath python3-ply python3-psutil python3-pycodestyle python3-pydocstyle python3-pyflakes python3-pythran python3-scipy python3-snowballstemmer python3-sympy python3-ufolib2 python3-unicodedata2 python3-vtk9 qdoc-qt5 qhelpgenerator-qt5 qt5-assistant qtattributionsscanner-qt5 qtdeclarative5-dev qtdeclarative5-dev-tools qttools5-dev qttools5-dev-tools qttools5-private-dev ros-humble-action-tutorials-cpp ros-humble-action-tutorials-interfaces ros-humble-action-tutorials-py ros-humble-ament-cmake-auto ros-humble-ament-cmake-copyright ros-humble-ament-cmake-flake8 ros-humble-ament-cmake-lint-cmake ros-humble-ament-cmake-pep257 ros-humble-ament-cmake-xmllint ros-humble-ament-flake8 ros-humble-ament-lint-auto ros-humble-ament-lint-cmake ros-humble-ament-lint-common ros-humble-ament-pep257 ros-humble-ament-xmllint ros-humble-composition ros-humble-demo-nodes-cpp ros-humble-demo-nodes-cpp-native ros-humble-demo-nodes-py ros-humble-depthimage-to-laserscan ros-humble-dummy-map-server ros-humble-dummy-robot-bringup ros-humble-dummy-sensors ros-humble-example-interfaces ros-humble-examples-rclcpp-minimal-action-client ros-humble-examples-rclcpp-minimal-action-server ros-humble-examples-rclcpp-minimal-client ros-humble-examples-rclcpp-minimal-composition ros-humble-examples-rclcpp-minimal-publisher ros-humble-examples-rclcpp-minimal-service ros-humble-examples-rclcpp-minimal-subscriber ros-humble-examples-rclcpp-minimal-timer ros-humble-examples-rclcpp-multithreaded-executor ros-humble-examples-rclpy-executors ros-humble-examples-rclpy-minimal-action-client ros-humble-examples-rclpy-minimal-action-server ros-humble-examples-rclpy-minimal-client ros-humble-examples-rclpy-minimal-publisher ros-humble-examples-rclpy-minimal-service ros-humble-examples-rclpy-minimal-subscriber ros-humble-geometry2 ros-humble-image-geometry ros-humble-image-tools ros-humble-intra-process-demo ros-humble-keyboard-handler ros-humble-lifecycle ros-humble-logging-demo ros-humble-pcl-conversions ros-humble-pcl-msgs ros-humble-pendulum-control ros-humble-pendulum-msgs ros-humble-qt-gui-cpp ros-humble-qt-gui-py-common ros-humble-quality-of-service-demo-cpp ros-humble-quality-of-service-demo-py ros-humble-ros-environment ros-humble-ros2action ros-humble-ros2bag ros-humble-ros2component ros-humble-ros2interface ros-humble-ros2launch ros-humble-ros2lifecycle ros-humble-ros2multicast ros-humble-ros2topic ros-humble-rosbag2 ros-humble-rosbag2-compression ros-humble-rosbag2-compression-zstd ros-humble-rosbag2-cpp ros-humble-rosbag2-interfaces ros-humble-rosbag2-py ros-humble-rosbag2-storage ros-humble-rosbag2-storage-default-plugins ros-humble-rosbag2-transport ros-humble-rosidl-default-generators ros-humble-rqt-action ros-humble-rqt-bag ros-humble-rqt-bag-plugins ros-humble-rqt-common-plugins ros-humble-rqt-console ros-humble-rqt-gui-cpp ros-humble-rqt-image-view ros-humble-rqt-msg ros-humble-rqt-plot ros-humble-rqt-publisher ros-humble-rqt-py-common ros-humble-rqt-py-console ros-humble-rqt-reconfigure ros-humble-rqt-service-caller ros-humble-rqt-shell ros-humble-rqt-srv ros-humble-rqt-topic ros-humble-rttest ros-humble-shared-queues-vendor ros-humble-sros2 ros-humble-sros2-cmake ros-humble-teleop-twist-joy ros-humble-teleop-twist-keyboard ros-humble-tf2-bullet ros-humble-tf2-sensor-msgs ros-humble-tf2-tools ros-humble-tlsf ros-humble-tlsf-cpp ros-humble-topic-monitor ros-humble-turtlesim ros-humble-zstd-vendor tcl-dev tcl8.6-dev tk-dev tk8.6-dev unicode-data vtk9 使用'sudo apt autoremove'来卸载它(它们)。 升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 304 个软件包未被升级。 xyg@xyg-T6AD:~$ sudo apt install ros-humble-ros2-control 正在读取软件包列表... 完成 正在分析软件包的依赖关系树... 完成 正在读取状态信息... 完成 ros-humble-ros2-control 已经是最新版 (2.51.0-1jammy.20250617.234359)。 下列软件包是自动安装的且现在不需要了: fonts-lyx libaom-dev libarmadillo-dev libarpack2-dev libblas-dev libblosc-dev libcfitsio-dev libcfitsio-doc libcharls-dev libdav1d-dev libde265-dev libdouble-conversion-dev libfontconfig-dev libfontconfig1-dev libfreexl-dev libfyba-dev libgdal-dev libgeos-dev libgeotiff-dev libgif-dev libgl2ps-dev libheif-dev libjson-c-dev libjsoncpp-dev libkml-dev libkmlconvenience1 libkmlregionator1 libkmlxsd1 liblapack-dev liblbfgsb0 libnetcdf-c++4 libnetcdf-cxx-legacy-dev libogdi-dev libogg-dev libopenjp2-7-dev libopenni-dev libopenni-sensor-pointclouds0 libopenni0 libopenni2-0 libopenni2-dev libpcl-apps1.12 libpcl-common1.12 libpcl-dev libpcl-features1.12 libpcl-filters1.12 libpcl-io1.12 libpcl-kdtree1.12 libpcl-keypoints1.12 libpcl-ml1.12 libpcl-octree1.12 libpcl-outofcore1.12 libpcl-people1.12 libpcl-recognition1.12 libpcl-registration1.12 libpcl-sample-consensus1.12 libpcl-search1.12 libpcl-segmentation1.12 libpcl-stereo1.12 libpcl-surface1.12 libpcl-tracking1.12 libpcl-visualization1.12 libpoppler-dev libpoppler-private-dev libproj-dev libqt5designercomponents5 libqt5qmlworkerscript5 libqt5quickparticles5 libqt5quickshapes5 libqt5quicktest5 libqt5webkit5-dev librttopo-dev libspatialite-dev libsuperlu-dev libtheora-dev liburiparser-dev libutfcpp-dev libvtk9-dev libvtk9-java libvtk9-qt-dev libvtk9.1-qt libwebp-dev libx265-dev libxerces-c-dev libxft-dev libxml2-dev libxsimd-dev openni-utils pydocstyle pyflakes3 python-matplotlib-data python3-appdirs python3-beniget python3-brotli python3-cycler python3-decorator python3-flake8 python3-fonttools python3-fs python3-gast python3-kiwisolver python3-lz4 python3-matplotlib python3-mccabe python3-mpi4py python3-mpmath python3-ply python3-psutil python3-pycodestyle python3-pydocstyle python3-pyflakes python3-pythran python3-scipy python3-snowballstemmer python3-sympy python3-ufolib2 python3-unicodedata2 python3-vtk9 qdoc-qt5 qhelpgenerator-qt5 qt5-assistant qtattributionsscanner-qt5 qtdeclarative5-dev qtdeclarative5-dev-tools qttools5-dev qttools5-dev-tools qttools5-private-dev ros-humble-action-tutorials-cpp ros-humble-action-tutorials-interfaces ros-humble-action-tutorials-py ros-humble-ament-cmake-auto ros-humble-ament-cmake-copyright ros-humble-ament-cmake-flake8 ros-humble-ament-cmake-lint-cmake ros-humble-ament-cmake-pep257 ros-humble-ament-cmake-xmllint ros-humble-ament-flake8 ros-humble-ament-lint-auto ros-humble-ament-lint-cmake ros-humble-ament-lint-common ros-humble-ament-pep257 ros-humble-ament-xmllint ros-humble-composition ros-humble-demo-nodes-cpp ros-humble-demo-nodes-cpp-native ros-humble-demo-nodes-py ros-humble-depthimage-to-laserscan ros-humble-dummy-map-server ros-humble-dummy-robot-bringup ros-humble-dummy-sensors ros-humble-example-interfaces ros-humble-examples-rclcpp-minimal-action-client ros-humble-examples-rclcpp-minimal-action-server ros-humble-examples-rclcpp-minimal-client ros-humble-examples-rclcpp-minimal-composition ros-humble-examples-rclcpp-minimal-publisher ros-humble-examples-rclcpp-minimal-service ros-humble-examples-rclcpp-minimal-subscriber ros-humble-examples-rclcpp-minimal-timer ros-humble-examples-rclcpp-multithreaded-executor ros-humble-examples-rclpy-executors ros-humble-examples-rclpy-minimal-action-client ros-humble-examples-rclpy-minimal-action-server ros-humble-examples-rclpy-minimal-client ros-humble-examples-rclpy-minimal-publisher ros-humble-examples-rclpy-minimal-service ros-humble-examples-rclpy-minimal-subscriber ros-humble-geometry2 ros-humble-image-geometry ros-humble-image-tools ros-humble-intra-process-demo ros-humble-keyboard-handler ros-humble-lifecycle ros-humble-logging-demo ros-humble-pcl-conversions ros-humble-pcl-msgs ros-humble-pendulum-control ros-humble-pendulum-msgs ros-humble-qt-gui-cpp ros-humble-qt-gui-py-common ros-humble-quality-of-service-demo-cpp ros-humble-quality-of-service-demo-py ros-humble-ros-environment ros-humble-ros2action ros-humble-ros2bag ros-humble-ros2component ros-humble-ros2interface ros-humble-ros2launch ros-humble-ros2lifecycle ros-humble-ros2multicast ros-humble-ros2topic ros-humble-rosbag2 ros-humble-rosbag2-compression ros-humble-rosbag2-compression-zstd ros-humble-rosbag2-cpp ros-humble-rosbag2-interfaces ros-humble-rosbag2-py ros-humble-rosbag2-storage ros-humble-rosbag2-storage-default-plugins ros-humble-rosbag2-transport ros-humble-rosidl-default-generators ros-humble-rqt-action ros-humble-rqt-bag ros-humble-rqt-bag-plugins ros-humble-rqt-common-plugins ros-humble-rqt-console ros-humble-rqt-gui-cpp ros-humble-rqt-image-view ros-humble-rqt-msg ros-humble-rqt-plot ros-humble-rqt-publisher ros-humble-rqt-py-common ros-humble-rqt-py-console ros-humble-rqt-reconfigure ros-humble-rqt-service-caller ros-humble-rqt-shell ros-humble-rqt-srv ros-humble-rqt-topic ros-humble-rttest ros-humble-shared-queues-vendor ros-humble-sros2 ros-humble-sros2-cmake ros-humble-teleop-twist-joy ros-humble-teleop-twist-keyboard ros-humble-tf2-bullet ros-humble-tf2-sensor-msgs ros-humble-tf2-tools ros-humble-tlsf ros-humble-tlsf-cpp ros-humble-topic-monitor ros-humble-turtlesim ros-humble-zstd-vendor tcl-dev tcl8.6-dev tk-dev tk8.6-dev unicode-data vtk9 使用'sudo apt autoremove'来卸载它(它们)。 升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 304 个软件包未被升级。 xyg@xyg-T6AD:~$ colcon build --cmake-clean-cache --packages-select pca9685_hardware Traceback (most recent call last): File "<string>", line 1, in <module> File "/usr/lib/python3.10/distutils/core.py", line 215, in run_setup exec(f.read(), g) File "<string>", line 8, in <module> AttributeError: 'NoneType' object has no attribute 'split' [2.803s] ERROR:colcon.colcon_core.package_identification:Exception in package identification extension 'python_setup_py' in 'rpi_kernel/linux-rpi-6.12.y/tools/perf/util': Command '['/usr/bin/python3', '-c', 'import sys;from contextlib import suppress;exec("with suppress(ImportError): from setuptools.extern.packaging.specifiers import SpecifierSet");exec("with suppress(ImportError): from packaging.specifiers import SpecifierSet");from distutils.core import run_setup;dist = run_setup( \'setup.py\', script_args=(\'--dry-run\',), stop_after=\'config\');skip_keys = (\'cmdclass\', \'distclass\', \'ext_modules\', \'metadata\');data = { key: value for key, value in dist.__dict__.items() if ( not key.startswith(\'_\') and not callable(value) and key not in skip_keys and key not in dist.display_option_names )};data[\'metadata\'] = { k: v for k, v in dist.metadata.__dict__.items() if k not in (\'license_files\', \'provides_extras\')};sys.stdout.buffer.write(repr(data).encode(\'utf-8\'))']' returned non-zero exit status 1. Traceback (most recent call last): File "/usr/lib/python3/dist-packages/colcon_core/package_identification/__init__.py", line 144, in _identify retval = extension.identify(_reused_descriptor_instance) File "/usr/lib/python3/dist-packages/colcon_python_setup_py/package_identification/python_setup_py.py", line 48, in identify config = get_setup_information(setup_py) File "/usr/lib/python3/dist-packages/colcon_python_setup_py/package_identification/python_setup_py.py", line 249, in get_setup_information _setup_information_cache[hashable_env] = _get_setup_information( File "/usr/lib/python3/dist-packages/colcon_python_setup_py/package_identification/python_setup_py.py", line 296, in _get_setup_information result = subprocess.run( File "/usr/lib/python3.10/subprocess.py", line 526, in run raise CalledProcessError(retcode, process.args, subprocess.CalledProcessError: Command '['/usr/bin/python3', '-c', 'import sys;from contextlib import suppress;exec("with suppress(ImportError): from setuptools.extern.packaging.specifiers import SpecifierSet");exec("with suppress(ImportError): from packaging.specifiers import SpecifierSet");from distutils.core import run_setup;dist = run_setup( \'setup.py\', script_args=(\'--dry-run\',), stop_after=\'config\');skip_keys = (\'cmdclass\', \'distclass\', \'ext_modules\', \'metadata\');data = { key: value for key, value in dist.__dict__.items() if ( not key.startswith(\'_\') and not callable(value) and key not in skip_keys and key not in dist.display_option_names )};data[\'metadata\'] = { k: v for k, v in dist.metadata.__dict__.items() if k not in (\'license_files\', \'provides_extras\')};sys.stdout.buffer.write(repr(data).encode(\'utf-8\'))']' returned non-zero exit status 1. WARNING: Package name "yahboomcar_KCFTracker" does not follow the naming conventions. It should start with a lower case letter and only contain lower case letters, digits, underscores, and dashes. [3.734s] WARNING:colcon.colcon_core.prefix_path.colcon:The path '/home/xyg/ros2_ws/install' in the environment variable COLCON_PREFIX_PATH doesn't exist [3.734s] WARNING:colcon.colcon_ros.prefix_path.ament:The path '/home/xyg/ros2_ws/install' in the environment variable AMENT_PREFIX_PATH doesn't exist [3.734s] WARNING:colcon.colcon_ros.prefix_path.catkin:The path '/home/xyg/ros2_ws/install' in the environment variable CMAKE_PREFIX_PATH doesn't exist [3.759s] ERROR:colcon:colcon build: Duplicate package names not supported: - pca9685_hardware: - ros2_ws/src/pca9685_hardware - ros_env_backup/ros2_ws/src/pca9685_hardware - 下载/ros2_ws/src/pca9685_hardware xyg@xyg-T6AD:~$ colcon build --symlink-install --packages-select pca9685_hardware \ --cmake-args -DCMAKE_BUILD_TYPE=Release Traceback (most recent call last): File "<string>", line 1, in <module> File "/usr/lib/python3.10/distutils/core.py", line 215, in run_setup exec(f.read(), g) File "<string>", line 8, in <module> AttributeError: 'NoneType' object has no attribute 'split' [2.007s] ERROR:colcon.colcon_core.package_identification:Exception in package identification extension 'python_setup_py' in 'rpi_kernel/linux-rpi-6.12.y/tools/perf/util': Command '['/usr/bin/python3', '-c', 'import sys;from contextlib import suppress;exec("with suppress(ImportError): from setuptools.extern.packaging.specifiers import SpecifierSet");exec("with suppress(ImportError): from packaging.specifiers import SpecifierSet");from distutils.core import run_setup;dist = run_setup( \'setup.py\', script_args=(\'--dry-run\',), stop_after=\'config\');skip_keys = (\'cmdclass\', \'distclass\', \'ext_modules\', \'metadata\');data = { key: value for key, value in dist.__dict__.items() if ( not key.startswith(\'_\') and not callable(value) and key not in skip_keys and key not in dist.display_option_names )};data[\'metadata\'] = { k: v for k, v in dist.metadata.__dict__.items() if k not in (\'license_files\', \'provides_extras\')};sys.stdout.buffer.write(repr(data).encode(\'utf-8\'))']' returned non-zero exit status 1. Traceback (most recent call last): File "/usr/lib/python3/dist-packages/colcon_core/package_identification/__init__.py", line 144, in _identify retval = extension.identify(_reused_descriptor_instance) File "/usr/lib/python3/dist-packages/colcon_python_setup_py/package_identification/python_setup_py.py", line 48, in identify config = get_setup_information(setup_py) File "/usr/lib/python3/dist-packages/colcon_python_setup_py/package_identification/python_setup_py.py", line 249, in get_setup_information _setup_information_cache[hashable_env] = _get_setup_information( File "/usr/lib/python3/dist-packages/colcon_python_setup_py/package_identification/python_setup_py.py", line 296, in _get_setup_information result = subprocess.run( File "/usr/lib/python3.10/subprocess.py", line 526, in run raise CalledProcessError(retcode, process.args, subprocess.CalledProcessError: Command '['/usr/bin/python3', '-c', 'import sys;from contextlib import suppress;exec("with suppress(ImportError): from setuptools.extern.packaging.specifiers import SpecifierSet");exec("with suppress(ImportError): from packaging.specifiers import SpecifierSet");from distutils.core import run_setup;dist = run_setup( \'setup.py\', script_args=(\'--dry-run\',), stop_after=\'config\');skip_keys = (\'cmdclass\', \'distclass\', \'ext_modules\', \'metadata\');data = { key: value for key, value in dist.__dict__.items() if ( not key.startswith(\'_\') and not callable(value) and key not in skip_keys and key not in dist.display_option_names )};data[\'metadata\'] = { k: v for k, v in dist.metadata.__dict__.items() if k not in (\'license_files\', \'provides_extras\')};sys.stdout.buffer.write(repr(data).encode(\'utf-8\'))']' returned non-zero exit status 1. WARNING: Package name "yahboomcar_KCFTracker" does not follow the naming conventions. It should start with a lower case letter and only contain lower case letters, digits, underscores, and dashes. [2.822s] WARNING:colcon.colcon_core.prefix_path.colcon:The path '/home/xyg/ros2_ws/install' in the environment variable COLCON_PREFIX_PATH doesn't exist [2.822s] WARNING:colcon.colcon_ros.prefix_path.ament:The path '/home/xyg/ros2_ws/install' in the environment variable AMENT_PREFIX_PATH doesn't exist [2.822s] WARNING:colcon.colcon_ros.prefix_path.catkin:The path '/home/xyg/ros2_ws/install' in the environment variable CMAKE_PREFIX_PATH doesn't exist [2.846s] ERROR:colcon:colcon build: Duplicate package names not supported: - pca9685_hardware: - ros2_ws/src/pca9685_hardware - ros_env_backup/ros2_ws/src/pca9685_hardware - 下载/ros2_ws/src/pca9685_hardware xyg@xyg-T6AD:~$ dpkg -L ros-humble-hardware-interface-types | grep cmake dpkg-query: 软件包 ros-humble-hardware-interface-types 没有被安装 通过 dpkg --contents (= dpkg-deb --contents) 来列出档案文件清单。
最新发布
06-25
<think>我们正在处理一个关于ROS1和ROS2中图像消息字段对应关系的问题。用户询问:ROS2image消息类型中的"k"字段对应ROS1中的哪个字段?分析引用内容:引用[1]提到ROS1中的图像消息(sensor_msgs/Image)具有的属性包括:Width,Height,Data等,但没有提到"k"字段。引用[3]讨论了ROS2中图像消息的常见类型(如mono8,rgb8等),但同样没有提到"k"字段。实际上,在标准的ROS1和ROS2的sensor_msgs/Image消息中,都不存在名为"k"的字段。因此,用户提到的"k"字段可能是一个误解或自定义字段。回顾标准消息定义:1.ROS1的sensor_msgs/Image消息(http://docs.ros.org/en/api/sensor_msgs/html/msg/Image.html)包含以下字段:-std_msgs/Headerheader-uint32height-uint32width-stringencoding-uint8is_bigendian-uint32step-uint8[]data2.ROS2的sensor_msgs/Image消息(https://github.com/ros2/common_interfaces/blob/rolling/sensor_msgs/msg/Image.msg)包含以下字段:-std_msgs/Headerheader-uint32height-uint32width-stringencoding-uint8is_bigendian-uint32step-uint8[]data两者结构几乎一致,均无"k"字段。但是,用户可能指的是图像编码(encoding)字段中的某种编码类型?引用[3]中提到了图像编码格式,如mono8、rgb8等。在ROS中,图像编码是通过字符串指定的,如:-ROS1和ROS2中,单通道8位灰度图像使用"mono8"-三通道BGR图像使用"bgr8"那么,用户所说的"k"可能是指某种图像编码?如,在颜色空间中,有时会使用YUV编码,其中包含Y、U、V分量,但没有一个单独的"k"分量。另一种可能是用户误将其他消息的字段当成了图像消息的字段。如,在点云消息(sensor_msgs/PointCloud2)中,引用[2]提到了PointField的name可以是"x","y","z","rgb"等,但也没有提到"k"。因此,我们需要澄清:标准的图像消息中没有"k"字段。但是,考虑到用户可能指的是自定义消息,或者在特定上下文中(如某些处理节点)添加了额外的字段,我们无法确定。所以,我们需要进一步引导用户提供更多信息。然而,根据问题,我们只能基于标准消息来回答。回答思路:1.指出在标准ROS1和ROS2的sensor_msgs/Image消息中都不存在名为"k"的字段。2.猜测用户可能指的是图像编码(encoding)字段中的某个编码字符串?但标准编码字符串中也没有"k"。3.建议用户检查消息定义,确认是否存在自定义消息。因此,我们可以这样回答:###问题解答:ROS2Image消息中的"k"字段在ROS1中的对应####🔍标准消息字段对比在ROS1和ROS2中,`sensor_msgs/Image`消息的标准定义均不包含名为`k`的字段。以下是核心字段的对应关系:|ROS1(sensor_msgs/Image)|ROS2(sensor_msgs/Image)|说明||--------------------------|--------------------------|------||`header`|`header`|消息头部(包含时间戳、坐标系等)||`height`|`height`|图像高度(像素)||`width`|`width`|图像宽度(像素)||`encoding`|`encoding`|**图像编码字符串**(如`mono8`、`rgb8`等)||`is_bigendian`|`is_bigendian`|数据字节序||`step`|`step`|每行数据的字节数(=宽度×像素字节数)||`data`|`data`|图像数据的一维数组|####❓"k"字段的可能来源1.**自定义扩展字段**若您的代码中出现`k`,可能是开发者自行扩展的消息字段(非标准)。请检查:-消息定义文件(`.msg`)中是否声明了`k`字段-是否混淆了其他消息类型(如点云`sensor_msgs/PointCloud2`)2.**图像编码的误解**`encoding`字段存储描述像素格式的字符串,常见的编码包括:-`mono8`:单通道8位灰度图-`rgb8`/`bgr8`:三通道RGB/BGR彩色图-`bgra8`:四通道带透明度的彩色图这些字符串中**不包含`k`**,但某些特殊编码(如`yuv422`)中的`Y`、`U`、`V`分量可能与`k`无关。3.**点云数据中的字段**如引用[2]所述,点云消息(`sensor_msgs/PointCloud2`)的`fields`数组可包含自定义属性(如`x`、`y`、`z`、`rgb`等),但同样无标准`k`字段。####✅排查建议1.**检查消息对象结构**在代码中打印消息对象的完整属性列表:```python#ROS2示(Python)print(dir(msg))#查看msg所有属性```2.**确认消息类型**确保操作的是`Image`而非其他类型:```pythonprint(type(msg))#应输出<class'sensor_msgs.msg._Image.Image'>```3.**查阅自定义消息定义**若使用自定义消息,检查`.msg`文件中是否定义了`k`字段。####💎结论**标准ROS1/ROS2的Image消息均无`k`字段**。若您需要实现特定功能(如传输额外参数),建议:-使用标准字段(如`header.frame_id`传递标识符)-创建自定义消息类型(参考[ROS2自定义消息文档](https://docs.ros.org/en/rolling/Tutorials/Custom-ROS2-Interfaces.html))####📚相关问题1.如何在ROS2中创建包含自定义字段的图像消息?2.`sensor_msgs/Image`的`encoding`字段支持哪些编码格式?[^3]3.ROS1和ROS2的图像数据存储方式有何异同?[^1][^3]4.如何正确解析`sensor_msgs/PointCloud2`中的自定义字段?[^2]>建议通过`ros2interfaceshowsensor_msgs/msg/Image`命令查看ROS2中Image消息的完整定义。</think>### ROS2 Image消息中的"k"字段与ROS1对应关系解析 #### 🔍 核心结论 **ROS2的`Image`消息中不存在名为"k"的标准字段**,ROS1的`sensor_msgs/Image`消息同样没有"k"字段。您可能遇到了以下情况之一: 1. **自定义字段**:可能是您使用的特定驱动或自定义消息包添加的扩展字段 2. **字段误解**:可能与其他消息类型(如`CameraInfo`或`PointCloud2`)的字段混淆 3. **编码标识符**:可能指图像编码类型(如`rgb8`中的"k"分量,但实际不存在) #### 📊 标准Image消息字段对比 以下是ROS1与ROS2图像消息的标准字段对应关系: | ROS1 (sensor_msgs/Image) | ROS2 (sensor_msgs/msg/Image) | 说明 | |--------------------------|-------------------------------|------| | `header` | `header` | 消息头(含时间戳)[^1] | | `height` | `height` | 图像高度(像素)[^1] | | `width` | `width` | 图像宽度(像素)[^1] | | `encoding` | `encoding` | **图像编码类型**(关键字段)[^3] | | `is_bigendian` | `is_bigendian` | 字节序标识 | | `step` | `step` | 每行字节数(=宽度×像素深度) | | `data[]` | `data` | 图像原始数据(一维数组)[^1] | #### ❓ "k"字段的可能来源分析 1. **图像编码误解** 在颜色编码中: - RGB格式有`r`,`g`,`b`分量 - YUV格式有`y`,`u`,`v`分量 但**不存在"k"标准分量**。可能混淆了: ```python # 错误猜测 msg.encoding = "rgbk" # ❌ 无此编码 # 实际标准编码 msg.encoding = "rgb8" # ✅ 三通道RGB [^3] ``` 2. **点云消息混淆** 如引用[2]所示,`PointCloud2`消息包含`fields`数组,可能有自定义字段名: ```yaml fields: - {name: "x", ...} - {name: "y", ...} - {name: "k", ...} # 可能是自定义字段 ``` 但这属于`PointCloud2`而非`Image`消息。 3. **自定义扩展字段** 某些深度相机驱动可能扩展消息: ```python # 伪代码示(非标准) class ExtendedImage(sensor_msgs.msg.Image): k_factor: float # 自定义光学系数 ``` #### ✅ 操作建议 1. **检查实际消息结构** ```python # ROS2 Python from ros2cli.msg import get_msg_fields print(get_msg_fields('sensor_msgs/msg/Image')) # 运行时检查 print(dir(your_image_msg)) # 查看对象所有属性 ``` 2. **验证消息来源** - 使用`ros2 topic info <topic_name>`确认消息类型 - 检查是否使用了非标准的自定义消息包 3. **图像编码处理** 若需操作像素分量,应通过编码类型解析`data`字段: ```python # 示:提取RGB分量 if msg.encoding == "rgb8": # data布局: [R0, G0, B0, R1, G1, B1, ...] blue = msg.data[2] # 第一个像素的蓝色分量 ``` #### 💎 总结 - 标准ROS1/ROS2 `Image`消息均**无"k"字段** - "k"可能是:自定义扩展字段/其他消息类型字段/对编码的误解 - 关键图像属性存储于: - 尺寸:`width`+`height` - 数据:`data[]`+`encoding` - 元数据:`header` #### 📚 相关问题 1. 如何在ROS2中正确解析不同编码格式的图像数据?[^3] 2. ROS1到ROS2的图像消息迁移需要注意哪些兼容性问题? 3. `sensor_msgs/Image` 与 `sensor_msgs/CompressedImage` 有何本质区别? 4. 如何为ROS2图像消息添加自定义扩展字段? > 建议通过`ros2 interface show sensor_msgs/msg/Image`命令查看ROS2中Image消息的完整定义。若您有包含"k"字段的消息定义文件,请提供其路径或内容以便进一步分析。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值