ROS2---动作action

关于动作这个通信机制最重要的是:

它有目标、反馈和结果。

意思就是客户端可以在请求响应的过程中获取连续反馈,并且可以向服务端发送任务取消请求。

作用:一般适用于耗时的请求响应场景,用以获取连续的状态反馈。

接下来演示一个案例

1、创建工作空间

mkdir -p action_ws/src
cd action_ws/src

2、创建c++功能包和python功能包

ros2 pkg create cpp03_action --build-type ament_cmake --dependencies rclcpp rclcpp_action base_interfaces_demo
ros2 pkg create py03_action --build-type ament_python --dependencies rclpy base_interfaces_demo

3、还是在action_ws/src的目录下,创建功能包base_interfaces_demo并编辑一个action文件夹,action文件夹下新建Progress.action。

ros2 pkg create base_interfaces_demo --build-type ament_cmake

分别对应请求结果反馈

int64 num
---
int64 sum
---
float64 progress

base_interfaces_demo下的package.xml

<buildtool_depend>rosidl_default_generators</buildtool_depend>
<depend>action_msgs</depend>
<member_of_group>rosidl_interface_packages</member_of_group>

CMakeLists.txt

find_package(rosidl_default_generators REQUIRED)
 
rosidl_generate_interfaces(${PROJECT_NAME}
  "action/Progress.action"
)

rosidl_generate_interfaces(${PROJECT_NAME}
  "msg/Student.msg"
  "srv/AddInts.srv"
  "action/Progress.action"
)

 回到工作空间编译一下:

colcon build

编译成功后测试一下

. install/setup.bash
ros2 interface show base_interfaces_demo/action/Progress

可以看到成功输出

二、动作通信(C++)

1.动作服务端实现

        功能包cpp03_action的src目录下,新建C++文件demo01_action_server.cpp。

/*  
  需求:编写动作服务端实习,可以提取客户端请求提交的整型数据,并累加从1到该数据之间的所有整数以求和,
       每累加一次都计算当前运算进度并连续反馈回客户端,最后,在将求和结果返回给客户端。
  步骤:
    1.包含头文件;
    2.初始化 ROS2 客户端;
    3.定义节点类;
      3-1.创建动作服务端;
      3-2.处理请求数据;
      3-3.处理取消任务请求;
      3-4.生成连续反馈。
    4.调用spin函数,并传入节点对象指针;
    5.释放资源。
*/
// 1.包含头文件;
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_action/rclcpp_action.hpp"
#include "base_interfaces_demo/action/progress.hpp"
 
using namespace std::placeholders;
using base_interfaces_demo::action::Progress;
using GoalHandleProgress = rclcpp_action::ServerGoalHandle<Progress>;
 
// 3.定义节点类;
class MinimalActionServer : public rclcpp::Node
{
public:
 
  explicit MinimalActionServer(const rclcpp::NodeOptions & options = rclcpp::NodeOptions())
  : Node("minimal_action_server", options)
  {
    // 3-1.创建动作服务端;
    this->action_server_ = rclcpp_action::create_server<Progress>(
      this,
      "get_sum",
      std::bind(&MinimalActionServer::handle_goal, this, _1, _2),
      std::bind(&MinimalActionServer::handle_cancel, this, _1),
      std::bind(&MinimalActionServer::handle_accepted, this, _1));
    RCLCPP_INFO(this->get_logger(),"动作服务端创建,等待请求...");
  }
 
private:
  rclcpp_action::Server<Progress>::SharedPtr action_server_;
 
  // 3-2.处理请求数据;
  rclcpp_action::GoalResponse handle_goal(const rclcpp_action::GoalUUID & uuid,std::shared_ptr<const Progress::Goal> goal)
  {
    (void)uuid;
    RCLCPP_INFO(this->get_logger(), "接收到动作客户端请求,请求数字为 %ld", goal->num);
    if (goal->num < 1) {
      return rclcpp_action::GoalResponse::REJECT;
    }
    return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE;
  }
 
  // 3-3.处理取消任务请求;
  rclcpp_action::CancelResponse handle_cancel(
    const std::shared_ptr<GoalHandleProgress> goal_handle)
  {
    (void)goal_handle;
    RCLCPP_INFO(this->get_logger(), "接收到任务取消请求");
    return rclcpp_action::CancelResponse::ACCEPT;
  }
 
