Giter Site home page Giter Site logo

ros2_astra_camera's Introduction

ros2_astra_camera

Драйвер ROS2 для 3D-камер Orbbec.

Установите зависимости

ROS2

  • Пожалуйста, обратитесь к официальное руководство по установке ROS 2

Другие зависимости

  • Установите зависимости (будьте внимательны с вашим дистрибутивом ROS)
# Предполагая, что вы создали окружение ros, выполните следующие действия
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
  • Установите libuvc
git clone https://github.com/libuvc/libuvc.git
cd libuvc
mkdir build && cd build
cmake ... && make -j4
sudo make install
sudo ldconfig # Обновление библиотеки ссылок
  • Установите nlohmann/json

Нужно скачать репозиторий:

cd ~
git clone [email protected]:nlohmann/json.git

Далее переходим в репозиторий:

cd json
mkdir build
cd build
cmake ..
make
sudo make install

Начало работы

Примеры использования

  • Создание нового рабочего пространства ros2
mkdir -p ~/ros2_ws/src
  • Установите правила libusb
cd ~/ros2_ws/src/ros2_astra_camera/astra_camera/scripts
sudo bash install.sh
sudo udevadm control --reload-rules && sudo udevadm trigger
  • Компиляция
 cd ~/ros2_ws
source /opt/ros/galactic/setup.bash 
colcon build --event-handlers console_direct+ --cmake-args -DCMAKE_BUILD_TYPE=Release

Запуск камеры

  • В терминале 1
