Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
Collapse
Brand Logo

ModalAI Forum

J

Judoor 0

@Judoor 0
Regular
Unfollow Follow
About
Posts
65
Topics
18
Shares
0
Groups
1
Followers
1
Following
0

Posts

Recent Best Controversial

  • Instruction to set a Static IP for wlan0 voxl2
    J Judoor 0

    Guide to Configure a Static IP Address with systemd-networkd
    I didn't find any guide on how to do it with the voxl2, even the static-ip service seem reserved for eth0 configuration, tell me, if i'm wrong i'll delete this.

    If you want to assign a static IP address to your wireless network interface (using systemd-networkd), follow this simple guide. In this example, we configure the wlan0 interface to use the static IP address 192.168.XX.XX.


    1. Check the Status of systemd-networkd

    Before starting, ensure that systemd-networkd is enabled and running:

    sudo systemctl status systemd-networkd
    

    If the service is not active, enable it:

    sudo systemctl enable systemd-networkd
    sudo systemctl start systemd-networkd
    

    2. Create the Configuration File for wlan0

    1. Navigate to the configuration directory:

      cd /etc/systemd/network/
      
    2. Create a configuration file for your wireless interface (e.g., 10-wlan0.network)

      sudo nano 10-wlan0.network
      
    3. Add the following lines to the file:

      [Match]
      Name=wlan0
      
      [Network]
      Address="192.168.XX.XX"/24
      Gateway="192.168.XX.1"
      DNS=8.8.8.8 1.1.1.1
      

      Explanation:

      • Name=wlan0: Specifies the target interface.
      • Address=192.168.XX.XX/24: Defines the IP address and subnet mask.
      • Gateway=192.168.XX.1: Sets the default gateway.
      • DNS=8.8.8.8 1.1.1.1: Configures the DNS servers.
    4. Save and close the file.


    3. Restart systemd-networkd

    Apply the new configuration by restarting the service:

    sudo systemctl restart systemd-networkd
    

    4. Verify the Configuration

    To verify that the IP address has been assigned to wlan0:

    ip addr show wlan0
    

    You should see the IP address 192.168.XX.XX assigned to the interface.


    5. Enable the Service at Boot

    Ensure that systemd-networkd is enabled to run at every boot:

    sudo systemctl enable systemd-networkd
    

    6. Reboot the System

    To confirm everything works correctly on startup:

    sudo reboot
    

    You have now successfully configured a static IP address for the wlan0 interface using systemd-networkd on your voxl2!

    Software Development

  • Error when launching mpa_to_ros2
    J Judoor 0

    @Zachary-Lowell-0 well it work now!
    I found these lines on another thread of the forum:

    sudo apt-get install voxl-ros2-foxy
    sudo apt-get install voxl-mpa-to-ros2
    voxl-configure-mpa-to-ros2
    source /opt/ros/foxy/mpa_to_ros2/install/setup.bash
    export ROS_HOME=/opt/foxy
    ros2 run voxl_mpa_to_ros2 voxl_mpa_to_ros2_node
    

    And everything worked first time ! So please put these line directly on the documentation cause I lost so much time with this install !

    ROS

  • Install libopencv on Starling 2
    J Judoor 0

    @Alex-Kushleyev @wilkinsaf Thanks for your answers! Actually, I've done something similar with docker, but I still have a few problems with the data format that mpa_to_ros sends. To address this, I did the following:

    #!/usr/bin/env python
    import rospy
    import cv2
    import numpy as np
    from sensor_msgs.msg import Image, CameraInfo
    from cv_bridge import CvBridge, CvBridgeError
    import yaml
    
    class CamImageConverter:
        def __init__(self):
            self.bridge = CvBridge()
            
            # Subscribers
            rospy.Subscriber("/drone/tof_depth/image_raw", Image, self.depth_callback)
            rospy.Subscriber("/drone/hires/image_raw", Image, self.rgb_callback)
            rospy.Subscriber("/drone/tracking_front/image_raw", Image, self.tracking_callback)
            
            # Publishers
            self.depth_pub = rospy.Publisher("/drone/tof_depth/image", Image, queue_size=1000)
            
            self.rgb_pub = rospy.Publisher("/drone/hires/image", Image, queue_size=1000)
            self.rgb_info_pub = rospy.Publisher("/drone/hires/camera_info", CameraInfo, queue_size=1000)
            self.tracking_pub = rospy.Publisher("/drone/tracking_front/image", Image, queue_size=1000)
            self.tracking_info_pub = rospy.Publisher("/drone/tracking_front/camera_info", CameraInfo, queue_size=1000)
    
            self.camera_info_msg = self.load_camera_info("/root/ros_ws/src/cam_converter/calibration/ost.yaml")
    
            rospy.Timer(rospy.Duration(1.0 / 30), self.publish_tracking_info)
            rospy.Timer(rospy.Duration(1.0 / 30), self.publish_rgb_info)
    
        def load_camera_info(self, filename):
            with open(filename, "r") as file:
                calib_data = yaml.safe_load(file)
                camera_info_msg = CameraInfo()
                camera_info_msg.height = calib_data["image_height"]
                camera_info_msg.width = calib_data["image_width"]
                camera_info_msg.distortion_model = calib_data["distortion_model"]
                camera_info_msg.D = calib_data["distortion_coefficients"]["data"]
                camera_info_msg.K = calib_data["camera_matrix"]["data"]
                camera_info_msg.R = calib_data["rectification_matrix"]["data"]
                camera_info_msg.P = calib_data["projection_matrix"]["data"]
                return camera_info_msg
    
        def depth_callback(self, msg):
            try:
                # Convertir le message ROS en une image OpenCV
                raw_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding="mono8")
    
                # Normalisation de l'image pour améliorer la qualité
                depth_image = cv2.normalize(raw_image, None, 0, 65535, cv2.NORM_MINMAX).astype(np.uint16)
    
                # Publier l'image convertie
                converted_msg = self.bridge.cv2_to_imgmsg(depth_image, encoding="16UC1")
                converted_msg.header.frame_id = 'tof_link'
                converted_msg.header.stamp = rospy.Time.now()
                self.depth_pub.publish(converted_msg)
    
            except CvBridgeError as e:
                rospy.logerr("CvBridge Error: {0}".format(e))
    
        def rgb_callback(self, msg):
            try:
                # Convertir le message ROS en une image OpenCV
                raw_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding="passthrough")
    
                # Conversion YUV422 ou NV12 en RGB8
                if msg.encoding == "yuv422":
                    rgb_image = cv2.cvtColor(raw_image, cv2.COLOR_YUV2RGB_Y422)
                elif msg.encoding == "nv12":
                    yuv_image = np.frombuffer(msg.data, dtype=np.uint8).reshape((msg.height * 3 // 2, msg.width))
                    rgb_image = cv2.cvtColor(yuv_image, cv2.COLOR_YUV2RGB_NV12)
                else:
                    rospy.logerr("Unsupported encoding: {}".format(msg.encoding))
                    return
    
                # Redimensionner l'image RGB pour qu'elle ait la même taille que l'image ToF (240x180)
                resized_rgb_image = cv2.resize(rgb_image, (180, 240), interpolation=cv2.INTER_LINEAR)
    
                # Publier l'image convertie et redimensionnée
                converted_msg = self.bridge.cv2_to_imgmsg(resized_rgb_image, encoding="rgb8")
                converted_msg.header.frame_id = 'hires_link'
                converted_msg.header.stamp = rospy.Time.now()
                self.rgb_pub.publish(converted_msg)
    
            except CvBridgeError as e:
                rospy.logerr("CvBridge Error: {0}".format(e))
    
        def tracking_callback(self, msg):
            try:
                # Convertir le message ROS en une image OpenCV
                raw_image = self.bridge.imgmsg_to_cv2(msg, desired_encoding="passthrough")
    
                # Redimensionner l'image RGB pour qu'elle ait la même taille que l'image ToF (240x180)
                resized_image = cv2.resize(raw_image, (180, 240), interpolation=cv2.INTER_LINEAR)
    
                # Publier l'image convertie et redimensionnée
                converted_msg = self.bridge.cv2_to_imgmsg(resized_image)
                converted_msg.header.frame_id = 'tracking_front_link'
                converted_msg.header.stamp = rospy.Time.now()
                self.tracking_pub.publish(converted_msg)
    
            except CvBridgeError as e:
                rospy.logerr("CvBridge Error: {0}".format(e))
    
        def publish_rgb_info(self, event):
            self.camera_info_msg.header.stamp = rospy.Time.now()
            self.camera_info_msg.header.frame_id = 'hires_link'
            self.rgb_info_pub.publish(self.camera_info_msg)
    
        def publish_tracking_info(self, event):
            camera_info_msg = CameraInfo()
            camera_info_msg.header.frame_id = 'tracking_front_link'
            camera_info_msg.header.stamp = rospy.Time.now()
    
            camera_info_msg.height = 240
            camera_info_msg.width = 180
            camera_info_msg.distortion_model = 'plumb_bob'
            camera_info_msg.D = [5.0234834483837899e-02, 3.2967878240805777e-02, -1.6468916528340826e-02, 1.8155367951008903e-03]
            camera_info_msg.K = [4.6177826259848081e+02, 0., 6.1505488982380564e+02, 0., 4.6160870283061041e+02, 4.1065345867690684e+02, 0., 0., 1.]
            camera_info_msg.R = [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0]
            camera_info_msg.P = [4.6177826259848081e+02, 0., 6.1505488982380564e+02, 0., 0., 4.6160870283061041e+02, 4.1065345867690684e+02, 0., 0., 0., 1., 0.]
    
            self.tracking_info_pub.publish(camera_info_msg)
       
        
    def main(): 
        rospy.init_node('cam_image_converter', anonymous=True)
        CamImageConverter()
        rospy.spin()
    
    if __name__ == '__main__':
        main()
    

    I don't know if this is the right way to do it, but it seems to work. Do you have any suggestions for implementing this directly on the Voxl2?

    Also, I have a few problems with camera calibrations and the drone model. Do you have any files that contain all the data for the cameras (ToF, tracking, and high-resolution) and a model of the drone that I can use in RViz and Gazebo? This could really help me.

    For more context, I'm trying to implement this project for Autonomous SLAM with ROS. Has anyone already used RTAB-Map on this drone? Do you have any advice to solve this problem?

    Thank you for your help

    VOXL 2 starlingv2 ros opencv docker

  • Instruction to set a Static IP for wlan0 voxl2
    J Judoor 0

    Another way to do it, maybe more in line with the way modal ai intended it is this :

    Update dhcpcd.conf for Static IP
    Open the dhcpcd.conf file for editing:

    nano /etc/dhcpcd.conf
    

    Add the following lines at the end of the file to configure a static IP for wlan0:

    interface wlan0
    static ip_address=192.168.XX.XX/24
    static routers=192.168.XX.1
    static domain_name_servers=8.8.8.8 1.1.1.1
    

    Explanation:

    interface wlan0: Specifies the network interface to configure.
    static ip_address=192.168.XX.XX/24: Assigns the static IP and subnet mask.
    static routers=192.168.XX.1: Sets the gateway address.
    static domain_name_servers=8.8.8.8 1.1.1.1: Configures DNS servers (Google and Cloudflare in this case).
    Save and exit the file.

    Restart dhcpcd Service
    Apply the changes by restarting the dhcpcd service:

    systemctl enable dhcpcd
    systemctl restart dhcpcd
    
    Software Development
  • Login

  • Don't have an account? Register

  • Login or register to search.
  • First post
    Last post
0
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups