Linux嵌入式开发笔记(九)ROS2中调用自定义库(cpp+h)的方法

首先,已经可以根据demo仿写自己的工程,同时也就调用了系统自带的函数,这些函数在demo都有使用,很容易成功;其次,在上一篇中介绍了ROS2中系统API函数原型,这样也就可以调用demo中没有用到的系统中的函数;现在记录一下,ROS2中如何调用自定义cpp文件和h文件的方法。

先来干货再举例,在Ubuntu1804中是没有IDE编译器的,所以自定义的cpp文件和h文件需要手动关联起来,同时调用路径也需要手动添加。新建一个include文件夹,在其中新建ZtMathLibrary.cpp和ZtMathLibrary.h两个文件。

ZtMathLibrary.cpp内容如下:

ZtMathLibrary.h内容如下:

重点来了,在CMakeLists.txt中添加寻找include文件夹的路径;同时需要将ZtMathLibrary.cpp文件进行编译,传统的IDE编译器中会自动编译.cpp文件,并将其与.h文件关联,在Ubuntu1804系统中需要手动编译.cpp文件才可以与.h文件关联。

添加如下内容:

<think>我们正在使用ROS2,目标是调用笔记本内置摄像头进行图像采集或处理。根据引用[2]和[5],我们可以使用`usb_cam`功能包。引用[5]虽然是在ROS1环境下安装`usb_cam`,但ROS2中也有对应的版本。引用[2]直接给出了在ROS2中运行`usb_cam`节点的命令。 步骤: 1. 安装`usb_cam`功能包(如果尚未安装): 在ROS2中,我们可以使用以下命令安装: ```bash sudo apt install ros-<distro>-usb-cam ``` 其中`<distro>`是你的ROS2发行版名称(如foxy、humble等)。 2. 运行`usb_cam`节点: 引用[2]提供了运行节点的命令: ```bash ros2 run usb_cam usb_cam_node_exe --ros-args --params-file /opt/ros/<distro>/share/usb_cam/config/params.yaml ``` 注意:将`<distro>`替换为你的ROS2发行版。 3. 查看摄像头图像: 运行节点后,摄像头图像会发布到`/image_raw`话题。我们可以使用`rqt_image_view`来查看: ```bash rqt_image_view ``` 然后在rqt中选择`/image_raw`话题。 4. 使用多个摄像头(可选): 如果笔记本有多个摄像头(如前置和后置),引用[3]提到多个USB摄像头的使用方法。我们需要为每个摄像头指定不同的参数文件或通过命令行参数设置不同的设备ID和话题名称。 例如,我们可以复制一份参数文件,并修改其中的`video_device`(设备路径)和`topic_name`(话题名称),然后分别运行两个节点。 5. 在代码中订阅图像话题: 对于图像处理,我们需要在自己的节点中订阅`/image_raw`话题(或自定义的话题)。消息类型为`sensor_msgs/msg/Image`。 例如,使用C++: ```cpp #include "rclcpp/rclcpp.hpp" #include "sensor_msgs/msg/image.hpp" class ImageSubscriber : public rclcpp::Node { public: ImageSubscriber() : Node("image_subscriber") { subscription_ = this->create_subscription<sensor_msgs::msg::Image>( "/image_raw", 10, std::bind(&ImageSubscriber::topic_callback, this, std::placeholders::_1)); } private: void topic_callback(const sensor_msgs::msg::Image::SharedPtr msg) const { // 处理图像消息 } rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr subscription_; }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); rclcpp::spin(std::make_shared<ImageSubscriber>()); rclcpp::shutdown(); return 0; } ``` 或者使用Python: ```python import rclpy from rclpy.node import Node from sensor_msgs.msg import Image class ImageSubscriber(Node): def __init__(self): super().__init__('image_subscriber') self.subscription = self.create_subscription( Image, '/image_raw', self.listener_callback, 10) self.subscription # 防止未使用变量警告 def listener_callback(self, msg): # 处理图像消息 pass def main(args=None): rclpy.init(args=args) image_subscriber = ImageSubscriber() rclpy.spin(image_subscriber) image_subscriber.destroy_node() rclpy.shutdown() if __name__ == '__main__': main() ``` 6. 注意:如果摄像头无法打开,检查设备权限(通常需要将用户加入video组)或者设备路径(在参数文件中设置`video_device`,默认为`/dev/video0`)。如果是虚拟机,引用[1]提到需要设置USB兼容性(但笔记本内置摄像头可能不是USB设备,虚拟机中可能需要额外设置)。 总结:在ROS2中使用笔记本摄像头,我们通过`usb_cam`节点发布图像话题,然后可以订阅该话题进行图像处理。 相关问题: 1. 如何修改`usb_cam`节点发布的图像话题名称? 2. 如何调整摄像头的分辨率或帧率? 3. 在ROS2中如何对摄像头进行标定?</think>### 在ROS2中使用笔记本摄像头的方法 #### 1. 安装摄像头驱动包 ```bash sudo apt install ros-<distro>-usb-cam # 替换<distro>为你的ROS2版本(如humble) ``` 例如在Humble版本中: ```bash sudo apt install ros-humble-usb-cam ``` #### 2. 连接摄像头设备 - 物理连接:确保摄像头已启用(笔记本内置摄像头通常自动连接) - 虚拟机用户(如使用VirtualBox): 1. 设置USB兼容性为USB 3.1 [^1] 2. 安装扩展包增强USB支持 3. 执行 `ls /dev/video*` 确认设备存在 #### 3. 启动摄像头节点 ```bash ros2 run usb_cam usb_cam_node_exe \ --ros-args \ --params-file /opt/ros/humble/share/usb_cam/config/params.yaml ``` 这会发布默认话题:`/image_raw` [^2] #### 4. 验证图像流 **方法1:使用rqt_image_view** ```bash rqt_image_view ``` 在GUI中选择`/image_raw`话题 **方法2:使用终端工具** ```bash ros2 topic hz /image_raw # 检查帧率 ros2 topic echo /image_raw --no-arr # 查看消息头 ``` #### 5. 修改参数(可选) 创建自定义参数文件`custom_params.yaml`: ```yaml video_device: "/dev/video0" # 设备路径 image_width: 1280 # 分辨率 image_height: 720 framerate: 30.0 pixel_format: "yuyv" # 常见格式 ``` 启动时指定参数文件: ```bash ros2 run usb_cam usb_cam_node_exe --ros-args --params-file custom_params.yaml ``` #### 6. 在代码中使用图像 Python订阅示例: ```python import rclpy from rclpy.node import Node from sensor_msgs.msg import Image class CameraSubscriber(Node): def __init__(self): super().__init__('camera_subscriber') self.subscription = self.create_subscription( Image, '/image_raw', self.image_callback, 10) def image_callback(self, msg): # 在此添加图像处理代码 self.get_logger().info(f'收到图像: {msg.width}x{msg.height}') def main(args=None): rclpy.init(args=args) node = CameraSubscriber() rclpy.spin(node) rclpy.shutdown() ``` #### 常见问题解决 1. **无图像输出**: - 检查设备权限:`sudo chmod 777 /dev/video0` - 尝试其他像素格式:如`mjpeg`或`yuyv` 2. **多摄像头支持**: - 为每个摄像头创建独立参数文件 - 指定不同的话题名称(如`/camera1/image_raw`)[^3] ```yaml topic_name: "camera1/image_raw" ``` 3. **与SLAM等系统集成**: - 确保话题名称匹配(如ORB_SLAM2需要`/camera/image_raw`)[^4] - 使用`remap`重命名话题: ```bash ros2 run usb_cam usb_cam_node_exe --ros-args -p topic_name:=/camera/image_raw ``` #### 完整启动示例 ```bash # 终端1:启动摄像头节点 ros2 run usb_cam usb_cam_node_exe --ros-args \ -p video_device:="/dev/video0" \ -p image_width:=1280 \ -p image_height:=720 # 终端2:查看图像 rqt_image_view ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值