  void execute(const std::shared_ptr<GoalHandleProgress> goal_handle)
  {
    RCLCPP_INFO(this->get_logger(), "开始执行任务");
    rclcpp::Rate loop_rate(10.0);
    const auto goal = goal_handle->get_goal();
    auto feedback = std::make_shared<Progress::Feedback>();
    auto result = std::make_shared<Progress::Result>();
    int64_t sum= 0;
    for (int i = 1; (i <= goal->num) && rclcpp::ok(); i++) {
      sum += i;
      // Check if there is a cancel request
      if (goal_handle->is_canceling()) {
        result->sum = sum;
        goal_handle->canceled(result);
        RCLCPP_INFO(this->get_logger(), "任务取消");
        return;
      }
      feedback->progress = (double_t)i / goal->num;
      goal_handle->publish_feedback(feedback);
      RCLCPP_INFO(this->get_logger(), "连续反馈中,进度:%.2f", feedback->progress);
 
      loop_rate.sleep();
    }
 
    if (rclcpp::ok()) {
      result->sum = sum;
      goal_handle->succeed(result);
      RCLCPP_INFO(this->get_logger(), "任务完成!");
    }
  }
 
  // 3-4.生成连续反馈。
  void handle_accepted(const std::shared_ptr<GoalHandleProgress> goal_handle)
  {
    std::thread{std::bind(&MinimalActionServer::execute, this, _1), goal_handle}.detach();
  }
}; 
 
int main(int argc, char ** argv)
{
  // 2.初始化 ROS2 客户端;
  rclcpp::init(argc, argv);
  // 4.调用spin函数,并传入节点对象指针;
  auto action_server = std::make_shared<MinimalActionServer>();
  rclcpp::spin(action_server);
  // 5.释放资源。
  rclcpp::shutdown();
  return 0;
}
2.动作客户端实现

        功能包cpp03_action的src目录下,新建C++文件demo02_action_client.cpp。

/*  
  需求:编写动作客户端实现,可以提交一个整型数据到服务端,并处理服务端的连续反馈以及最终返回结果。
  步骤:
    1.包含头文件;
    2.初始化 ROS2 客户端;
    3.定义节点类;
      3-1.创建动作客户端;
      3-2.发送请求;
      3-3.处理目标发送后的反馈;
      3-4.处理连续反馈;
      3-5.处理最终响应。
    4.调用spin函数,并传入节点对象指针;
    5.释放资源。
*/
// 1.包含头文件;
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_action/rclcpp_action.hpp"
#include "base_interfaces_demo/action/progress.hpp"
 
using base_interfaces_demo::action::Progress;
using GoalHandleProgress = rclcpp_action::ClientGoalHandle<Progress>;
using namespace std::placeholders;
 
// 3.定义节点类;
class MinimalActionClient : public rclcpp::Node
{
public:
 
  explicit MinimalActionClient(const rclcpp::NodeOptions & node_options = rclcpp::NodeOptions())
  : Node("minimal_action_client", node_options)
  {
    // 3-1.创建动作客户端;
    this->client_ptr_ = rclcpp_action::create_client<Progress>(this,"get_sum");
  }
 
  // 3-2.发送请求;
  void send_goal(int64_t num)
  {
 
    if (!this->client_ptr_) {
      RCLCPP_ERROR(this->get_logger(), "动作客户端未被初始化。");
    }
 
    if (!this->client_ptr_->wait_for_action_server(std::chrono::seconds(10))) {
      RCLCPP_ERROR(this->get_logger(), "服务连接失败!");
      return;
    }
 
    auto goal_msg = Progress::Goal();
    goal_msg.num = num;
    RCLCPP_INFO(this->get_logger(), "发送请求数据!");
 
    auto send_goal_options = rclcpp_action::Client<Progress>::SendGoalOptions();
    send_goal_options.goal_response_callback =std::bind(&MinimalActionClient::goal_response_callback, this, _1);
    send_goal_options.feedback_callback =std::bind(&MinimalActionClient::feedback_callback, this, _1, _2);
    send_goal_options.result_callback =std::bind(&MinimalActionClient::result_callback, this, _1);
    auto goal_handle_future = this->client_ptr_->async_send_goal(goal_msg, send_goal_options);
  }
 
private:
  rclcpp_action::Client<Progress>::SharedPtr client_ptr_;
 
