---
# System prepended metadata

title: GPSD

---

# GPSD
# setting gpsd
## check whehter device alive
```
stty -F /dev/ttyXXX ispeed 4800 && cat </dev/ttyXXX
```
ttyXXX usually is /dev/ttyUSB0 or /dev/ttyS0

using this commoand to check which /dev/ttyUSB is used
```
ls -l /dev/ttyUSB*
```
## install
```
sudo apt-get update
sudo apt install gpsd gpsd-clients
sudo apt-get install libgps-dev
```
## gpsd usage
### start gpsd
```
sudo systemctl start gpsd
```
### stop gbsd (if gpsd start failed, we need to stop and restart gpsd)

```
systemctl stop gpsd
systemctl stop gpsd.socket
```
### check gpsd status
```
sudo systemctl status gpsd
```
### setting priviledge to make non-root could use
```
sudo usermod -a -G dialout $USER
```
### setting configuration
in /etc/default/gpsd
```
# Devices gpsd should collect to at boot time.
# They need to be read/writeable, either by user gpsd or the group dialout.
DEVICES="/dev/ttyUSB0"

# Other options you want to pass to gpsd
GPSD_OPTIONS="-F /var/run/gpsd.socket"

# Automatically hot add/remove USB GPS devices via gpsdctl
USBAUTO="true"    
```
in /lib/systemd/system/gpsd.service
```
[Unit]
Description=GPS (Global Positioning System) Daemon
Requires=gpsd.socket
# Needed with chrony SOCK refclock
After=chronyd.service

[Service]
Type=forking
EnvironmentFile=-/etc/default/gpsd
ExecStart=/usr/sbin/gpsd $GPSD_OPTIONS $OPTIONS $DEVICES

[Install]
WantedBy=multi-user.target
Also=gpsd.socket
```
restart gpsd after setting

### testing
```
cgps
```
```
gpsmon
```

## convert gpsd message to autoware 
[gps_umd](https://github.com/swri-robotics/gps_umd.git)
after building and source, call
```
ros2 launch gpsd_client gpsd_client-launch.py
```
## rewrite autoware gnss.xml 
```
<launch>
  <arg name="launch_driver" default="true"/>
  <!--<arg name="gnss_receiver" default="ublox" description="ublox(default) or septentrio"/>-->
  <arg name="gnss_receiver" default="garmin" description="ublox(default), septentrio or <YOUR-GNSS-SENSOR>"/>

  <group>
    <push-ros-namespace namespace="gnss"/>

    <!-- Switch topic name -->
    <let name="navsatfix_topic_name" value="ublox/nav_sat_fix" if="$(eval &quot;'$(var gnss_receiver)'=='ublox'&quot;)"/>
    <let name="navsatfix_topic_name" value="septentrio/nav_sat_fix" if="$(eval &quot;'$(var gnss_receiver)'=='septentrio'&quot;)"/>
    <let name="navsatfix_topic_name" value="garmin/fix" if="$(eval &quot;'$(var gnss_receiver)'=='garmin'&quot;)/">
    <let name="orientation_topic_name" value="/autoware_orientation"/>

    <!-- Ublox Driver -->
    <group if="$(eval &quot;'$(var gnss_receiver)'=='ublox'&quot;)">
      <node pkg="ublox_gps" name="ublox" exec="ublox_gps_node" if="$(var launch_driver)" respawn="true" respawn_delay="1.0">
        <remap from="~/fix" to="~/nav_sat_fix"/>
        <param from="$(find-pkg-share ublox_gps)/c94_f9p_rover.yaml"/>
      </node>
    </group>

    <!-- Septentrio GNSS Driver -->
    <group if="$(eval &quot;'$(var launch_driver)' and '$(var gnss_receiver)'=='septentrio'&quot;)">
      <include file="$(find-pkg-share septentrio_gnss_driver)/launch/mosaic_x5_rover.launch.xml"/>
    </group>

    <!-- Garmin GNSS Driver -->
    <group if="$(eval &quot;'$(var launch_driver)' and '$(var gnss_receiver)'=='garmin'&quot;)">
      <include file="$(find-pkg-share gpsd_client)/launch/gpsd_client-launch.py"/>
    </group>

    <!-- NavSatFix to MGRS Pose -->
    <include file="$(find-pkg-share gnss_poser)/launch/gnss_poser.launch.xml">
      <arg name="input_topic_fix" value="$(var navsatfix_topic_name)"/>
      <arg name="input_topic_orientation" value="$(var orientation_topic_name)"/>

      <arg name="output_topic_gnss_pose" value="pose"/>
      <arg name="output_topic_gnss_pose_cov" value="pose_with_covariance"/>
      <arg name="output_topic_gnss_fixed" value="fixed"/>

      <arg name="use_gnss_ins_orientation" value="true"/>

      <arg name="gnss_frame" value="gnss_link"/>
    </include>
  </group>
</launch>


```

## rewrite gpsd_client-launch.py => remap 
```
"""Launch a talker and a listener in a component container."""

import os
import launch
from launch_ros.actions import ComposableNodeContainer
from launch_ros.descriptions import ComposableNode
import ament_index_python.packages

import yaml

gpsd_client_share_dir = ament_index_python.packages.get_package_share_directory('gpsd_client')
gpsd_client_params_file = os.path.join(gpsd_client_share_dir, 'config', 'gpsd_client.yaml')
with open(gpsd_client_params_file, 'r') as f:
    gpsd_client_params = yaml.safe_load(f)['gpsd_client']['ros__parameters']

def generate_launch_description():
    """Generate launch description with multiple components."""
    container = ComposableNodeContainer(
            name='fix_and_odometry_container',
            namespace='',
            package='rclcpp_components',
            executable='component_container',
            composable_node_descriptions=[
                ComposableNode(
                    package='gpsd_client',
                    plugin='gpsd_client::GPSDClientComponent',
                    name='gpsd_client',
                    parameters=[gpsd_client_params],
                    remappings=[('fix','garmin/fix')]
                    ),
                ComposableNode(
                    package='gps_tools',
                    plugin='gps_tools::UtmOdometryComponent',
                    name='utm_gpsfix_to_odometry_node')
            ],
            output='screen',
    )

    return launch.LaunchDescription([container,
            launch.actions.RegisterEventHandler(
                event_handler=launch.event_handlers.OnProcessExit(
                    target_action=container,
                    on_exit=[launch.actions.EmitEvent(
                        event=launch.events.Shutdown())]
                    ))
                ])


```
## reference
[install](https://gpsd.gitlab.io/gpsd/installation.html)