# ros_robot_cam **Repository Path**: shuaihuafei/ros_robot_cam ## Basic Information - **Project Name**: ros_robot_cam - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-09-03 - **Last Updated**: 2025-04-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 运行前必看 ## 需要补充的src功能包 1. src中的OrbbecSDK_ROS1功能包,请git: [git clone https://github.com/orbbec/OrbbecSDK_ROS1](https://github.com/orbbec/OrbbecSDK_ROS1) ## 需要安装的第三方库等 ### 编译前 1. **opencv**:该项目对opencv的具体版本无要求,可以直接apt源码安装`sudo apt install libopencv-dev libopencv-contrib-dev python3-opencv`。可以通过`dpkg -l | grep libopencv-dev`查看OpenCV版本。 2. **MoveIt**:安装[MoveIt](https://moveit.ros.org/install/) ```bash # 运行以下指令即可 sudo apt install ros-noetic-moveit ``` 3. **moveit_visual_tools**:安装moveit_visual_tools功能包 ```bash sudo apt install ros-noetic-moveit-visual-tools ``` 4. [Orbbec SDK for ROS](https://vcp.developer.orbbec.com.cn/documentation?doc=doc-67): ```bash # 安装OrbbecROS需要的其他依赖 sudo apt install libgflags-dev ros-$ROS_DISTRO-image-geometry ros-$ROS_DISTRO-camera-info-manager\ ros-$ROS_DISTRO-image-transport ros-$ROS_DISTRO-image-publisher libgoogle-glog-dev libusb-1.0-0-dev libeigen3-dev ``` ### 编译 ```bash cd ~/ros_gemini2-l_ws catkin_make ``` ### 编译后 1. Orbbec相机需要安装的udev rules(udev 是 Linux 中的一个子系统,负责管理设备的插拔事件以及设备文件的创建和管理。) ```bash cd ~/ros_gemini2-l_ws source ./devel/setup.bash roscd orbbec_camera cd script sudo cp 99-obsensor-libusb.rules /etc/udev/rules.d/99-obsensor-libusb.rules sudo udevadm control --reload && sudo udevadm trigger ``` 2. 安装ros-controllers ```bash sudo apt install ros-noetic-ros-controllers ``` # 运行步骤 1. 启动jaka机械臂的gazebo仿真与rviz界面 ```bash cd ~/ros_gemini2-l_ws bash jaka_gazebo.sh ``` 2. 启动相机 ```bash bash camera.sh ``` 3. 将相机坐标系挂载到机械臂坐标系上,并监听相机图像话题,求出aruco相对于相机的关系并发布 ```bash bash aruco_detect.sh ``` 4. 监听aruco的位置,并驱动机械臂 ```bash bash jaka_moveit.sh ``` # 注意事项 ## 相机 1. 如果在想在ros中使用opencv,将opencv与其他的ros包一起放在find_package中会编译出错。所以需要单独放。具体原因见该博客下的评论:[opencv不是由catkin_make编译的包](https://blog.csdn.net/q913184251/article/details/103955916?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170565872516800188578331%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=170565872516800188578331&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-4-103955916-null-null.142^v99^pc_search_result_base1&utm_term=ros%20%20find_package%20%20%E6%97%A0%E6%B3%95%E6%89%BE%E5%88%B0opencv&spm=1018.2226.3001.4187) ```CMake find_package(catkin REQUIRED COMPONENTS cv_bridge roscpp rospy std_msgs ) find_package(OpenCV REQUIRED) ``` 2. 如果要包含自定义的头文件,那么在CMakeLists.txt文件中,要将include_directories中include前的#去掉,也就是要把注释打开。注意这里的include表示的是当前功能包中的include文件夹,也就是与CMakeLists.txt同级目录下的include文件夹,如下图所示。所以此时在cpp中引用头文件时,需要加上include下的子目录来引用,如`#include "ArucoROS/my_aruco.h"`。注意文件夹名字还有文件名不要写错。 ```CMake include_directories( include ${catkin_INCLUDE_DIRS} ) ``` ![picture 0](.assets_IMG/note/IMG_20240119-194605591.png) 3. 如果有多个cpp源文件,一定要在add_executable这个指令后面加上去,并且加的时候,要从文件夹的名字开始写。 ```CMake add_executable(${PROJECT_NAME}_node src/main.cpp src/my_aruco.cpp ) ``` 4. 如果要广播TF坐标系,最好是重新开一个话题,并新建一个节点,专门接收该话题的坐标信息。第一次,最好在坐标信息存在的情况下,向话题发布消息,然后专门的节点接收。 https://github.com/JakaCobot/jaka_robot 5. 编译时这种报错: `None of the required 'libglog' found`,是因为没有安装Orbbec的其他依赖。详见[Orbbec SDK for ROS 使用手册](https://vcp.developer.orbbec.com.cn/documentation?doc=doc-67)。 ## 机械臂 1. 编译时类似于这种报错`moveit_visual_tools/moveit_visual_tools.h: 没有那个文件或目录`,很可能是CMakeLists.txt或者package.xml中没有包含对应的功能包,所以需要配置`find_package`以及package.xml中的三个标签。如果配置了之后又报错` Could not find the required component 'moveit_visual_tools'`,那么就是没有安装对应的功能包,需要通过apt指令来安装对应的功能(`sudo apt install ros-noetic-moveit-visual-tools`)。 2. 运行报错:Unable to identify any set of controllers that can actuate the specified joints 解决:指令安装`sudo apt install ros-noetic-ros-controllers`:[ROS-moveit!仿真出现问题:Unable to identify any set of controllers that can actuate the specified](https://blog.csdn.net/xiaokai1999/article/details/113591325?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170601896116800211532019%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170601896116800211532019&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-113591325-null-null.142^v99^pc_search_result_base1&utm_term=Unable%20to%20identify%20any%20set%20of%20controllers%20that%20can%20actuate%20the%20specified%20joints%3A&spm=1018.2226.3001.4187) 3. 运行报错:No p gain specified for pid. Namespace: /gazebo_ros_control/pid_gains/joint_1 解决:将 ```yaml gains: joint_1: {p: 100, d: 1, i: 1, i_clamp: 1} joint_2: {p: 100, d: 1, i: 1, i_clamp: 1} joint_3: {p: 100, d: 1, i: 1, i_clamp: 1} joint_4: {p: 100, d: 1, i: 1, i_clamp: 1} joint_5: {p: 100, d: 1, i: 1, i_clamp: 1} joint_6: {p: 100, d: 1, i: 1, i_clamp: 1} ``` 改为 ```yaml /gazebo_ros_control/pid_gains: joint_1: {p: 100, d: 1, i: 1, i_clamp: 1} joint_2: {p: 100, d: 1, i: 1, i_clamp: 1} joint_3: {p: 100, d: 1, i: 1, i_clamp: 1} joint_4: {p: 100, d: 1, i: 1, i_clamp: 1} joint_5: {p: 100, d: 1, i: 1, i_clamp: 1} joint_6: {p: 100, d: 1, i: 1, i_clamp: 1} ``` (官方解释:启动 demo_gazebo.launch 文件会出现报错“No p gain specified for pid.”,该报错是由于我们 Moveit 设置使用的控制器是位置控制器,pid 不需要设置,就会存在这个报错,但不会影响使用。) ## YOLOX 1. 运行报错:运行指令`rosrun yolox_ros predict.py` 报错 ModuleNotFoundError: No module named 'yolo'。此时predict.py与yolo.py在同一个目录下。 解决:删除`build/`和`devel/`重新编译,然后解决下面的报错,这个问题就自然解决了。 2. 编译报错:CMake Error at /opt/ros/noetic/share/catkin/cmake/empy.cmake:30 (message): Unable to find either executable 'empy' or Python module 'em'... try installing the package 'python3-empy' 解决:`pip install empy` 3. 编译报错:ImportError: "from catkin_pkg.package import parse_package" failed: No module named 'catkin_pkg' Make sure that you have installed "catkin_pkg", it is up to date and on the PYTHONPATH. 解决:`pip install catkin_pkg` 4. 编译报错:AttributeError: 'module' object has no attribute 'RAW_OPT' 解决: ```bash pip uninstall empy pip install empy==3.3.4 ``` 1. 编译报错:ModuleNotFoundError: No module named 'yaml' 解决:`conda install pyyaml` 2. 运行报错:/usr/bin/env: “python\r”: 没有那个文件或目录 解决: ```bash # Open the file in vim or vi, and administer the following command: :set ff=unix # Save and exit: :wq # Done! ``` 3. 运行报错:ModuleNotFoundError: No module named 'rospkg' 解决:`pip install rospkg` 4. 运行报错:(报错意思就是找不到模型、类和字体的路径) 解决:ros中检索文件路径不是相对当前文件,而是相对于ros工作空间。也就是.catkin_workspace文件所在的目录,也就是ros工作空间最顶层的目录 5. 运行报错:ImportError: /lib/x86_64-linux-gnu/libp11-kit.so.0: undefined symbol 解决:conda install libffi==3.3 参考:[博客](https://blog.csdn.net/OrdinaryMatthew/article/details/131439895) # 案例参考: 1. 完整案例参考:[【Gazebo仿真·二】Gazebo + ur5e + RealSense + Aruco 二维码识别与跟随仿真](https://blog.csdn.net/weixin_43453505/article/details/125523155) GitHub地址:[Beryl-Zong/marker_track](https://github.com/Beryl-Zong/marker_track) # 手眼标定 ## 参考博客 [手眼标定博客参考](https://blog.csdn.net/qq_57639232/article/details/139157140) 其中主要是使用了aruco_ros和easy_handeye这两个开源包 ## 运行时错误 1. 报错:如果运行下述步骤时报错,提示缺少pyqt5和pyside2,分别安装即可 解决:`pip install pyqt5==5.10.1`和`pip install pyside2` 说明:这里尝试过很多pyqt的版本,只有pyqt5==5.10.1这个版本可用,但是运行`roslaunch easy_handeye eye_in_hand_calibrate.launch`时依旧会报错`Could not import "pyqt" bindings of qt_gui_cpp library - so C++ plugins will not be available ImportError: /home/shuai/miniconda3/envs/yolox/lib/python3.7/site-packages/PyQt5/Qt/lib/libQt5Core.so.5: version 'Qt_5.12' not found (required by /opt/ros/noetic/lib/python3/dist-packages/qt_gui_cpp/libqt_gui_cpp_sip.so)`这里猜测是因为noetic自带的qt版本为5.12,但是easy_handeye在安装pyqt5==5.12后又无法运行,所以这里只能安装pyqt5==5.10.1。因为这里使用pyqt5==5.10.1虽然报错,但是报错字体为蓝色,且可以正常标定,所以就先不管他了 参考:[使用easy_handeye手眼标定缺少rqt_easy_handeye窗口解决办法亲测有效](https://blog.csdn.net/m0_46649553/article/details/125429209) ## 手眼标定启动步骤 ```bash # 下面每个roslaunch都是在一个独立的窗口进行的 source ./devel/setup.bash # 启动相机 roslaunch orbbec_camera gemini2L.launch # 启动aruco_ros节点识别maker标 roslaunch aruco_ros single_my.launch # 显示aruco识别图像 rosrun image_view image_view image:=/aruco_single/result # 启动机械臂 roslaunch elite_controller elite_controller.launch robot:=ec66 robot_ip:=192.168.1.233 roslaunch elite_moveit elite_moveit.launch robot:=ec66 mode:=real # 启动 easy_handeye 手眼标定节点 roslaunch easy_handeye eye_in_hand_calibrate.launch ``` # 运行move with marker功能 ## 功能说明 相机视野中的二维码运动时,机械臂末端法兰会移动到对应的位置 ## 启动步骤 ```bash # 下面每个roslaunch都是在一个独立的窗口进行的 source ./devel/setup.bash # 启动相机 roslaunch orbbec_camera gemini2L.launch # 启动aruco_ros节点识别maker标 roslaunch aruco_ros single_my.launch # 显示aruco识别图像 rosrun image_view image_view image:=/aruco_single/result # 启动机械臂 roslaunch elite_controller elite_controller.launch robot:=ec66 robot_ip:=192.168.1.233 roslaunch elite_moveit elite_moveit.launch robot:=ec66 mode:=real # 启动 move_with_marker 机械臂运动节点 rosrun elite_example_control move_with_marker ``` ## 运行时报错 1. 报错:[ INFO] [1725794314.191761128]: Didn't receive robot state (joint angles) with recent timestamp within 1 seconds.Check clock synchronization if your are running ROS across multiple machines![ERROR] [1725794314.191838447]: Failed to fetch current robot state 解决:在回调函数中是无法直接通过getCurrentPose(end_effector_link).pose;获取末端执行器相对于底座的位置坐标的,所以需要再定义个订阅者,专门订阅末端执行器相对于底座的位置坐标关系,并将结果保存到一个变量中。然后在图像的回调函数中通过线程锁,安全访问该变量,就可以获得当前时刻的末端执行器相对于底座的位置坐标关系。此时就可以在图像的回调函数中做坐标变换的处理。具体的坐标相乘方式见move_with_marker.cpp源码 参考:[ROS 问题系列(一):Robot State相关](https://blog.csdn.net/bbtang5568/article/details/112419250)