source ./install/setup.bash 
ros2 launch astra_camera astra.launch.xml```
  • В терминале 2
source /opt/ros/galactic/setup.bash 
source ./install/setup.bash 
rviz2

● List topics / services/ parameters (open a new terminal)

source /opt/ros/galactic/setup.bash 
ros2 topic list
ros2 service list 
ros2 param list

Select the topic you want to display

● Get camera parameters

ros2 service call /camera/get_camera_info astra_camera_msgs/srv/GetCameraInfo '{}'

● Check camera parameters, please refer to the ROS documentation for the meaning of the specific fields of the camera parameters camera info

ros2 topic echo /camera/depth/camera_info
ros2 topic echo /camera/color/camera_info

● Check device information

ros2 service call /camera/get_device_info astra_camera_msgs/srv/GetDeviceInfo '{}'

● Get the SDK version

ros2 service call /camera/get_sdk_version  astra_camera_msgs/srv/GetString "{}"

● Set/get (auto) exposure

 # Auto exposure switch. For setting the exposure manually, please turn off the auto exposure first
 ros2 service call /camera/set_color_auto_exposure std_srvs/srv/SetBool '{data: false}' 
 ros2 service call /camera/set_uvc_auto_exposure std_srvs/srv/SetBool '{data: false}'
 ros2 service call /camera/set_ir_auto_exposure std_srvs/srv/SetBool "{data: false}"
    
# Setting exposure values
ros2 service call /camera/set_ir_exposure astra_camera_msgs/srv/SetInt32 "{data: 2000}"
ros2 service call /camera/set_color_exposure astra_camera_msgs/srv/SetInt32 "{data: 2000}"
ros2 service call /camera/set_uvc_exposure astra_camera_msgs/srv/SetInt32 "{data: 2000}"
 # Get exposure
 ros2 service call /camera/get_ir_exposure astra_camera_msgs/srv/GetInt32 "{}"
 ros2 service call /camera/get_color_exposure astra_camera_msgs/srv/GetInt32 "{}"
 ros2 service call /camera/get_uvc_exposure astra_camera_msgs/srv/GetInt32 "{}"

● Set/get gain

# Get Gain
ros2 service call /camera/get_color_gain astra_camera_msgs/srv/GetInt32 '{}' # OpenNI camera
ros2 service call /camera/get_ir_gain astra_camera_msgs/srv/GetInt32 '{}' # OpenNI camera
ros2 service call /camera/get_uvc_gain astra_camera_msgs/srv/GetInt32 "{}" # UVC camera
 # Setting the gain
ros2 service call /camera/set_color_gain astra_camera_msgs/srv/SetInt32 "{data: 200}"
ros2 service call /camera/set_ir_gain astra_camera_msgs/srv/SetInt32 "{data: 200}"
ros2 service call /camera/set_uvc_gain astra_camera_msgs/srv/SetInt32 "{data: 200}"

● Set mirror mode

ros2 service call /camera/set_color_mirror std_srvs/srv/SetBool '{data: true}'
ros2 service call /camera/set_ir_mirror std_srvs/srv/SetBool '{data: true}'
ros2 service call /camera/set_depth_mirror std_srvs/srv/SetBool '{data: true}'
ros2 service call /camera/set_uvc_color_mirror std_srvs/srv/SetBool '{data: true}'

● Set/get (auto) white balance

ros2 service call /camera/get_color_auto_white_balance astra_camera_msgs/srv/GetInt32 '{}' # Return 0 or 1
ros2 service call /camera/set_color_auto_white_balance std_srvs/srv/SetBool '{data: false}'

● Turn on/off laser

ros2 service call /camera/set_laser_enable std_srvs/srv/SetBool '{data: true}' # Turn on
ros2 service call /camera/set_laser_enable std_srvs/srv/SetBool '{data: false}' #Turn off

● Turn on/off fan

 ros2 service call /camera/set_fan_mode std_srvs/srv/SetBool '{data: true}' #Turn on
 ros2 service call /camera/set_fan_mode std_srvs/srv/SetBool '{data: false}' # Turn off

● Turn LDP on/off

ros2 service call /camera/set_ldp_enable std_srvs/srv/SetBool '{data: true}'
ros2 service call /camera/set_ldp_enable std_srvs/srv/SetBool '{data: false}'

● Turn sensors on/off

ros2 service call  /camera/toggle_ir std_srvs/srv/SetBool "{data: true}"
ros2 service call  /camera/toggle_color std_srvs/srv/SetBool "{data: true}"
ros2 service call  /camera/toggle_depth std_srvs/srv/SetBool "{data: true}"
ros2 service call /camera/toggle_uvc_camera std_srvs/srv/SetBool "{data : true}"

Multi-Camera

● First, get the serial number of the camera, plug in the camera and run

ros2 run astra_camera list_devices_node

● Set the parameter device_num to the number of cameras

● Go to the ros2_astra_camera/launch/multi_xxx.launch and change the serial number. Currently, different cameras can only be distinguished by the serial number,

<launch>
    <!-- unique camera name-->
    <arg name="camera_name" default="camera"/>
    <!-- Hardware depth registration -->
    <arg name="3d_sensor" default="astra"/>
    <!-- stereo_s_u3, astrapro, astra -->
    <arg name="camera1_prefix" default="01"/>
    <arg name="camera2_prefix" default="02"/>
    <arg name="camera1_serila_number" default="ADA611300CE"/>
    <arg name="camera2_serila_number" default="sn123456789"/>
    <arg name="device_num" default="2"/>
    <node name="camera" pkg="astra_camera" type="cleanup_shm_node" output="screen"/>
    <include file="$(find-pkg-share astra_camera)/launch/$(arg 3d_sensor).launch.xml">
        <arg name="camera_name" value="$(var camera_name)_$(var camera1_prefix)"/>
        <arg name="serial_number" value="$(var camera1_serila_number)"/>
        <arg name="device_num" value="$(var device_num)"/>
    </include>

    <include file="$(ind-pkg-share astra_camera)/launch/$(var 3d_sensor).launch.xml">
        <arg name="camera_name" value="$(var camera_name)_$(var camera2_prefix)"/>
        <arg name="serial_number" value="$(var camera2_serila_number)"/>
        <arg name="device_num" value="$(var device_num)"/>
    </include>
    <node pkg="tf2_ros" exec="static_transform_publisher" name="camera_tf"
          args="0 0 0 0 0 0 camera01_link camera02_link"/>
</launch>
  • astra camera will use semaphore to do process synchronization, if the camera start fails, the semaphore file may be left in the /dev/shm, causing the next start to be stuck. Before launch, please run
ros2 run astra_camera cleanup_shm_node 

to clean up /dev/shm/.

  • Launch
ros2 launch astra_camera multi_astra.launch.xml

Use calibration camera parameter

  • Set camera info url, Go to xxx.launch
<launch>
    <!--...-->
    <arg name="ir_info_url" default="file:///you_ir_camera_calib_path/depth_camera.yaml"/>
    <arg name="color_info_url" default="file:///you_depth_camera_calib_path/rgb_camera.yaml"/>
    <!--...-->
</launch>
  • Calibration file should be like

Be careful the camera name The color camera is rgb_camera, the depth/IR camera name is ir_camera

image_width: 640
image_height: 480
# The camera name is fixed. The color camera is rgb_camera, the depth/IR camera name is ir_camera
camera_name: rgb_camera
camera_matrix:
  rows: 3
  cols: 3
  data: [517.301, 0, 326.785, 0, 519.291, 244.563, 0, 0, 1]
distortion_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [-0.41527, 0.31874, -0.00197, 0.00071, 0]
rectification_matrix:
  rows: 3
  cols: 3
  data: [0.999973, 0.00612598, -0.00406652, -0.00610201, 0.999964, 0.00588094, 0.0041024, -0.00585596, 0.999974 ]
projection_matrix:
  rows: 3
  cols: 4
  data: [517.301, 0, 326.785, -25.3167, 0, 519.291, 244.563, 0.282065, 0, 0, 1, 0.0777703]

Launch parameters

  • connection_delay, The delay time for reopening the device in seconds. Some devices would take longer time to initialize, such as Astra mini, so reopening the device immediately would causes firmware crashes when hot plug.

  • enable_point_cloud, Whether to enable point cloud.

  • enable_colored_point_cloud, Whether to enable RGB point cloud.

  • point_cloud_qos, [color|depth|ir]_qos,[color|depth|ir]_camera_info_qos, ROS2 Message QoS, can be set to SYSTEM_DEFAULT, DEFAULT,PARAMETER_EVENTS ,SERVICES_DEFAULT, PARAMETERS, SENSOR_DATA, corresponds to rmw_qos_profile_system_default, rmw_qos_profile_default, rmw_qos_profile_parameter_events rmw_qos_profile_services_default,rmw_qos_profile_parameters, SENSOR_DATA,Case-insensitive.

  • enable_d2c_viewer, Publish D2C overlay image (For Test only).

  • device_num,The number of devices, You need to fill in the number of devices when you need multiple cameras.

  • color_widthcolor_heightcolor_fps, color stream resolution and frame rate.

  • ir_widthir_heightir_fps,IR stream resolution and frame rate

  • depth_widthdepth_heightdepth_fps depth stream resolution and frame rate

  • enable_color, Whether to enable RGB camera, this parameter has no effect when the RGB camera is UVC protocol

  • enable_depth , Whether to enable depth camera

  • enable_ir, Whether to enable IR camera

  • depth_registration, Enables hardware depth to color alignment, requires RGB point cloud to open

  • depth_scale, Depth image zoom scale, e.g. set to 2 means aligning depth 320x240 to RGB 640x480

  • color_roi_xcolor_roi_ycolor_roi_widthcolor_roi_height, Whether to crop RGB images, the default is -1, which is only used when the RGB resolution is greater than the depth resolution and needs to be aligned. For example, if you need to align the depth 640x400 to RGB 640x480, you need to set color_roi_x: 0, color_roi_y: 0, color_roi_width: 640, color_roi_height: 400. roi_height: 400, which will crop the top 400 pixels of the RGB with a corresponding depth ROI.

  • color_depth_synchronization,Enable synchronization of RGB with depth

  • use_uvc_camera,if the RGB camera is UVC protocol, setting as true, UVC is the protocol that currently includes dabai, dabai_dcw etc.

  • uvc_product_id,pid of UVC camera

  • uvc_camera_format,Image format for uvc camera

  • uvc_retry_count sometimes the UVC protocol camera does not reconnect successfully when hot-plug, requiring many times to retry.

  • enable_publish_extrinsic Enable publish camera extrinsic.

  • oni_log_level, Log levels for OpenNI verbose/ info /warning/ error /none

  • oni_log_to_console, Whether to output OpenNI logs to the console

  • oni_log_to_file, Whether to output OpenNI logs to a file, by default it will save in Log folder under the path of the currently running program

DDS Tuning

The default DDS settings (Galactic) may not be efficient for data transmission. Different DDS settings will have different performance. Here we take CycloneDDS as an example. For detailed information, please refer toROS DDS Tuning

● Edit cyclonedds configuration file

sudo gedit /etc/cyclonedds/config.xml

Add

<?xml version="1.0" encoding="UTF-8"?>
<CycloneDDS xmlns="https://cdds.io/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="https://cdds.io/confighttps://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
    <Domain id="any">
        <General>
            <NetworkInterfaceAddress>lo</NetworkInterfaceAddress>
            <AllowMulticast>false</AllowMulticast>
        </General>
        <Internal>
            <MinimumSocketReceiveBufferSize>16MB</MinimumSocketReceiveBufferSize>
        </Internal>
        <Discovery>
            <ParticipantIndex>auto</ParticipantIndex>
            <MaxAutoParticipantIndex>30</MaxAutoParticipantIndex>
            <Peers>
                <Peer address="localhost"/>
            </Peers>
        </Discovery>
    </Domain>
</CycloneDDS>

● Set the environment variables, add to .zshrc or .bashrc

export ROS_DOMAIN_ID=42 # Numbers from 0 to 232
export ROS_LOCALHOST_ONLY=1
export CYCLONEDDS_URI=file:///etc/cyclonedds/config.xml

Tip:to understand why the maximum ROS_DOMAIN_ID is 232, please visit The ROS DOMAIN ID ● Increase UDP receive buffer size Edit

/etc/sysctl.d/10-cyclone-max.conf

Add

net.core.rmem_max=2147483647
net.core.rmem_default=2147483647

Frequently Asked Questions

● No point cloud or image displayed on Rviz2

  • The default QoS for outgoing messages is sense_data, i.e. Relaiblity Policy = Best Effort, please check if the Relaiblity Policy is set to Best Effort on Rviz2, and also check if there is any problem with the QoS setting of the message via ros2 topic info -v /xxx/topic

● No picture from multiple cameras

  • It is possible that the power supply is insufficient, do not connect all cameras to the same hub, and a powered hub is recommended

  • It is also possible that the resolution is too high, try turning it lower

  • If the color camera is an UVC camera, the serial number of the UVC may not be set

License

Copyright 2023 Orbbec Ltd.

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an " AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Other names and brands may be claimed as the property of others

ros2_astra_camera's People

Contributors

jian-dong avatar yyote avatar lixby03 avatar rafal-gorecki avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.