  // 3-3.处理目标发送后的反馈;
  void goal_response_callback(GoalHandleProgress::SharedPtr goal_handle)
  {
    if (!goal_handle) {
      RCLCPP_ERROR(this->get_logger(), "目标请求被服务器拒绝!");
    } else {
      RCLCPP_INFO(this->get_logger(), "目标被接收,等待结果中");
    }
  }
 
  // 3-4.处理连续反馈;
  void feedback_callback(GoalHandleProgress::SharedPtr,const std::shared_ptr<const Progress::Feedback> feedback)
  {
    int32_t progress = (int32_t)(feedback->progress * 100);
    RCLCPP_INFO(this->get_logger(), "当前进度: %d%%", progress);
  }
 
  // 3-5.处理最终响应。
  void result_callback(const GoalHandleProgress::WrappedResult & result)
  {
    switch (result.code) {
      case rclcpp_action::ResultCode::SUCCEEDED:
        break;
      case rclcpp_action::ResultCode::ABORTED:
        RCLCPP_ERROR(this->get_logger(), "任务被中止");
        return;
      case rclcpp_action::ResultCode::CANCELED:
        RCLCPP_ERROR(this->get_logger(), "任务被取消");
        return;
      default:
        RCLCPP_ERROR(this->get_logger(), "未知异常");
        return;
    }
 
    RCLCPP_INFO(this->get_logger(), "任务执行完毕,最终结果: %ld", result.result->sum);
  }
}; 
 
int main(int argc, char ** argv)
{
  // 2.初始化 ROS2 客户端;
  rclcpp::init(argc, argv);
 
  // 4.调用spin函数,并传入节点对象指针;
  auto action_client = std::make_shared<MinimalActionClient>();
  action_client->send_goal(10);
  rclcpp::spin(action_client);
  // 5.释放资源。
  rclcpp::shutdown();
  return 0;
}
3、编辑配置文件

packages.xml

<depend>rclcpp</depend>
<depend>rclcpp_action</depend>
<depend>base_interfaces_demo</depend>
CMakeLists.txt
find_package(rclcpp REQUIRED)
find_package(rclcpp_action REQUIRED)
find_package(base_interfaces_demo REQUIRED)
 
add_executable(demo01_action_server src/demo01_action_server.cpp)
ament_target_dependencies(
  demo01_action_server
  "rclcpp"
  "rclcpp_action"
  "base_interfaces_demo"
)
 
add_executable(demo02_action_client src/demo02_action_client.cpp)
ament_target_dependencies(
  demo02_action_client
  "rclcpp"
  "rclcpp_action"
  "base_interfaces_demo"
)
 
install(TARGETS 
  demo01_action_server
  demo02_action_client
  DESTINATION lib/${PROJECT_NAME})
编译

终端中进入当前工作空间,编译功能包

colcon build --packages-select cpp03_action
执行

        当前工作空间下,启动两个终端,终端1执行动作服务端程序,终端2执行动作客户端程序。

终端1输入如下指令:

. install/setup.bash
ros2 run cpp03_action demo01_action_server

终端2输入如下指令:

. install/setup.bash
ros2 run cpp03_action demo02_action_client

动作通信(Python)

1.动作服务端实现

        功能包py03_action的py03_action目录下,新建Python文件demo01_action_server_py.py。

"""  
    需求:编写动作服务端实习,可以提取客户端请求提交的整型数据,并累加从1到该数据之间的所有整数以求和,
       每累加一次都计算当前运算进度并连续反馈回客户端,最后,在将求和结果返回给客户端。
    步骤:
        1.导包;
        2.初始化 ROS2 客户端;
        3.定义节点类;
            3-1.创建动作服务端;
            3-2.生成连续反馈;
            3-3.生成最终响应。
        4.调用spin函数,并传入节点对象;
        5.释放资源。
"""
 
# 1.导包;
import time
import rclpy
from rclpy.action import ActionServer
from rclpy.node import Node
 
from base_interfaces_demo.action import Progress
 
# 3.定义节点类;
class ProgressActionServer(Node):
 
    def __init__(self):
        super().__init__('progress_action_server')
        # 3-1.创建动作服务端;
        self._action_server = ActionServer(
            self,
            Progress,
            'get_sum',
            self.execute_callback)
        self.get_logger().info('动作服务已经启动!')
 
    def execute_callback(self, goal_handle):
        self.get_logger().info('开始执行任务....')
 
 
        # 3-2.生成连续反馈;
        feedback_msg = Progress.Feedback()
 
        sum = 0
        for i in range(1, goal_handle.request.num + 1):
            sum += i
            feedback_msg.progress = i / goal_handle.request.num
            self.get_logger().info('连续反馈: %.2f' % feedback_msg.progress)
            goal_handle.publish_feedback(feedback_msg)
            time.sleep(1)
 
        # 3-3.生成最终响应。
        goal_handle.succeed()
        result = Progress.Result()
        result.sum = sum
        self.get_logger().info('任务完成!')
 
        return result
 
 
def main(args=None):
 
    # 2.初始化 ROS2 客户端;
    rclpy.init(args=args)
 
    # 4.调用spin函数,并传入节点对象;
    Progress_action_server = ProgressActionServer()
    rclpy.spin(Progress_action_server)
 
    # 5.释放资源。
    rclpy.shutdown()
 
if __name__ == '__main__':
    main()
2.动作客户端实现

        功能包py03_action的py03_action目录下,新建Python文件demo02_action_client_py.py。

"""  
    需求:编写动作客户端实现,可以提交一个整型数据到服务端,并处理服务端的连续反馈以及最终返回结果。
    步骤:
        1.导包;
        2.初始化 ROS2 客户端;
        3.定义节点类;
            3-1.创建动作客户端;
            3-2.发送请求;
            3-3.处理目标发送后的反馈;
            3-4.处理连续反馈;
            3-5.处理最终响应。
        4.调用spin函数,并传入节点对象;
        5.释放资源。
"""
# 1.导包;
import rclpy
from rclpy.action import ActionClient
from rclpy.node import Node
from base_interfaces_demo.action import Progress
 
# 3.定义节点类;
class ProgressActionClient(Node):
 
    def __init__(self):
        super().__init__('progress_action_client')
        # 3-1.创建动作客户端;
        self._action_client = ActionClient(self, Progress, 'get_sum')
 
    def send_goal(self, num):
        # 3-2.发送请求;
        goal_msg = Progress.Goal()
        goal_msg.num = num
        self._action_client.wait_for_server()
        self._send_goal_future = self._action_client.send_goal_async(goal_msg, feedback_callback=self.feedback_callback)
        self._send_goal_future.add_done_callback(self.goal_response_callback)
 
    def goal_response_callback(self, future):
        # 3-3.处理目标发送后的反馈;
        goal_handle = future.result()
        if not goal_handle.accepted:
            self.get_logger().info('请求被拒绝')
            return
 
        self.get_logger().info('请求被接收,开始执行任务!')
 
        self._get_result_future = goal_handle.get_result_async()
        self._get_result_future.add_done_callback(self.get_result_callback)
 
    # 3-5.处理最终响应。
    def get_result_callback(self, future):
        result = future.result().result
        self.get_logger().info('最终计算结果:sum = %d' % result.sum)
        # 5.释放资源。
        rclpy.shutdown()
 
    # 3-4.处理连续反馈;
    def feedback_callback(self, feedback_msg):
        feedback = (int)(feedback_msg.feedback.progress * 100)
        self.get_logger().info('当前进度: %d%%' % feedback)
 
 
def main(args=None):
 
    # 2.初始化 ROS2 客户端;
    rclpy.init(args=args)
    # 4.调用spin函数,并传入节点对象;
 
    action_client = ProgressActionClient()
    action_client.send_goal(10)
    rclpy.spin(action_client)
 
    # rclpy.shutdown()
 
 
if __name__ == '__main__':
    main()
3.编辑配置文件
1.package.xml

在创建功能包时,所依赖的功能包已经自动配置了,配置内容如下:

<depend>rclpy</depend>
<depend>base_interfaces_demo</depend>
setup.py

entry_points字段的console_scripts中添加如下内容:

entry_points={
    'console_scripts': [
        'demo01_action_server_py = py03_action.demo01_action_server_py:main',
        'demo02_action_client_py = py03_action.demo02_action_client_py:main'
    ],
},
编译

终端中进入当前工作空间,编译功能包:

colcon build --packages-select py03_action
执行

        当前工作空间下,启动两个终端,终端1执行动作服务端程序,终端2执行动作客户端程序。

终端1输入如下指令:

. install/setup.bash
ros2 run py03_action demo01_action_server_py

终端2输入如下指令:

. install/setup.bash
ros2 run py03_action demo02_action_client_py

效果如下:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值